Android 10, uygulamanızı etkileyebilecek davranış değişikliklerini içerir.
Bu sayfada listelenen değişiklikler, uygulamanızın targetSdkVersion
özelliğinden bağımsız olarak, Android 10 üzerinde çalışırken uygulamanız için geçerlidir. Uygulamanızı test etmeniz ve bu değişikliklerin doğru şekilde desteklenmesi için gereken değişiklikleri yapmanız gerekir.
Uygulamanızın targetSdkVersion değeri 29
veya daha yüksekse ek değişiklikleri de desteklemeniz gerekir. Ayrıntılar için 29'u hedefleyen uygulamalar için davranış değişikliklerini okumayı unutmayın.
Not: Android 10, bu sayfada listelenen değişikliklere ek olarak aşağıdakiler de dahil olmak üzere gizliliğe dayalı çok sayıda değişiklik ve kısıtlama uygular:
- Cihaz konumuna arka planda erişim
- Arka plan etkinliği başlatma sayısı
- Kişiler yakın ilgi alanı bilgileri
- MAC adresi rastgele hale getirme
- Kamera meta verileri
- İzin modeli
Bu değişiklikler tüm uygulamaları etkilemekte ve kullanıcı gizliliğini iyileştirmektedir. 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ı
Uygulama kararlılığını ve uyumluluğu sağlamaya yardımcı olmak için platform, 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ştiricileriyle yapılan ortak çalışmalara ve en son dahili testlere göre kısıtlanmış SDK dışı arayüzlerin güncellenmiş listelerini içerir. Amacımız, SDK olmayan arayüzleri kısıtlamadan önce herkese açık alternatiflerin kullanıma sunulmasını sağlamaktır.
Android 10'u (API düzeyi 29) hedeflemeyecekseniz bu değişikliklerden bazıları sizi hemen etkilemeyebilir. Bununla birlikte, şu anda bazı SDK dışı arayüzleri (uygulamanızın hedef API düzeyine bağlı olarak) kullanabilseniz de herhangi bir SDK olmayan yöntem veya alanın kullanılması her zaman uygulamanızın bozulma riskini artırır.
Uygulamanızın SDK olmayan arayüzler kullanıp kullanmadığından emin değilseniz öğrenmek için uygulamanızı test edebilirsiniz. Uygulamanız SDK olmayan arayüzlere dayanıyorsa SDK alternatiflerine geçiş planlamaya başlamanız gerekir. Yine de, bazı uygulamaların SDK dışı arayüz kullanımıyla ilgili geçerli kullanım alanları olduğunun farkındayız. Uygulamanızdaki bir özellik için SDK olmayan arayüz kullanmaya alternatif bulamıyorsanız yeni bir genel API isteğinde bulunmanız gerekir.
Daha fazla bilgi edinmek için Android 10'da SDK olmayan arayüz kısıtlamalarıyla ilgili güncellemeler ve SDK olmayan arayüzlerle ilgili kısıtlamalar bölümlerine bakın.
Hareketle Gezinme
Android 10'dan itibaren kullanıcılar cihaz genelinde hareketle gezinmeyi etkinleştirebilir. Bir kullanıcı hareketle gezinmeyi etkinleştirirse bu durum, uygulamanın 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, bir uygulama ekranın bazı bölümlerinde bu hareketi özellikle geçersiz kılmadıkça, sistem bu hareketi Geri gezinme olarak yorumlar.
Uygulamanızı hareketle gezinmeyle uyumlu hale getirmek için uygulama içeriğini kenardan kenara uzatmanız ve çakışan hareketleri uygun şekilde yönetmeniz gerekir. Daha fazla bilgi için Hareketle gezinme belgelerine bakın.
400
Android 10, aşağıdaki NDK değişikliklerini içerir.
Paylaşılan nesneler metin konumları içeremez
Android 6.0 (API düzeyi 23) için paylaşılan nesnelerde metin konumlarının kullanılmasına izin verilmez. Kod olduğu gibi yüklenmeli ve değiştirilmemelidir. Bu değişiklik, uygulama yüklenme sürelerini ve güvenliğini iyileştiriyor.
SELinux, bu kısıtlamayı Android 10 veya sonraki sürümleri hedefleyen uygulamalarda uygular. Bu uygulamalar metin konumu içeren paylaşılan nesneleri kullanmaya devam ederse bozulma riski yüksektir.
Bionic kitaplıkları ve dinamik bağlayıcı yollarındaki değişiklikler
Android 10'dan itibaren birkaç yol, normal dosyalar yerine sembolik bağlantılardır. Normal dosyalar olan yollara başvuran uygulamalar şu durumlarda sorun yaşayabilir:
/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çerli olur (lib/
, lib64/
ile değiştirilir).
Uyumluluk amacıyla, 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 sembolik bir bağlantıdır. Dolayısıyla dlopen(“/system/lib/libc.so”)
çalışmaya devam eder, ancak uygulamalar /proc/self/maps
veya benzeri bir içeriği okuyarak gerçekten yüklenen kitaplıkları incelemeye çalıştıklarında farkı anlayacaktır. Bu, olağan bir durum değildir, ancak bazı uygulamaların bunu saldırıları önleme süreci kapsamında yaptığını gördük. Öyleyse /apex/…
yolları, Bionic dosyaları için geçerli yollar olarak eklenmelidir.
Yalnızca yürütme belleğine eşlenen sistem ikili programları/kitaplıkları
Android 10'dan itibaren, kod yeniden kullanımı saldırılarına karşı sağlamlaştırma tekniği olarak sistem ikili programları ve kitaplıklarının yürütülebilir segmentleri, belleğe yalnızca yürütülebilir (okunamaz) şekilde eşlenir. Uygulamanız, yalnızca yürütülür olarak işaretlenmiş bellek segmentlerinde okuma işlemleri gerçekleştirirse sistem uygulamanıza bir SIGSEGV
sinyali gönderir.
/data/tombstones/
içindeki ilgili altyapı dosyasını inceleyerek bu davranışın bir kilitlenmeye neden olup olmadığını belirleyebilirsiniz. Yalnızca yürütme işlemiyle ilgili bir kilitlenme aşağıdaki iptal mesajını içerir:
Cause: execute-only (no-read) memory access error; likely due to data in .text.
Bellek incelemesi gibi işlemler yaparken bu sorunu geçici olarak çözmek için mprotect()
yöntemini çağırarak yalnızca yürütme işlemi gerçekleştiren segmentleri okundu+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 tekrar yalnızca yürütülecek şekilde 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ız hakkında bazı önemli ayrıntıları burada bulabilirsiniz:
- TLS 1.3 şifre paketleri özelleştirilemez. Desteklenen TLS 1.3 şifre paketleri, TLS 1.3 etkinleştirildiğinde her zaman etkindir. Bunları,
setEnabledCipherSuites()
çağrısı yaparak devre dışı bırakma girişimleri yok sayılır. - TLS 1.3 üzerinde anlaşmaya varıldığında
HandshakeCompletedListener
nesneleri oturum önbelleğine oturumlar eklenmeden önce çağrılır. (TLS 1.2 ve diğer önceki sürümlerde bu nesneler, oturumlar oturum önbelleğine eklendikten sonra çağrılır.) SSLEngine
örneklerinin önceki Android sürümlerinde birSSLHandshakeException
oluşturduğu bazı durumlarda, bu örnekler Android 10 ve sonraki sürümlerde bunun yerineSSLProtocolException
hatası verir.- 0-RTT modu desteklenmez.
İsterseniz SSLContext.getInstance("TLSv1.2")
yöntemini çağırarak TLS 1.3'ün devre dışı bırakıldığı bir SSLContext
edinebilirsiniz.
Ayrıca, uygun bir nesnede setEnabledProtocols()
yöntemini çağırarak protokol sürümlerini bağlantı bazında etkinleştirebilir veya devre dışı bırakabilirsiniz.
SHA-1 ile imzalanmış sertifikalara TLS'de güvenilmez.
Android 10'da, SHA-1 karma algoritmasını kullanan sertifikalar TLS bağlantılarında güvenilir değildir. Kök CA'lar 2016'dan beri böyle bir sertifika yayınlamamıştır ve artık Chrome'da veya diğer önemli tarayıcılarda güvenilmemektedir.
SHA-1 kullanarak sertifika sunan bir siteye bağlantı kuruluysa tüm bağlanma denemeleri başarısız olur.
KeyChain davranışındaki değişiklikler ve iyileştirmeler
Google Chrome gibi bazı tarayıcılar, bir TLS sunucusu 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 sürümünden itibaren KeyChain
nesneleri, kullanıcılara bir sertifika seçimi istemi göstermek için KeyChain.choosePrivateKeyAlias()
çağrılırken sertifikayı verenleri ve anahtar spesifikasyonu parametrelerini dikkate alır. Özellikle, bu istem sunucu özelliklerine uymayan seçenekler içermez.
Kullanıcı tarafından seçilebilir sertifika yoksa (sunucu spesifikasyonuyla eşleşen sertifika yok veya cihazda yüklü sertifika bulunmuyorsa) sertifika seçimi istemi hiç görüntülenmez.
Ayrıca, Android 10 veya sonraki sürümlerde anahtarları veya CA sertifikalarını bir KeyChain
nesnesine 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 olan birkaç küçük değişiklik yapıldı:
- AES/GCM/NoPadding ve ChaCha20/Poly1305/NoPadding şifreleri
getOutputSize()
ürününden daha doğru arabellek boyutları döndürür. TLS_FALLBACK_SCSV
şifre paketi, maksimum TLS 1.2 veya üzeri protokole sahip bağlantı denemelerinden çıkarılır. TLS sunucusu uygulamalarındaki iyileştirmeler nedeniyle TLS-harici yedeğini kullanmanızı önermiyoruz. Bunun yerine, TLS sürümü pazarlığını kullanmanızı öneririz.- ChaCha20-Poly1305, ChaCha20/Poly1305/NoPadding'in takma adıdır.
- Sonunda nokta olan 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ı dikkate alınır. - Android Anahtar Deposu'ndan gelen anahtarlar gibi opak imzalama anahtarları, TLS'de RSA-PSS imzalarıyla kullanılabilir.
Kablosuz Doğrudan Bağlantı yayınları
Android 10'da Kablosuz Doğrudan Bağlantı ile ilgili aşağıdaki yayınlar sabit değildir:
Uygulamanız sabit kaldıkları için bu yayınları kayıt sırasında almaya güventiyse, bu bilgileri edinmek için başlatma sırasında uygun get()
yöntemini kullanın.
Wi-Fi Aware özellikleri
Android 10'da, kablosuz ağa duyarlı veri yolları kullanılarak TCP/UDP Yuvası oluşturma işleminin kolaylaştırılması desteği sunulur. ServerSocket
ağına bağlanan bir TCP/UDP soketi oluşturmak için istemci cihazın IPv6 adresini ve sunucunun bağlantı noktasını bilmesi gerekir. Bunun daha önceleri, örneğin BT veya Wi-Fi Aware 2. katman mesajlaşması kullanılarak bant dışında iletişim kurulması veya mDNS gibi başka protokoller kullanılarak bant içinde keşfedilmesi gerekiyordu. Android 10 ile bu 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 edinin. - Bağlantı noktası bilgilerini, Kablosuz duyarlı ağ isteğinin bir parçası olarak belirtin.
Aşağıdaki kod örneğinde, ağ isteğinin bir parçası olarak 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 IPv6'yı ve sunucu tarafından sağlanan bağlantı noktasını almak için bir Kablosuz Ağa Duyarlı 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 cihazlarında SYSTEM_ALERT_WINDOW
Android 10 (Go sürümü) cihazlarda çalışan uygulamalar SYSTEM_ALERT_WINDOW
iznini alamaz. Bunun nedeni, çizim bindirme pencerelerinin aşırı bellek kullanmasıdır. Bu durum, özellikle düşük bellekli Android cihazların performansına zarar verir.
Android 9 veya önceki sürümleri çalıştıran Go sürümü cihazda çalışan bir uygulama SYSTEM_ALERT_WINDOW
iznini alırsa cihaz Android 10'a yükseltilmiş olsa bile uygulama bu izni korur. Ancak, halihazırda bu izne sahip olmayan uygulamalara, cihaz yeni sürüme geçirildikten sonra izin verilemez.
Go cihazındaki bir uygulama, ACTION_MANAGE_OVERLAY_PERMISSION
işlemiyle bir amaç gönderirse sistem isteği otomatik olarak reddeder ve kullanıcıyı Ayarlar ekranına yönlendirir. Bu ekran, cihazı yavaşlattığı için izne izin verilmediğini belirtir. Go cihazındaki bir uygulama Settings.canDrawOverlays()
yöntemini çağırırsa yöntem her zaman "false" döndürür. Bu kısıtlamalar, cihaz Android 10'a yükseltilmeden önce SYSTEM_ALERT_WINDOW
iznini alan uygulamalar için geçerli değildir.
Daha 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 herhangi bir uygulamayı ilk kez çalıştırdıklarında kullanıcıları uyarır. Uygulama, kullanıcının izin vermesini gerektiriyorsa kullanıcıya, uygulamanın ilk kez çalıştırılmasına izin verilmeden önce uygulamanın izinlerini ayarlama fırsatı da verilir.
Google Play'in hedef API gereksinimleri nedeniyle, kullanıcılar bu uyarıları yalnızca yakın zamanda güncellenmemiş bir uygulama çalıştırdıklarında görür. Diğer mağazalar üzerinden dağıtılan uygulamalar için benzer hedef API gereksinimleri 2019 yılında yürürlüğe girecektir. Bu gereksinimler hakkında daha fazla bilgi için 2019'da hedef API düzeyi şartlarını genişletme bölümüne bakın.
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'yi kullanan benzer şifre paketlerinden daha az güvenlidir ve çoğu sunucu bu şifre paketlerinin hem GCM hem de CBC varyantlarını destekler veya bunların ikisini de desteklemez.
Uygulama kullanımı
Android 10, uygulama kullanımıyla ilgili aşağıdaki davranış değişikliklerini sunar:
Kullanım istatistikleri için uygulama kullanımıyla ilgili iyileştirmeler veya uygulamadaki kullanım istatistikleri veya uygulama tarafından doğru şekilde bölünmüş -Resim modunda 0 resim uygulaması içinde resim uygulaması doğru şekilde kullanıldığında Ayrıca Android 10, hazır uygulama kullanımını doğru şekilde izler.
uygulama başına gri tonlamalı - 1 rakamı olan uygulamalar
" e-posta bildirimleri
Askıya alma ve oynatma - 0
HTTPS bağlantısı değişiklikleri
Android 10 çalıştıran bir uygulama null
öğesini setSSLSocketFactory()
'e geçirirse IllegalArgumentException
meydana gelir. Önceki sürümlerde, null
öğesinin setSSLSocketFactory()
içine geçirilmesi, mevcut varsayılan fabrikada geçişle aynı etkiye sahipti.
android.preference kitaplığı kullanımdan kaldırıldı
android.preference
kitaplığı, Android 10 itibarıyla kullanımdan kaldırılmıştır.
Geliştiriciler bunun yerine Android Jetpack'in bir parçası olan AndroidX tercih kitaplığını kullanmalıdır. Taşıma ve geliştirme sürecine yardımcı olacak ek kaynaklar için herkese açık örnek uygulamamızın ve referans belgelerimizin yanı sıra güncellenmiş Ayarlar Kılavuzu'na göz atın.
ZIP dosyası yardımcı program kitaplığı değişiklikleri
Android 10'da, ZIP dosyalarını işleyen java.util.zip
paketindeki sınıflarda aşağıdaki değişiklikler yapılmıştır. Bu değişiklikler, kitaplığın davranışını Android ile java.util.zip
kullanan diğer platformlar arasında daha tutarlı hale getirir.
İnflater
Önceki sürümlerde, Inflater
sınıfındaki bazı yöntemler end()
çağrısından sonra çağrıldığında bir IllegalStateException
oluşturuyordu.
Android 10'da bu yöntemler bunun yerine bir NullPointerException
döndürür.
Sıkıştırılmış Dosya
Android 10 ve sonraki sürümlerde File
, int
ve Charset
türündeki bağımsız değişkenleri alan ZipFile
kurucusu, sağlanan ZIP dosyası hiçbir dosya içermiyorsa ZipException
etiketi bildirmez.
ZipÇıkışAkışı
Android 10 ve sonraki sürümlerde, ZipOutputStream
ürünündeki finish()
yöntemi dosya içermeyen bir ZIP dosyası için çıkış akışı yazmaya çalışırsa ZipException
hatası bildirmez.
Kamera değişiklikleri
Kamera kullanan birçok uygulama, cihazın dikey yapılandırmada olması durumunda 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 yaygınlaşmasıyla bu durum değişti. Bu cihazlardaki bu varsayım, kamera vizörünün yanlış bir şekilde döndürülmesine veya ölçeklenmiş (ya da her ikisinin) gösterilmesine yol açabilir.
API düzeyi 24 veya sonraki sürümleri hedefleyen uygulamalar android:resizeableActivity
açıkça ayarlamalı ve çoklu pencere işlemlerini yürütmek için gerekli işlevleri sağlamalıdır.
Pil kullanımı izleme
Android 10'dan itibaren SystemHealthManager
, büyük bir şarj etkinliğinden sonra cihaz fişe takılmadığında pil kullanımı istatistiklerini sıfırlar. Genel olarak, en önemli şarj etkinliklerinden biri şudur: Cihaz tam olarak şarj edilmiş veya cihaz neredeyse tamamen tükenmiş durumdan çoğunlukla şarj olmuş duruma geçmiştir.
Android 10'dan önce, pil seviyesi ne kadar az değişiklik olursa olsun, cihaz fişe takılı değilken pil kullanımı istatistikleri sıfırlanır.
Android Beam desteğinin sonlandırılması
Android 10'da, Near Field Communication (NFC) aracılığıyla cihazlar arasında veri paylaşımı başlatmaya yönelik eski bir özellik olan Android Beam'i resmi olarak kullanımdan kaldırıyoruz. Ayrıca, ilgili NFC API'lerinden bazılarını da kullanımdan kaldırıyoruz. Android Beam, kullanmak isteyen cihaz üreticisi iş ortakları tarafından isteğe bağlı olarak kullanılabilir olmaya devam eder, ancak artık aktif geliştirme aşamasında değildir. Bununla birlikte Android, diğer NFC özelliklerini ve API'leri desteklemeye devam edecek ve etiketlerden ve ödemelerden okuma gibi kullanım alanları beklendiği gibi çalışmaya devam edecektir.
java.math.BigDecimal.stripTrailingZeros() davranış değişikliği
Girdi değeri sıfırsa BigDecimal.stripTrailingZeros()
artık özel durum olarak sondaki sıfırları korumaz.
java.util.regex.Matcher ve Kalıp davranış değişiklikleri
Girişin başında sıfır genişlikli bir eşleşme olduğunda split()
sonucu, artık boş bir String
("") ile başlamayacak şekilde değiştirildi. Bu durum String.split()
ürününü de etkiliyor. Örneğin, "x".split("")
artık {"x"}
değerini döndürürken Android'in eski sürümlerinde {"", "x"}
değerini döndürürdü.
"aardvark".split("(?=a)"
artık {"", "a", "ardv", "ark"}
yerine {"a", "ardv", "ark"}
değerini döndürüyor.
Geçersiz bağımsız değişkenler için istisna davranışı da iyileştirildi:
String
değişimi tek başına ters eğik çizgiyle biterseappendReplacement(StringBuffer, String)
artıkIndexOutOfBoundsException
yerineIllegalArgumentException
atar ve bu kabul edilmez. Değiştirme işlemiString
$
ile biterse aynı istisna alınır. Daha önce bu senaryoda hiçbir istisnaya yol açılmıyordu.replaceFirst(null)
,NullPointerException
fırlatırsa artıkMatcher
üzerindereset()
çağırmıyor. Artık eşleşme olmadığındaNullPointerException
de değerlendirilir. Daha önce yalnızca bir maç olduğunda yayınlanıyordu.- Grup dizini sınırların dışındaysa
start(int group)
,end(int group)
vegroup(int group)
artık daha genel birIndexOutOfBoundsException
gönderiyor. Daha önce bu yöntemlerArrayIndexOutOfBoundsException
sonuç verdi.
GradientDrawable için varsayılan açı TOP_BOTTOM oldu
Android 10'da, XML'de bir GradientDrawable
tanımlar ve açı ölçümü sağlamazsanız gradyan yönü varsayılan olarak TOP_BOTTOM
olur.
Bu, varsayılan olarak LEFT_RIGHT
olan Android'in önceki sürümlerine göre bir değişikliktir.
Geçici bir çözüm olarak, AAPT2'nin en son sürümüne güncelleme yaparsanız açı ölçümü belirtilmediğinde araç, eski uygulamalar için açı ölçümünü 0 olarak ayarlar.
Varsayılan SUID kullanarak serileştirilmiş nesneler için günlük kaydı
Platform, Android 7.0'dan (API düzeyi 24) itibaren serileştirilebilir nesneler için varsayılan serialVersionUID
değerine düzeltme getirmiştir. Bu düzeltme, API düzeyi 23 veya altını hedefleyen uygulamaları etkilememiştir.
Android 10'dan itibaren, bir uygulama API düzeyi 23 veya altını hedefliyorsa ve eski, yanlış, varsayılan serialVersionUID
değerine dayanıyorsa sistem bir uyarı kaydeder ve kod düzeltmesi önerir.
Özellikle, aşağıdakilerin tümü doğruysa sistem bir uyarı kaydeder:
- Uygulama, API düzeyi 23 veya altını hedefliyor.
- Bir sınıf serileştirildi.
- Serileştirilmiş sınıf, açık bir şekilde
serialVersionUID
ayarlamak yerine varsayılanserialVersionUID
değerini kullanır. - Varsayılan
serialVersionUID
, uygulama API düzeyi 24 veya üstünü hedeflediğinde olacağındanserialVersionUID
farklı olacaktır.
Bu uyarı, etkilenen her sınıf için bir kez kaydedilir.
Uyarı mesajı, serialVersionUID
özelliğinin API düzeyi 24 veya üstünü hedeflemesi durumunda hesaplanacak varsayılan değere açıkça ayarlanması gereken önerilen bir düzeltmeyi içerir. Bu düzeltmeyi kullanarak, söz konusu sınıftaki bir nesnenin API düzeyi 23 veya altını hedefleyen bir uygulamada seri hale getirilmesi durumunda, nesnenin 24 veya üstünü hedefleyen uygulamalar tarafından doğru bir şekilde okunmasını (veya bunun tersini) 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 desteklenmemektedir. Android'in önceki sürümleri truncate()
tarafından döndürülen hatayı ortadan kaldırırken Android 10 bir IOException atar. Eski davranışa ihtiyacınız varsa
yerel kod kullanmanız gerekir.