Android 10, uygulamanızı etkileyebilecek davranış değişiklikleri içerir.
Bu sayfada listelenen değişiklikler, uygulamanın targetSdkVersion
sürümünden bağımsız olarak Android 10'da çalıştırıldığında geçerlidir. Uygulamanızı test etmeli ve bu değişiklikleri düzgün bir şekilde desteklemek için gerektiği gibi değiştirmelisiniz.
Uygulamanızın targetSdkVersion'ı 29
veya daha yüksekse ek değişiklikleri de desteklemeniz gerekir. Ayrıntılar için 29'u hedefleyen uygulamalardaki davranış değişiklikleri başlıklı makaleyi okuyun.
Not: Android 10, bu sayfada listelenen değişikliklerin yanı sıra aşağıdakiler de dahil olmak üzere gizlilikle ilgili çok sayıda değişiklik ve kısıtlama getiriyor:
- Cihaz konumuna arka planda erişim
- Arka planda başlayan işlemler
- İletişim kişileriyle ilgili yakınlık bilgileri
- MAC adresi rastgele seçimi
- 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 destekleme 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ığını ve uyumluluğunu sağlamak için Android 9'da (API düzeyi 28) uygulamanızın kullanabileceği SDK dışı arayüzleri kısıtlamaya başladı. Android 10, Android geliştiricilerle işbirliği 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 mevcut olmasını sağlamaktı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 (uygulamanızın hedef API düzeyine bağlı olarak) kullanabilseniz de herhangi bir SDK dışı yöntemi veya alanı kullanmak uygulamanızın bozulma riskini her zaman yüksek oranda artırır.
Uygulamanızın SDK dışı arayüzler kullanıp kullanmadığından emin değilseniz bunu öğrenmek için uygulamanızı test edebilirsiniz. Uygulamanız SDK dışı arayüzleri kullanıyorsa SDK alternatiflerine geçiş planlamaya başlamanız gerekir. Bununla birlikte, bazı uygulamaların SDK dışı arayüzleri kullanmak için geçerli kullanım alanları olduğunu anlıyoruz. Uygulamanızdaki bir özellik için SDK dışı arayüz kullanmaya alternatif bir çözüm bulamıyorsanız yeni bir genel API isteğinde bulunmanız gerekir.
Daha fazla bilgi edinmek için Android 10'daki SDK olmayan arayüz kısıtlamalarında yapılan güncellemeler ve SDK olmayan arayüzlerdeki kısıtlamalar başlıklı makaleleri inceleyin.
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, ekranın belirli bölümlerinde bir uygulama bu hareketi özellikle geçersiz kılmadığı sürece bu hareketi Geri gezinme olarak yorumlar.
Uygulamanızı hareketle gezinmeye uygun hale getirmek 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 dokümanlarına bakın.
NDK
Android 10, aşağıdaki NDK değişikliklerini içerir.
Paylaşılan nesneler metin yeniden konumlandırmaları içeremez
Android 6.0 (API düzeyi 23), paylaşılan nesnelerde metin yeniden konumlandırmalarının kullanımına izin vermez. Kod olduğu gibi yüklenmeli ve değiştirilmemelidir. Bu değişiklik, uygulama yükleme sürelerini ve güvenliği iyileştirir.
SELinux, Android 10 veya sonraki sürümleri hedefleyen uygulamalarda bu kısıtlamayı zorunlu kılar. Bu uygulamalar, metin yer değiştirmeleri içeren paylaşılan nesneleri kullanmaya devam ederse bozulma riski yüksek olur.
Bionic kitaplıklarında ve dinamik bağlayıcı yollarında yapılan değişiklikler
Android 10'dan itibaren bazı yollar normal dosyalar yerine sembolik bağlantılar olarak tanımlanır. Yolların normal dosyalar olmasına bağlı olan 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 bitlik varyantları için de geçerlidir. Bu varyantlarda lib/
yerine lib64/
kullanılır.
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 sembolik bir bağlantıdır. Bu nedenle dlopen(“/system/lib/libc.so”)
çalışmaya devam eder ancak uygulamalar, /proc/self/maps
veya benzeri bir yöntemle yüklenen kitaplıkları incelemeye çalıştıklarında farkı anlar. Bu durum normal olmasa da bazı uygulamaların, korsanlığa karşı koruma sürecinin bir parçası olarak bunu yaptığı tespit edilmiştir. Bu durumda, /apex/…
yolları Bionic dosyaları için geçerli yollar olarak eklenmelidir.
Yalnızca yürütme belleğine eşlenen sistem ikilileri/kitaplıkları
Android 10'dan itibaren, sistem ikililerinin ve kitaplıkların yürütülebilir segmentleri, kodun yeniden kullanılması saldırılarına karşı bir güvenlik tekniği olarak yalnızca yürütme (okunamaz) için belleğe eşlenir. Uygulamanız, yalnızca yürütme olarak işaretlenmiş bellek segmentlerinde okuma işlemleri gerçekleştirirse (hata, güvenlik açığı veya kasıtlı bellek incelemesi nedeniyle) sistem uygulamanıza SIGSEGV
sinyali gönderir.
Bu davranışın kilitlenmeye neden olup olmadığını /data/tombstones/
içindeki ilgili tombstone dosyasını inceleyerek belirleyebilirsiniz. Yalnızca yürütmeyle 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 inceleme gibi işlemleri gerçekleştirmek için bu sorunu gidermek üzere mprotect()
işlevini çağırarak yalnızca yürütme segmentlerini okuma+yürütme olarak işaretlemek mümkündür. 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ütme izni olarak ayarlamanızı önemle tavsiye ederiz.
Güvenlik
Android 10'da aşağıdaki güvenlik değişiklikleri yer alır.
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ıyı aşağıda bulabilirsiniz:
- TLS 1.3 şifre paketleri özelleştirilemez. Desteklenen TLS 1.3 şifre paketleri, TLS 1.3 etkinleştirildiğinde her zaman etkindir.
setEnabledCipherSuites()
numarası aranarak devre dışı bırakılmaya çalışılması yoksayılır. - TLS 1.3 iletişimi yapıldığında,
HandshakeCompletedListener
nesneler, oturum önbelleğine oturumlar eklenmeden önce çağrılır. (TLS 1.2 ve diğer önceki sürümlerde, bu nesnelere oturum önbelleğine sonra oturumlar eklendiğinde bu ad verilir.) SSLEngine
örneklerinin Android'in önceki sürümlerindeSSLHandshakeException
oluşturduğu bazı durumlarda, bu örnekler Android 10 ve sonraki sürümlerde bunun yerineSSLProtocolException
oluşturur.- 0-RTT modu desteklenmez.
İsterseniz SSLContext.getInstance("TLSv1.2")
numaralı telefonu arayarak TLS 1.3'ün devre dışı bırakıldığı bir SSLContext
edinebilirsiniz.
Ayrıca, uygun bir nesnede setEnabledProtocols()
çağrısı yaparak 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 sertifikalar yayınlamamaktadır ve bu sertifikalara artık Chrome'da veya diğer büyük tarayıcılarda güvenilmemektedir.
SHA-1 kullanan bir sertifika sunan bir siteye bağlanmaya çalışıldığında bağlantı başarısız olur.
KeyChain davranışındaki değişiklikler ve iyileştirmeler
Google Chrome gibi bazı tarayıcılar, TLS el sıkışması kapsamında bir TLS sunucusu 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çimi istemi göstermek için KeyChain.choosePrivateKeyAlias()
çağrıldığında verenleri ve anahtar spesifikasyon parametrelerini dikkate alır. Bu istem özellikle sunucu özelliklerine uymayan seçenekler içermez.
Kullanıcı tarafından seçilebilecek sertifika yoksa (ör. sunucu spesifikasyonuyla eşleşen sertifika yoksa veya cihaza sertifika yüklenmemişse) sertifika seçimi istemi hiç gösterilmez.
Ayrıca, Android 10 veya sonraki sürümlerde anahtarları ya da CA sertifikalarını KeyChain
nesnesine aktarmak için cihaz ekran kilidi olması gerekmez.
Diğer TLS ve kriptografi değişiklikleri
Android 10'da geçerli olacak TLS ve kriptografi kitaplıklarında birkaç küçük değişiklik yapıldı:
- AES/GCM/NoPadding ve ChaCha20/Poly1305/NoPadding şifreleri,
getOutputSize()
'dan daha doğru arabellek boyutları döndürür. TLS_FALLBACK_SCSV
şifre paketi, maksimum protokolü TLS 1.2 veya üzeri olan bağlantı denemelerinde atlanır. TLS sunucusu uygulamalarındaki iyileştirmeler nedeniyle TLS harici yedeklemeyi denemenizi önermiyoruz. Bunun yerine TLS sürümü anlaşmasını kullanmanızı öneririz.- ChaCha20-Poly1305, ChaCha20/Poly1305/NoPadding için kullanılan bir diğer addır.
- Sondaki noktaları 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 Keystore'daki gibi opak imzalama anahtarları, TLS'de RSA-PSS imzalarıyla kullanılabilir.
Kablosuz Doğrudan Bağlantı yayınları
Android 10'da Wi-Fi Direct ile ilgili aşağıdaki yayınlar kalıcı değildir:
Uygulamanız, yapışkan oldukları için kayıt sırasında bu yayınları almaya güveniyorsa bunun yerine 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. Bir ServerSocket
bağlantısı oluşturan bir TCP/UDP soketi oluşturmak için istemci cihazın sunucunun IPv6 adresini ve bağlantı noktasını bilmesi gerekir. Bu, daha önce bant dışı olarak (ör. BT veya Wi-Fi Aware katmanı 2 mesajlaşması kullanılarak) iletilmesi ya da bant içi olarak (ör. mDNS gibi diğer protokoller kullanılarak) keşfedilmesi gerekiyordu. Android 10'da 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. - Bağlantı noktası bilgilerini Wi-Fi Aware 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, 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
iznini alamaz. Bunun nedeni, yer paylaşımı pencerelerinin çizilmesinin aşırı bellek kullanmasıdır. Bu durum, özellikle düşük bellekli Android cihazların performansı için zararlıdır.
Android 9 veya önceki sürümlerin yüklü olduğu bir Go sürümü cihazda çalışan bir uygulama SYSTEM_ALERT_WINDOW
iznini alırsa cihaz Android 10'a yükseltilse bile izin korunur. Ancak bu izne sahip olmayan uygulamalara, cihaz yükseltildikten sonra bu 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ı, cihazı yavaşlattığı için iznin verilmediğini belirten bir Ayarlar ekranına yönlendirir. Bir Go cihazındaki uygulama Settings.canDrawOverlays()
yöntemini çağırırsa 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
iznini alan uygulamalar için geçerli değildir.
Eski Android sürümlerini hedefleyen uygulamalarla ilgili uyarılar
Android 10 veya sonraki sürümlerin yüklü olduğu cihazlar, Android 5.1 (API düzeyi 22) veya önceki sürümleri hedefleyen uygulamaları ilk kez çalıştıran kullanıcıları uyarır. Uygulama, kullanıcının izin vermesini gerektiriyorsa kullanıcıya, uygulama ilk kez çalıştırılmadan önce uygulama izinlerini ayarlama fırsatı da verilir.
Google Play'in hedef API şartları 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 şartları 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 şifreleme 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 paketlerinden daha az güvenlidir ve çoğu sunucu bu şifre paketlerinin hem GCM hem de CBC varyantlarını destekler veya hiçbirini desteklemez.
Uygulama kullanımı
Android 10, uygulama kullanımıyla ilgili aşağıdaki davranış değişikliklerini sunar:
UsageStats uygulama kullanımı iyileştirmeleri - <0x Ayrıca, Android 10, hazır uygulama kullanımını doğru şekilde izler.
Uygulama bazında gri tonlama: Android 10'da uygulama bazında gri tonlama görüntüleme modu ayarlanabilir.
Uygulama bazında dikkat dağıtma durumu - <
Askıya alma ve oynatma - <
HTTPS bağlantı değişiklikleri
Android 10 çalıştıran bir uygulama null
içine setSSLSocketFactory()
iletirse IllegalArgumentException
oluşur. Önceki sürümlerde null
değerini setSSLSocketFactory()
işlevine iletmek, mevcut varsayılan
fabrika değerini iletmekle aynı etkiye sahipti.
android.preference kitaplığı kullanımdan kaldırıldı
android.preference
kitaplığının desteği Android 10 itibarıyla 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ştirme sürecinde yardımcı olacak ek kaynaklar için güncellenmiş Ayarlar Kılavuzu'nun yanı sıra herkese açık örnek uygulamamızı ve referans dokümanlarımızı inceleyin.
ZIP dosyası yardımcı program kitaplığı değişiklikleri
Android 10, ZIP dosyalarını işleyen java.util.zip
paketindeki sınıflarda aşağıdaki değişiklikleri yapar. Bu değişiklikler, kitaplığın davranışını Android ile java.util.zip
kullanan diğer platformlar arasında daha tutarlı hale getirir.
Inflater
Önceki sürümlerde, Inflater
sınıfındaki bazı yöntemler end()
çağrısından sonra çağrıldığında IllegalStateException
oluşturuyordu.
Android 10'da bu yöntemler bunun yerine NullPointerException
oluşturur.
ZipFile
Android 10 ve sonraki sürümlerde, File
, int
ve Charset
türünde bağımsız değişkenler alan ZipFile
için oluşturucu, sağlanan ZIP dosyası herhangi bir dosya içermiyorsa ZipException
oluşturmaz.
ZipOutputStream
Android 10 ve sonraki sürümlerde, ZipOutputStream
içindeki finish()
yöntemi, dosya içermeyen bir ZIP dosyası için çıkış akışı yazmaya çalıştığında ZipException
oluşturmaz.
Kamerayla ilgili değişiklikler
Kamerayı kullanan birçok uygulama, cihaz dikey yapılandırmadaysa Kamera yönü bölümünde açıklandığı gibi fiziksel cihazın da dikey yönde olduğunu varsayar. Bu, geçmişte güvenli bir varsayımdı ancak katlanabilir cihazlar gibi kullanılabilir form faktörlerinin genişlemesiyle birlikte değişti. Bu cihazlardaki bu varsayım, kamera vizörünün yanlış döndürülmesine veya ölçeklendirilmesine (ya da her ikisine) yol açabilir.
API düzeyi 24 veya üstünü hedefleyen uygulamalar, android:resizeableActivity
değerini açıkça ayarlamalı ve çok pencereli işlemi yönetmek için gerekli işlevleri sağlamalıdır.
Pil kullanımını izleme
Android 10'dan itibaren,
SystemHealthManager
, büyük bir
şarj etkinliğinden sonra cihazın fişi çekildiğinde pil kullanım istatistiklerini sıfırlar. Genel olarak, büyük bir şarj etkinliği şunlardan biridir: Cihaz tamamen şarj edilmiştir veya cihazın şarjı büyük ölçüde tükenmiş durumdan büyük ölçüde şarj edilmiş duruma gelmiştir.
Android 10'dan önce, pil seviyesinde ne kadar az değişiklik olursa olsun cihazın fişi çekildiğinde pil kullanım istatistikleri sıfırlanıyordu.
Android Beam'in desteğinin sonlandırılması
Android 10'da, Near Field Communication (NFC) aracılığıyla cihazlar arasında veri paylaşımını başlatmak için kullanılan eski bir özellik olan Android Beam'in desteğini resmi olarak sonlandı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ı için isteğe bağlı olarak kullanılmaya devam edecek ancak artık etkin geliştirme kapsamında olmayacak. Ancak Android, diğer NFC özelliklerini ve API'lerini desteklemeye devam edecek. Etiketlerden okuma ve ödeme gibi kullanım alanları beklendiği gibi çalışmaya devam edecek.
java.math.BigDecimal.stripTrailingZeros() davranış değişikliği
BigDecimal.stripTrailingZeros()
, giriş değeri sıfırsa artık sondaki sıfırları özel bir durum olarak korumuyor.
java.util.regex.Matcher ve Pattern davranış değişiklikleri
Girişin başında sıfır genişliğinde bir eşleşme olduğunda split()
sonucu artık boş bir String
("") ile başlamayacak şekilde değiştirildi. Bu durum String.split()
için de geçerlidir. Örneğin, "x".split("")
artık {"x"}
döndürüyor. Android'in eski sürümlerinde ise {"", "x"}
döndürülüyordu.
"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:
appendReplacement(StringBuffer, String)
artık yasa dışı olan tek bir ters eğik çizgiyle bitenString
yerineIllegalArgumentException
oluşturuyor.IndexOutOfBoundsException
Aynı istisna, değiştirmeString
$
ile bitiyorsa da oluşturulur. Daha önce bu senaryoda istisna oluşturulmuyordu.replaceFirst(null)
,NullPointerException
hatası verirse artıkMatcher
üzerindereset()
'u çağırmaz. Artık eşleşme olmadığında daNullPointerException
istisnası oluşturuluyor. 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ın dışındaysa artık daha genel birIndexOutOfBoundsException
oluşturuyor. Bu yöntemler daha önceArrayIndexOutOfBoundsException
hatası veriyordu.
GradientDrawable için varsayılan açı artık TOP_BOTTOM
Android 10'da XML'de bir
GradientDrawable
tanımlayıp açı ölçüsü sağlamazsanız gradyan yönü varsayılan olarak
TOP_BOTTOM
olur.
Bu, varsayılanın LEFT_RIGHT
olduğu önceki Android sürümlerine kıyasla bir değişikliktir.
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 açı ölçümünü 0 olarak 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, hatalı, varsayılan serialVersionUID
'ya dayanan uygulamalarda sistem bir uyarı günlüğe kaydeder ve kod düzeltmesi önerir.
Sistem, özellikle aşağıdaki koşulların tümü geçerliyse bir uyarı günlüğe kaydeder:
- Uygulama, API düzeyi 23 veya daha düşük bir sürümü hedefliyor.
- Bir sınıf seri hale getirilir.
- Serileştirilmiş sınıf,
serialVersionUID
açıkça ayarlanmak yerine varsayılanserialVersionUID
değerini kullanır. - Varsayılan
serialVersionUID
, uygulamanın API düzeyi 24 veya sonraki sürümleri hedeflemesi durumundakiserialVersionUID
değerinden farklıdır.
Bu uyarı, etkilenen her sınıf için bir kez kaydedilir.
Uyarı mesajında, önerilen bir düzeltme yer alır. Bu düzeltme, uygulamanın API düzeyi 24 veya sonraki sürümleri hedeflemesi durumunda hesaplanacak varsayılan değere serialVersionUID
değerini açıkça ayarlamaktır. Bu düzeltmeyi kullanarak, API düzeyi 23 veya daha düşük bir düzeyi hedefleyen bir uygulamada bu sınıftaki bir nesne serileştirilirse nesnenin 24 veya daha yüksek bir düzeyi hedefleyen uygulamalar tarafından doğru şekilde okunmasını sağlayabilirsiniz. Aynı durum tersi için de geçerlidir.
java.io.FileChannel.map() değişiklikleri
Android 10'dan itibaren, FileChannel.map()
truncate()
kullanılarak boyutu 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'yu yutuyordu ancak Android 10, IOException oluşturuyor. Eski davranışa ihtiyacınız varsa yerel kodu kullanmanız gerekir.