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

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 bir SSLHandshakeException oluşturduğu bazı durumlarda, bu örnekler Android 10 ve sonraki sürümlerde bunun yerine SSLProtocolException 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 uygulama kullanımında iyileştirmeler - -resim modunda 0 resim uygulaması doğru şekilde kullanıldığında -Resim modunda 0 resim kullanıldığında Ayrıca Android 10, hazır uygulama kullanımını doğru şekilde izler.

  • uygulama başına gri tonlamalı: 1 tonlamalı Android uygulaması

  • " e-posta bildirimlerini seçebilecekleri,

  • Askıya alma ve oynatma - Askıya alınan Android uygulamaları

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 biterse appendReplacement(StringBuffer, String) artık IndexOutOfBoundsException yerine IllegalArgumentException atar ve bu kabul edilmez. Değiştirme işlemi String $ 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ık Matcher üzerinde reset() çağırmıyor. Artık eşleşme olmadığında NullPointerException 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) ve group(int group) artık daha genel bir IndexOutOfBoundsException gönderiyor. Daha önce bu yöntemler ArrayIndexOutOfBoundsException 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ılan serialVersionUID değerini kullanır.
  • Varsayılan serialVersionUID, uygulama API düzeyi 24 veya üstünü hedeflediğinde olacağından serialVersionUID 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.