Android 10, uygulamanızı etkileyebilecek davranış değişiklikleri içerir. Bu sayfada listelenen değişiklikler, uygulamanın targetSdkVersion
'ünden bağımsız olarak Android 10'da çalışırken uygulamanız için geçerlidir. Uygulamanızı test etmeniz ve bu değişiklikleri düzgün şekilde desteklemek için gerektiği şekilde değiştirmeniz gerekir.
Uygulamanızın targetSdkVersion özelliği 29
veya daha yeni bir sürümse ek değişiklikleri de desteklemeniz gerekir. Ayrıntılar için 29 yaş ve üzeri kullanıcıları hedefleyen uygulamalarda davranış değişiklikleri başlıklı makaleyi okuyun.
Not: Android 10, bu sayfada listelenen değişikliklere ek olarak aşağıdakiler de dahil olmak üzere çok sayıda gizlilik odaklı değişiklik ve kısıtlama sunar:
- Cihaz konumuna arka planda erişim
- Arka plan etkinliği başlar
- Kişilerle ilgili yakınlık bilgileri
- MAC adresinin rastgele seçilmesi
- Kamera meta verileri
- İzin modeli
Bu değişiklikler tüm uygulamaları etkiler ve kullanıcı gizliliğini artırır. Bu değişiklikleri nasıl destekleyeceğiniz hakkında daha fazla bilgi edinmek için Gizlilik değişiklikleri sayfasına bakın.
SDK olmayan arayüz kısıtlamaları
Platform, uygulama kararlılığı ve uyumluluğunu sağlamak için uygulamanızın Android 9'da (API düzeyi 28) kullanabileceği SDK dışı arayüzleri kısıtlamaya başladı. Android 10, Android geliştiricilerle yapılan ortak çalışmalara ve en son dahili testlere dayalı olarak kısıtlanmış SDK dışı arayüzlerin güncellenmiş listelerini içerir. Hedefimiz, SDK dışı arayüzleri kısıtlamadan önce herkese açık alternatiflerin kullanıma sunulduğundan emin olmaktır.
Android 10'u (API düzeyi 29) hedeflemeyecekseniz bu değişikliklerin bazıları sizi hemen etkilemeyebilir. Ancak şu anda bazı SDK dışı arayüzleri kullanabilseniz de (uygulamanızın hedef API düzeyine bağlı olarak) SDK dışı herhangi bir yöntem veya alanı kullanmak her zaman uygulamanızın bozulma riskini artırır.
Uygulamanızın SDK dışı arayüz kullanıp kullanmadığından emin değilseniz bunu öğrenmek için uygulamanızı test edebilirsiniz. Uygulamanız SDK dışı arayüzlere dayanıyorsa SDK alternatiflerine geçiş planlamaya başlamanız gerekir. Bununla birlikte, bazı uygulamaların SDK dışı arayüzleri kullanmanın geçerli kullanım alanları olduğunu biliyoruz. Uygulamanızdaki bir özellik için SDK dışı arayüz kullanmanın alternatifini bulamıyorsanız yeni bir herkese açık API isteğinde bulunmanız gerekir.
Daha fazla bilgi edinmek için Android 10'daki SDK dışı arayüz kısıtlamalarında yapılan güncellemeler ve SDK dışı arayüzlerde kısıtlamalar başlıklı makaleleri inceleyin.
Hareketle Gezinme
Android 10'dan itibaren kullanıcılar cihazda hareketle gezinmeyi etkinleştirebilir. Kullanıcı hareketle gezinmeyi etkinleştirirse bu, API düzeyi 29'u hedefleyip hedeflemediğine bakılmaksızın cihazdaki tüm uygulamaları etkiler. Örneğin, kullanıcı ekranın kenarından içeri doğru kaydırırsa sistem bu hareketi Geri gezinme olarak yorumlar. Ancak bir uygulama, ekranın belirli bölümleri için bu hareketi özel olarak geçersiz kılarsa sistem hareketi farklı şekilde yorumlar.
Uygulamanızın hareketle gezinmeyle uyumlu olması için uygulama içeriğini kenardan kenara genişletmeniz ve çakışan hareketleri uygun şekilde ele almanız gerekir. Bilgi için Hareketle gezinme belgelerine bakın.
NDK
Android 10, aşağıdaki NDK değişikliklerini içerir.
Paylaşılan nesneler metin taşıma işlemleri içeremez
Android 6.0 (API düzeyi 23), paylaşılan nesnelerde metin taşıma işlemlerinin kullanılmasına izin vermedi. Kod olduğu gibi yüklenmeli ve değiştirilmemelidir. Bu değişiklik, uygulama yükleme sürelerini ve güvenliğini iyileştirir.
SELinux, Android 10 veya sonraki sürümleri hedefleyen uygulamalarda bu kısıtlamayı uygular. Bu uygulamalar, metin taşıma işlemleri içeren ortak nesneleri kullanmaya devam ederse çalışmama riski yüksektir.
Bionic kitaplıklarında ve dinamik bağlayıcı yollarında yapılan değişiklikler
Android 10'dan itibaren, bazı yollar normal dosya yerine sembolik bağlantılardır. Yolların normal dosya olmasından yararlanan uygulamalar bozulabilir:
/system/lib/libc.so
->/apex/com.android.runtime/lib/bionic/libc.so
/system/lib/libm.so
->/apex/com.android.runtime/lib/bionic/libm.so
/system/lib/libdl.so
->/apex/com.android.runtime/lib/bionic/libdl.so
/system/bin/linker
->/apex/com.android.runtime/bin/linker
Bu değişiklikler, dosyanın 64 bit varyantları için de geçerlidir. Bu varyantlarda lib/
, lib64/
ile değiştirilir.
Uyumluluk için sembolik bağlantılar eski yollarda sağlanır. Örneğin, /system/lib/libc.so
, /apex/com.android.runtime/lib/bionic/libc.so
için kısayoldur. Bu nedenle dlopen(“/system/lib/libc.so”)
çalışmaya devam eder ancak uygulamalar, /proc/self/maps
veya benzeri bir yöntemle yüklü kitaplıkları incelemeye çalıştıklarında farkı fark ederler. Bu durum normal değildir ancak bazı uygulamaların, bilgisayar korsanlığı önleme süreci kapsamında bunu yaptığını tespit ettik. Bu durumda, /apex/…
yolları Bionic dosyaları için geçerli yollar olarak eklenmelidir.
Yalnızca çalıştırılabilir bellekle eşlenen sistem ikili dosyaları/kitaplıkları
Android 10'dan itibaren, sistem ikili dosyalarının ve kitaplıklarının yürütülebilir segmentleri, kod yeniden kullanma saldırılarına karşı bir güçlendirme tekniği olarak bellekte salt yürütme (okunamaz) olarak eşlenir. Uygulamanız, hata, güvenlik açığı veya kasıtlı bellek denetimi nedeniyle salt yürütme olarak işaretlenmiş bellek segmentlerinde okuma işlemleri gerçekleştirirse sistem uygulamanıza bir SIGSEGV
sinyali gönderir.
Bu davranışın kilitlenmeye neden olup olmadığını /data/tombstones/
'teki ilgili mezar taşı dosyasını inceleyerek belirleyebilirsiniz. Yalnızca yürütmeyle ilgili kilitlenmeler aşağıdaki iptal mesajını içerir:
Cause: execute-only (no-read) memory access error; likely due to data in .text.
Bellek denetimi gibi işlemleri gerçekleştirmek için bu sorunu gidermek amacıyla mprotect()
çağrısı yaparak salt yürütme segmentlerini okuma+yürütme olarak işaretleyebilirsiniz. Ancak bu erişim izni ayarı, uygulamanız ve kullanıcılarınız için daha iyi koruma sağladığından, daha sonra yalnızca yürütme olarak ayarlamanızı önemle tavsiye ederiz.
Güvenlik
Android 10 aşağıdaki güvenlik değişikliklerini içerir.
TLS 1.3 varsayılan olarak etkindir
Android 10 ve sonraki sürümlerde TLS 1.3, tüm TLS bağlantıları için varsayılan olarak etkindir. TLS 1.3 uygulamamızla ilgili birkaç önemli ayrıntı aşağıda verilmiştir:
- TLS 1.3 şifre paketleri özelleştirilemez. Desteklenen TLS 1.3 şifre paketleri, TLS 1.3 etkinleştirildiğinde her zaman etkindir.
setEnabledCipherSuites()
çağrısı yapılarak devre dışı bırakma girişimleri yoksayılır. - TLS 1.3 pazarlığı yapılırken oturum önbelleği oturumlara eklenmeden önce
HandshakeCompletedListener
nesneleri çağrılır. (TLS 1.2 ve önceki sürümlerde bu nesneler, oturumlar oturum önbelleğine eklendikten sonra çağrılır.) SSLEngine
örnekleri Android'in önceki sürümlerindeSSLHandshakeException
hatası oluşturduğu bazı durumlarda, bu örnekler Android 10 ve sonraki sürümlerde bunun yerineSSLProtocolException
hatası oluşturur.- 0-RTT modu desteklenmez.
Dilerseniz SSLContext.getInstance("TLSv1.2")
numaralı telefonu arayarak TLS 1.3'ün devre dışı bırakıldığı bir SSLContext
alabilirsiniz.
Ayrıca, uygun bir nesnede setEnabledProtocols()
işlevini çağırarak protokol sürümlerini bağlantı bazında etkinleştirebilir veya devre dışı bırakabilirsiniz.
SHA-1 ile imzalanan sertifikalara TLS'de güvenilmez
Android 10'da, SHA-1 karma algoritmasını kullanan sertifikalara TLS bağlantılarında güvenilmez. Kök CA'lar 2016'dan beri bu tür sertifika yayınlamıyor ve Chrome'da veya diğer büyük tarayıcılarda artık bunlara güvenilmiyor.
Bağlantı, SHA-1 kullanan bir sertifika sunan bir siteye ise bağlantı kurma girişimleri başarısız olur.
KeyChain davranışı değişiklikleri ve iyileştirmeleri
Google Chrome gibi bazı tarayıcılar, TLS sunucusu bir TLS el sıkışması kapsamında sertifika isteği mesajı gönderdiğinde kullanıcıların sertifika seçmesine olanak tanır. Android 10'dan itibaren, KeyChain
nesneleri, kullanıcılara sertifika seçim istemi göstermek için KeyChain.choosePrivateKeyAlias()
çağrılırken sertifika verenleri ve temel spesifikasyon parametrelerini dikkate alır. Özellikle bu istem, sunucu özelliklerine uymayan seçenekler içermez.
Kullanıcı tarafından seçilebilecek sertifika yoksa (ör. sunucu spesifikasyonuyla eşleşen sertifika yoksa veya cihazda yüklü sertifika yoksa) sertifika seçim istemi hiç gösterilmez.
Ayrıca, Android 10 veya sonraki sürümlerde anahtarları ya da CA sertifikalarını bir KeyChain
nesnesine içe aktarmak için cihaz ekran kilidinin olması gerekmez.
Diğer TLS ve kriptografi değişiklikleri
TLS ve kriptografi kitaplıklarında Android 10'da geçerli olacak birkaç küçük değişiklik yapıldı:
- AES/GCM/NoPadding ve ChaCha20/Poly1305/NoPadding şifreleri,
getOutputSize()
'ten daha doğru arabellek boyutları döndürür. TLS_FALLBACK_SCSV
şifre paketi, maksimum protokolü TLS 1.2 veya sonraki sürümler olan bağlantı denemelerinden çıkarılır. TLS sunucu uygulamalarında yapılan iyileştirmeler nedeniyle, TLS harici yedekleme denemelerini önermiyoruz. Bunun yerine TLS sürüm pazarlığı yapmanızı öneririz.- ChaCha20-Poly1305, ChaCha20/Poly1305/NoPadding için bir takma addır.
- Sonunda nokta bulunan ana makine adları geçerli SNI ana makine adları olarak kabul edilmez.
- Sertifika yanıtları için imzalama anahtarı seçilirken
CertificateRequest
içindeki supported_signature_algorithms uzantısına uyulur. - Android Keystore'dakiler gibi opak imzalama anahtarları, TLS'de RSA-PSS imzalarıyla kullanılabilir.
Kablosuz Doğrudan Bağlantı yayınları
Android 10'da Kablosuz Direkt ile ilgili aşağıdaki yayınlar kalıcı değildir:
Uygulamanız, yapışkan oldukları için bu yayınları kayıt sırasında alıyorduysa bilgileri almak için başlatma sırasında uygun get()
yöntemini kullanın.
Kablosuz duyarlılığı özellikleri
Android 10, Wi-Fi Aware veri yollarını kullanarak TCP/UDP soketi oluşturmayı kolaylaştırmak için destek ekler. ServerSocket
adresine bağlanan bir TCP/UDP soketi oluşturmak için istemci cihazın sunucunun IPv6 adresini ve bağlantı noktasını bilmesi gerekir. Daha önce bu bilgilerin bant dışı olarak (ör. BT veya Wi-Fi Aware katman 2 mesajları kullanılarak) iletilmesi veya mDNS gibi diğer protokoller kullanılarak bant içinde keşfedilmesi gerekiyordu. Android 10 ile bilgiler, ağ kurulumunun bir parçası olarak iletilebilir.
Sunucu aşağıdakilerden birini yapabilir:
- Bir
ServerSocket
başlatın ve kullanılacak bağlantı noktasını ayarlayın veya alın. - Wi-Fi Aware ağ isteği kapsamında bağlantı noktası bilgilerini belirtin.
Aşağıdaki kod örneğinde, ağ isteği kapsamında bağlantı noktası bilgilerinin nasıl belirtileceği gösterilmektedir:
Kotlin
val ss = ServerSocket() val ns = WifiAwareNetworkSpecifier.Builder(discoverySession, peerHandle) .setPskPassphrase("some-password") .setPort(ss.localPort) .build() val myNetworkRequest = NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE) .setNetworkSpecifier(ns) .build()
Java
ServerSocket ss = new ServerSocket(); WifiAwareNetworkSpecifier ns = new WifiAwareNetworkSpecifier .Builder(discoverySession, peerHandle) .setPskPassphrase(“some-password”) .setPort(ss.getLocalPort()) .build(); NetworkRequest myNetworkRequest = new NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE) .setNetworkSpecifier(ns) .build();
Ardından istemci, sunucu tarafından sağlanan IPv6 ve bağlantı noktasını almak için bir Wi-Fi Aware ağ isteği gerçekleştirir:
Kotlin
val callback = object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { ... } override fun onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) { ... } override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) { ... val ti = networkCapabilities.transportInfo if (ti is WifiAwareNetworkInfo) { val peerAddress = ti.peerIpv6Addr val peerPort = ti.port } } override fun onLost(network: Network) { ... } }; connMgr.requestNetwork(networkRequest, callback)
Java
callback = new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { ... } @Override public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) { ... } @Override public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) { ... TransportInfo ti = networkCapabilities.getTransportInfo(); if (ti instanceof WifiAwareNetworkInfo) { WifiAwareNetworkInfo info = (WifiAwareNetworkInfo) ti; Inet6Address peerAddress = info.getPeerIpv6Addr(); int peerPort = info.getPort(); } } @Override public void onLost(Network network) { ... } }; connMgr.requestNetwork(networkRequest, callback);
Go cihazlarda SYSTEM_ALERT_WINDOW
Android 10 (Go sürümü) cihazlarda çalışan uygulamalar SYSTEM_ALERT_WINDOW
iznine sahip olamaz. Bunun nedeni, yer paylaşımı pencerelerinin çok fazla bellek kullanmasıdır. Bu durum özellikle düşük bellekli Android cihazların performansı için zararlı olur.
Android 9 veya daha eski bir sürümü çalıştıran Go sürümü bir cihazda çalışan bir uygulama SYSTEM_ALERT_WINDOW
izni alırsa cihaz Android 10'a yükseltilse bile uygulama bu izni korur. Ancak, bu izni henüz almamış uygulamalara cihaz yükseltildikten sonra izin verilemez.
Go cihazındaki bir uygulama ACTION_MANAGE_OVERLAY_PERMISSION
işlemini içeren bir intent gönderirse sistem isteği otomatik olarak reddeder ve kullanıcıyı, cihazı yavaşlattığı için izin verilmediğini belirten bir Ayarlar ekranına yönlendirir. Go cihazındaki bir uygulama Settings.canDrawOverlays()
çağrısı yaparsa yöntem her zaman yanlış değerini döndürür. Bu kısıtlamalar, cihaz Android 10'a yükseltilmeden önce SYSTEM_ALERT_WINDOW
izni alan uygulamalar için geçerli değildir.
Eski Android sürümlerini hedefleyen uygulamalarla ilgili uyarılar
Android 10 veya sonraki sürümleri çalıştıran cihazlar, Android 5.1 (API düzeyi 22) veya önceki sürümleri hedefleyen bir uygulamayı ilk kez çalıştırdıklarında kullanıcıları uyarır. Uygulamanın çalışması için kullanıcının izin vermesi gerekiyorsa uygulamanın ilk kez çalışmasına izin verilmeden önce kullanıcıya uygulamanın izinlerini ayarlama fırsatı da verilir.
Google Play'in hedef API koşulları nedeniyle kullanıcılar bu uyarıları yalnızca yakın zamanda güncellenmemiş bir uygulamayı çalıştırdıklarında görür. Diğer mağazalar üzerinden dağıtılan uygulamalar için benzer hedef API koşulları 2019'da yürürlüğe girecek. Bu şartlar hakkında daha fazla bilgi için 2019'da hedef API düzeyi şartlarını genişletme başlıklı makaleyi inceleyin.
SHA-2 CBC şifre paketleri kaldırıldı
Aşağıdaki SHA-2 CBC şifre paketleri platformdan kaldırıldı:
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
Bu şifre paketleri, GCM kullanan benzer şifre paketlerine kıyasla daha az güvenlidir ve çoğu sunucu bu şifre paketlerinin GCM ve CBC varyantlarını ya destekler ya da hiçbirini desteklemez.
Uygulama kullanımı
Android 10, uygulama kullanımıyla ilgili aşağıdaki davranış değişikliklerini sunar:
HTTPS bağlantısı değişiklikleri
Android 10 çalıştıran bir uygulama null
öğesini setSSLSocketFactory()
'ye aktarırsa IllegalArgumentException
meydana gelir. Önceki sürümlerde null
değerini setSSLSocketFactory()
içine göndermek, mevcut varsayılan fabrikayı göndermekle aynı etkiye sahipti.
android.preference kitaplığının desteği sonlandırıldı
android.preference
kitaplığının desteği Android 10'dan itibaren sonlandırıldı.
Geliştiriciler bunun yerine Android Jetpack'in bir parçası olan AndroidX tercih kitaplığını kullanmalıdır. Taşıma ve geliştirmeye yardımcı olacak ek kaynaklar için güncellenmiş Ayarlar Kılavuzu'na, herkese açık örnek uygulamamıza ve referans dokümanlarımıza göz atın.
ZIP dosyası yardımcı programı kitaplığındaki değişiklikler
Android 10, ZIP dosyalarını işleyen java.util.zip
paketindeki sınıflarda aşağıdaki değişiklikleri sunar. Bu değişiklikler, kitaplığın davranışını Android ile java.util.zip
kullanan diğer platformlar arasında daha tutarlı hale getirir.
Şişirme
Önceki sürümlerde, Inflater
sınıfındaki bazı yöntemler end()
çağrısından sonra çağrılırsa IllegalStateException
hatası fırlatıyordu.
Android 10'da bu yöntemler bunun yerine NullPointerException
değerini döndürür.
ZipFile
Android 10 ve sonraki sürümlerde, File
, int
ve Charset
türündeki bağımsız değişkenleri alan ZipFile
sınıfının kurucusu, sağlanan ZIP dosyası dosya içermiyorsa ZipException
hatası atmaz.
ZipOutputStream
Android 10 ve sonraki sürümlerde, ZipOutputStream
sınıfındaki finish()
yöntemi, dosya içermeyen bir ZIP dosyası için çıkış akışı yazmaya çalışırsa ZipException
hatası atmaz.
Kamera değişiklikleri
Kamera kullanan birçok uygulama, cihaz dikey yapılandırmadaysa fiziksel cihazın da Kamera yönü bölümünde açıklandığı gibi dikey yönde olduğunu varsayar. Bu, geçmişte güvenli bir varsayımdı ancak katlanabilir cihazlar gibi mevcut form faktörlerinin genişlemesiyle bu durum değişti. Bu cihazlarda bu varsayım, kamera vizörünün yanlış döndürülmüş veya ölçeklendirilmiş (veya her ikisi birden) görüntülenmesine neden olabilir.
API düzeyi 24 veya üstünü hedefleyen uygulamalar, android:resizeableActivity
değerini açıkça ayarlamalı ve çoklu pencere işlevini yönetmek için gerekli işlevleri sağlamalıdır.
Pil kullanımı takibi
Android 10'dan itibaren SystemHealthManager
, önemli bir şarj işleminden sonra cihazın fişi çekildiğinde pil kullanımı istatistiklerini sıfırlar. Genel olarak, önemli bir şarj etkinliği şu durumlarda gerçekleşir: Cihaz tamamen şarj olmuştur veya cihazın şarjı çoğunlukla bitmişken çoğunlukla şarj olmuştur.
Android 10'dan önce, pil seviyesinde ne kadar az değişiklik olursa olsun, cihaz fişten çekildiğinde pil kullanımı istatistikleri sıfırlanıyordu.
Android Beam'in kullanımdan kaldırılması
Android 10'da, Near Field Communication (NFC) üzerinden cihazlar arasında veri paylaşımı başlatmaya yarayan eski bir özellik olan Android Beam'i kullanımdan kaldırıyoruz. Ayrıca, ilgili NFC API'lerinden birkaçını da kullanımdan kaldırıyoruz. Android Beam, kullanmak isteyen cihaz üreticisi iş ortakları tarafından isteğe bağlı olarak kullanılabilir ancak artık etkin olarak geliştirilmemektedir. Bununla birlikte Android, diğer NFC özelliklerini ve API'lerini desteklemeye devam edecek. Etiketlerden veri okuma ve ödeme gibi kullanım alanları da beklendiği gibi çalışmaya devam edecektir.
java.math.BigDecimal.stripTrailingZeros() davranışında değişiklik
BigDecimal.stripTrailingZeros()
artık giriş değeri sıfır olduğunda sonundaki sıfırları özel durum olarak korumaz.
java.util.regex.Matcher ve Pattern davranışında yapılan değişiklikler
split()
sonucu, girişin başında sıfır genişlikli bir eşleşme olduğunda artık boş bir String
ile başlamayacak şekilde değiştirildi
(""). Bu durum String.split()
'ü de etkiler. Örneğin, "x".split("")
artık {"x"}
döndürüyor. Android'in eski sürümlerinde ise {"", "x"}
döndürüyordu.
"aardvark".split("(?=a)"
artık {"", "a", "ardv", "ark"}
yerine {"a", "ardv", "ark"}
döndürüyor.
Geçersiz bağımsız değişkenler için istisna davranışı da iyileştirildi:
appendReplacement(StringBuffer, String)
artıkString
yerineIndexOutOfBoundsException
yerineIllegalArgumentException
atıyor. DeğişimString
$
ile bitiyorsa artık aynı istisna atılır. Daha önce bu senaryoda istisna atılmamıştı.replaceFirst(null)
,NullPointerException
hatası verirse artıkMatcher
üzerindereset()
'ı çağırmıyor.NullPointerException
artık eşleşme olmadığında da atılır. Daha önce yalnızca eşleşme olduğunda atılıyordu.start(int group)
,end(int group)
vegroup(int group)
, grup dizini sınırları dışındaysa artık daha genel birIndexOutOfBoundsException
hatası veriyor. Daha önce bu yöntemlerArrayIndexOutOfBoundsException
hatası veriyordu.
GradientDrawable için varsayılan açı artık TOP_BOTTOM
Android 10'da XML'de bir GradientDrawable
tanımlarsanız ve açı ölçümü sağlamazsanız degrade yönü varsayılan olarak TOP_BOTTOM
olur.
Bu, varsayılan olarak LEFT_RIGHT
olan Android'in önceki sürümlerinden farklıdır.
Geçici çözüm olarak, AAPT2'nin en son sürümüne güncellerseniz araç, açı ölçümü belirtilmemişse eski uygulamalar için 0 açı ölçümü ayarlar.
Varsayılan SUID kullanılarak serileştirilmiş nesneler için günlük kaydı
Android 7.0 (API düzeyi 24) sürümünden itibaren platform, serileştirilebilir nesneler için varsayılan serialVersionUID
değerinde bir düzeltme yaptı. Bu düzeltme, API düzeyi 23 veya daha düşük olan uygulamaları etkilemedi.
Android 10'dan itibaren, API düzeyi 23 veya altını hedefleyen ve eski, yanlış, varsayılan serialVersionUID
değerini kullanan uygulamalar için sistem bir uyarı günlüğe kaydeder ve kod düzeltmesi önerir.
Sistem, aşağıdaki koşulların tümü geçerliyse uyarı günlüğe kaydeder:
- Uygulama, API düzeyi 23 veya altını hedefliyor.
- Sınıf serileştirilir.
- Serileştirilmiş sınıf, açıkça bir
serialVersionUID
ayarlamak yerine varsayılanserialVersionUID
kullanır. - Varsayılan
serialVersionUID
, uygulama API düzeyi 24 veya üstünü hedefliyorsaserialVersionUID
'ten farklıdır.
Bu uyarı, etkilenen her sınıf için bir kez kaydedilir.
Uyarı mesajında, serialVersionUID
değerinin uygulama API düzeyi 24 veya sonraki sürümleri hedefliyorsa hesaplanacağı varsayılan değere açıkça ayarlanması önerilen bir düzeltme yer alır. Bu düzeltmeyi kullanarak, sınıftaki bir nesnenin API düzeyi 23 veya daha düşük bir uygulamada serileştirilmesi durumunda nesnenin 24 veya daha yüksek API düzeylerini hedefleyen uygulamalar tarafından doğru şekilde okunmasını ve bunun tam tersinin de geçerli olmasını sağlayabilirsiniz.
java.io.FileChannel.map() değişiklikleri
Android 10'dan itibaren FileChannel.map()
, boyutu truncate()
kullanılarak değiştirilemeyen /dev/zero
gibi standart olmayan dosyalar için desteklenmez. Android'in önceki sürümleri, truncate()
tarafından döndürülen errno değerini yutuyordu ancak Android 10 bir IOException atıyor. Eski davranışa ihtiyacınız varsa yerel kod kullanmanız gerekir.