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. Bu değişiklikleri düzgün bir şekilde desteklemek için uygulamanızı test etmeniz ve gerektiğinde 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ılı bilgi için uygulamalar için davranış değişiklikleri 29'u okuduğunuzdan emin olun.
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 adresi rastgele hale getirme
- 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ığını ve uyumluluğunu sağlamaya yardımcı olmak 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 sunulması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 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üzler için geçerli kullanım alanları olduğunun farkındayız. 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'da SDK dışı arayüz kısıtlamalarıyla ilgili güncellemeler bölümünü ve SDK olmayan arayüzlerle ilgili kısıtlamalar bölümünü inceleyin.
Hareketle Gezinme
Android 10'dan itibaren kullanıcılar cihaz genelinde 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 dokümanlarına bakın.
NDK
Android 10, aşağıdaki NDK değişikliklerini içerir.
Paylaşılan nesneler metin taşıma içeremez
Android 6.0 (API düzeyi 23), paylaşılan nesnelerde metin taşıma işlemlerinin 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ğ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ı ve dinamik bağlayıcı yollarındaki değişiklikler
Android 10'dan itibaren, çeşitli yollar normal dosyalar yerine sembolik bağlantılardır. Normal dosya olan yolları kullanan 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
dosyasına giden bir 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.
/data/tombstones/
içindeki ilgili tombstone dosyasını inceleyerek bu davranışın kilitlenmeye neden olup olmadığını 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, bir TLS sunucusu TLS el sıkışmasının parçası olarak 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 bir sertifika seçim istemi göstermek için KeyChain.choosePrivateKeyAlias()
çağrısı yapıldığında kartı verenleri ve anahtar spesifikasyonu 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ılmıştır.
- 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 iletişiminin kullanılmasını ö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 Anahtar Deposu'ndakiler gibi opak imzalama anahtarları, TLS'de RSA-PSS imzalarıyla kullanılabilir.
Kablosuz doğrudan 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 Yuvası oluşturma işlemini 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'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 edinin. - Wi-Fi Aware ağ isteği kapsamında bağlantı noktası bilgilerini 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
iznine sahip olamaz. Bunun nedeni, yer paylaşımlı pencerelerin çiziminde aşırı bellek
kullanılmasıdır. Bu, özellikle düşük belleğe sahip Android cihazların performansına zarar verir.
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 iznini korur. Ancak, bu izni henüz almamış uygulamalara cihaz yükseltildikten sonra izin verilemez.
Go cihazlarındaki bir uygulama ACTION_MANAGE_OVERLAY_PERMISSION
işlemiyle birlikte bir intent gönderirse sistem, isteği otomatik olarak reddeder ve kullanıcıyı Ayarlar ekranına yönlendirir. Bu ekran, cihazı yavaşlattığı için iznin verilmediğini belirtir. 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. Uygulama, kullanıcının izin vermesini gerektiriyorsa uygulamanın ilk kez çalıştırılmasına izin verilmeden önce kullanıcıya uygulama izinlerini düzenleme 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 gereksinimleri 2019'da yürürlüğe girecektir. Bu şartlar hakkında daha fazla bilgi için 2019'da hedef API düzeyi şartlarının genişletilmesi 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 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
öğesinin setSSLSocketFactory()
öğesine geçirilmesi, mevcut varsayılan fabrika ayarını iletmeyle 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'nun yanı sıra herkese açık örnek uygulamamız 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
oluşturur.
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
içindeki finish()
yöntemi dosya içermeyen bir ZIP dosyası için çıkış akışı yazmaya çalıştığında ZipException
atmaz.
Kamera değişiklikleri
Kamera kullanan çoğu 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 cihazlardaki bu varsayım, kamera vizörünün yanlış döndürülmesine veya ölçeklendirilmesine (ya da her ikisine birden) yol açabilir.
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şe takılıyken 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şlatmak için kullanılan 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 ise sonundaki sıfırları özel durum olarak korumaz.
java.util.regex.Matcher ve Pattern davranışında yapılan değişiklikler
Girişin başında sıfır genişlikli bir eşleşme olduğunda split()
işlevinin sonucu, 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 uygulamalarda 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. - Uygulama, API düzeyi 24 veya üstünü hedefliyorsa varsayılan
serialVersionUID
,serialVersionUID
değerinden farklıdır.
Bu uyarı, etkilenen her sınıf için bir kez kaydedilir.
Uyarı mesajı, önerilen bir düzeltmeyi içerir. Bu düzeltme, uygulama API düzeyi 24 veya sonraki sürümleri hedeflediğinde hesaplanacak varsayılan değere açık bir şekilde serialVersionUID
ayarlanmasını sağlar. 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
FileChannel.map()
, Android 10'dan itibaren boyutu truncate()
ile 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.