Davranış değişiklikleri: tüm uygulamalar

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ümlerinde SSLHandshakeException oluşturduğu bazı durumlarda, bu örnekler Android 10 ve sonraki sürümlerde bunun yerine SSLProtocolException 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 biten String yerine IllegalArgumentException oluşturuyor.IndexOutOfBoundsException Aynı istisna, değiştirme String $ ile bitiyorsa da oluşturulur. Daha önce bu senaryoda istisna oluşturulmuyordu.
  • replaceFirst(null), NullPointerException hatası verirse artık Matcher üzerinde reset()'u çağırmaz. Artık eşleşme olmadığında da NullPointerException istisnası oluşturuluyor. Daha önce yalnızca eşleşme olduğunda atılıyordu.
  • start(int group), end(int group) ve group(int group), grup dizini sınırların dışındaysa artık daha genel bir IndexOutOfBoundsException oluşturuyor. Bu yöntemler daha önce ArrayIndexOutOfBoundsException 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ılan serialVersionUID değerini kullanır.
  • Varsayılan serialVersionUID, uygulamanın API düzeyi 24 veya sonraki sürümleri hedeflemesi durumundaki serialVersionUID 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.