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ışırken uygulamanız için geçerli olur. Uygulamanızı test etmeli ve bu değişiklikleri doğru şekilde desteklemek için gereken şekilde değiştirmelisiniz.

Uygulamanızın targetSdkVersion değeri 29 veya daha yüksekse 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 gizliliğe dayalı çok sayıda değişiklik ve kısıtlama sunar:

  • Cihaz konumuna arka planda erişim
  • Arka plan etkinliği başlangıcı
  • Kişilerin yakın ilgi alanı bilgileri
  • MAC adresi rastgele hale getirme
  • Kamera meta verileri
  • İzin modeli

Bu değişiklikler tüm uygulamaları etkilemekle birlikte kullanıcı gizliliğini iyileştiriyor. Bu değişiklikleri nasıl destekleyeceğinizi öğrenmek için Gizlilikle ilgili değişiklikler sayfasına göz atın.

SDK dışı 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ştiricileri ile ortak çalışmaya 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şikliklerden bazıları sizi hemen etkilemeyebilir. Ancak şu anda bazı SDK olmayan arayüzleri (uygulamanızın hedef API düzeyine bağlı olarak) kullanabilirsiniz. Ancak SDK olmayan herhangi bir yöntem veya alan kullanmak her zaman uygulamanızın bozulma riski taşır.

Uygulamanızın SDK dışı arayüz kullanıp kullanmadığından emin değilseniz öğrenmek için uygulamanızı test edebilirsiniz. Uygulamanız SDK olmayan arayüzleri kullanı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. Bir kullanıcı hareketle gezinmeyi etkinleştirirse bu, 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 hızlıca kaydırırsa sistem, ekranın belirli bölümleri için bu hareketi özel olarak geçersiz kılmadığı sürece bu hareketi Geri'de gezinme olarak yorumlar.

Uygulamanızı hareketle gezinmeyle uyumlu hale getirmek için uygulama içeriğini kenardan kenara genişletmeniz ve çakışan hareketleri uygun şekilde yönetmeniz gerekir. Bilgi için Hareketle gezinme belgelerine bakın.

NDK

Android 10'da 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 yer değiştirme işleminin izin vermediği bir sürümdür. Kod olduğu gibi yüklenmeli ve değiştirilmemelidir. Bu değişiklik, uygulama yüklenme sürelerini ve güvenliği iyileştirir.

SELinux, Android 10 veya sonraki sürümleri hedefleyen uygulamalarda bu kısıtlamayı uygular. Bu uygulamalar, metin yer değiştirme 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, ç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. 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 ifadesinin sembolik bağlantısıdır. Dolayısıyla dlopen(“/system/lib/libc.so”) çalışmaya devam ediyor ancak uygulamalar, /proc/self/maps veya benzer bir kodu okuyarak yüklenen kitaplıkları incelemeye çalıştıklarında farkı bulacak. Bu, olağan değildir ancak bazı uygulamaların, bilgisayar korsanlığı önleme süreçleri kapsamında bunu yaptığını tespit ettik. Böyle bir durumda /apex/… yolları, Bionic dosyaları için geçerli yollar olarak eklenmelidir.

Yalnızca yürütülecek bellekle eşlenen sistem ikili programları/kitaplıkları

Android 10'dan itibaren, sistem ikili programlarının ve kitaplıkların yürütülebilir segmentleri, kod yeniden kullanım saldırılarına karşı bir sağlamlaştırma tekniği olarak yalnızca yürütülebilir belleğe (okunamaz) eşlenir. Uygulamanız hata, güvenlik açığı veya bilinçli bellek denetimi nedeniyle yalnızca yürütülebilir olarak işaretlenen bellek segmentlerinde okuma işlemleri gerçekleştiriyorsa 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 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 denetimi gibi işlemleri gerçekleştirmek amacıyla bu sorunu çözmek için mprotect() çağrısı yaparak yalnızca yürütülen 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ğlar. Bu nedenle, ayarı daha sonra tekrar "yalnızca yürütme" olarak ayarlamanız önerilir.

Güvenlik

Android 10'da 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 bazı önemli ayrıntıları aşağıda bulabilirsiniz:

  • TLS 1.3 şifre paketleri özelleştirilemez. Desteklenen TLS 1.3 şifre paketleri, TLS 1.3 etkinken her zaman etkindir. Bunları setEnabledCipherSuites() çağrısı yaparak devre dışı bırakma girişimleri yoksayılır.
  • TLS 1.3 üzerinde anlaşma sağlandığında HandshakeCompletedListener nesneleri, oturumlar oturum önbelleğine eklenmeden önce çağrılır. (TLS 1.2 ve diğer önceki sürümlerde bu nesneler, oturumlar oturum önbelleğine eklendikten sonra olarak adlandırılır.)
  • Android'in önceki sürümlerinde SSLEngine örneklerinin SSLHandshakeException çalıştırdığı 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") numaralı telefonu arayarak TLS 1.3'ün devre dışı bırakıldığı bir SSLContext alabilirsiniz. Ayrıca, uygun bir nesnede setEnabledProtocols() çağrısı yaparak protokol sürümlerini bağlantı başına ayrı ayrı 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 sertifikalara TLS bağlantılarında güvenilmez. Kök CA'lar 2016'dan beri bu tür sertifikalar yayınlamamıştır ve artık Chrome'da veya diğer büyük tarayıcılarda güvenilmemektedir.

SHA-1 kullanarak sertifika sunan bir siteye bağlantı yapılıyorsa tüm bağlanma denemeleri 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ı kapsamında sertifika isteği mesajı gönderdiğinde kullanıcıların sertifika seçmesine izin verir. 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çilebilen sertifika yoksa, sunucu spesifikasyonuyla eşleşen sertifika olmadığında veya cihazda yüklü sertifika yoksa sertifika seçimi istemi hiç görünmez.

Ayrıca, Android 10 veya sonraki sürümlerde anahtarları veya CA sertifikalarını bir KeyChain nesnesine aktarmak için cihaz ekran kilidinin kullanılmasına gerek yoktur.

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() üzerinden daha doğru arabellek boyutları döndürüyor.
  • TLS_FALLBACK_SCSV şifre paketi, maksimum TLS 1.2 veya üzeri bir protokolle bağlantı denemelerinden çıkarılır. TLS sunucusu uygulamalarındaki iyileştirmeler nedeniyle TLS harici yedeği denemeniz önerilmez. Bunun yerine, TLS sürüm iletişiminin kullanılmasını öneririz.
  • ChaCha20-Poly1305, ChaCha20/Poly1305/NoPadding için kullanılan bir takma addı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 öğesindeki supported_signature_algorithms uzantısı dikkate alınır.
  • Android Anahtar Deposu'ndakiler gibi opak imzalama anahtarları, TLS'de RSA-PSS imzalarıyla kullanılabilir.

Kablosuz doğrudan yayınlar

Android 10'da Wi-Fi Direct ile ilgili aşağıdaki yayınlar sabit değildir:

Uygulamanız yapışkan oldukları için kayıt sırasında bu yayınları almaya güvendiyse bilgi edinmek için başlatma sırasında uygun get() yöntemini kullanın.

Wi-Fi Aware ö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 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. Daha önce bunun bant dışında bildirilmesi (ör. BT veya Wi-Fi Aware katman 2 mesajları kullanılarak) ya da mDNS gibi başka protokoller kullanılarak bant içinde bulunması 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.
  • Kablosuz duyarlı ağ isteğinin bir parçası olarak 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, IPv6'yı ve sunucu tarafından sağlanan bağlantı noktasını almak için Kablosuz Duyarlı ağ isteğinde bulunur:

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şı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 önceki sürümleri çalıştıran Go sürümü bir cihazda çalışan bir uygulama SYSTEM_ALERT_WINDOW iznini alırsa cihaz Android 10'a yükseltilse bile uygulama bu izni korur. Ancak, cihaz yeni sürüme geçirildikten sonra bu izne sahip olmayan uygulamalara izin verilemez.

Go cihazdaki 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() yöntemini çağırırsa yöntem her zaman false (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 uygulamalar için 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 uygulama 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 gereksinimleri 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'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 ikisini de desteklemez.

Uygulama kullanımı

Android 10'da, uygulama kullanımıyla ilgili aşağıdaki davranış değişikliklerini kullanıma sunuyoruz:

  • Kullanım İstatistikleri uygulama kullanımı iyileştirmeleri - Uygulamada 1 veya 2 ayda kullanılıyor bölünmüş uygulama -pencerede ve uygulamalarda Ayrıca Android 10, hazır uygulama kullanımını doğru şekilde izler.

  • uygulama başına gri tonlama -

  • uygulama bazında dikkat dağınıklığı durumu - ayarlanmış uygulamaları ayımlamak ayarlanmış uygulamalar sınırsız uygulamalar ayarlanmış uygulamalar ayarlanmış uygulamalar ayarlanmamış uygulamalar

  • Askıya alma ve oynatma - 1

HTTPS bağlantısı değişiklikleri

Android 10 çalıştıran bir uygulama null öğesini setSSLSocketFactory() içine aktarırsa IllegalArgumentException gerçekleşir. Önceki sürümlerde null öğesinin setSSLSocketFactory() öğesine geçirilmesi, mevcut varsayılan fabrika ayarını iletmeyle aynı etkiye sahipti.

android.preference kitaplığı kullanımdan kaldırıldı

android.preference kitaplığı, Android 10 sürümünden itibaren 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ş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 belgelerimizi inceleyin.

ZIP dosyası yardımcı program kitaplığı değişiklikleri

Android 10, java.util.zip paketindeki ZIP dosyalarını işleyen sınıflarda aşağıdaki değişiklikleri sunar. Bu değişiklikler, kitaplığın davranışının Android ile java.util.zip kullanan diğer platformlar arasında daha tutarlı olmasını sağlar.

Şişirici

Önceki sürümlerde, Inflater sınıfındaki bazı yöntemler end() çağrısından sonra çağrıldığında IllegalStateException hatası veriyordu. Android 10'da, bu yöntemler yerine bir NullPointerException atar.

ZipDosya

Android 10 ve sonraki sürümlerde, sağlanan ZIP dosyası hiçbir dosya içermiyorsa File, int ve Charset türündeki bağımsız değişkenleri alan ZipFile oluşturucusu ZipException atmaz.

ZipÇıktı Akışı

Android 10 ve sonraki sürümlerde ZipOutputStream öğesindeki 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 cihaz gibi mevcut form faktörlerinin genişletilmesiyle birlikte bu durum değişti. Bu cihazlardaki bu varsayım, kamera vizörünün yanlış bir şekilde döndürülmesine veya ölçeklendirilmesine (ya da her ikisine birden) yol açabilir.

API düzeyi 24 veya sonraki sürümleri hedefleyen uygulamalar, android:resizeableActivity öğesini açıkça ayarlamalı ve çok pencereli işlemleri yürütmek için gerekli işlevleri sağlamalıdır.

Pil kullanımını izleme

Android 10'dan itibaren SystemHealthManager, önemli bir şarj işlemi sonrasında cihaz fişe takılı değilse pil kullanımı istatistiklerini sıfırlar. Genel anlamda şarj etme konusunda en önemli olaylardan biri şudur: Cihaz tamamen şarj olmuş veya cihaz çoğu zaman tükenmiş halden çok şarjlı duruma gelmiştir.

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 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'i resmi olarak 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ının isteğe bağlı olarak kullanımına açık olsa da artık aktif geliştirme aşamasında değildir. Bununla birlikte Android, diğer NFC özelliklerini ve API'leri desteklemeye devam edecektir. 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 sondaki sıfırları özel durum olarak 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() işlevinin sonucu, artık boş bir String ("") ile başlamayacak şekilde değiştirildi. Bu durum String.split() alanını da etkiliyor. Örneğin, "x".split("") artık Android'in eski sürümlerinde {"x"} döndürürken eskiden {"", "x"} döndürülüyor. "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şiminin tek ters eğik çizgiyle (yasa dışı) bitmesi durumunda appendReplacement(StringBuffer, String) artık IndexOutOfBoundsException yerine IllegalArgumentException atıyor. Yeni String öğesinin bir $ ile bitmesi durumunda da aynı istisna uygulanır. Daha önce, bu senaryoda herhangi bir istisna yoktu.
  • replaceFirst(null), NullPointerException atarsa artık Matcher uygulamasında reset() yöntemini çağırmıyor. Artık eşleşme olmadığında NullPointerException da atılıyor. Daha önce yalnızca bir maç olduğunda atılı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 bildirir. Daha önce bu yöntemler ArrayIndexOutOfBoundsException hatası veriyordu.

GradientDrawable için varsayılan açı artık TOP_BOTTOM

Android 10'da XML olarak bir GradientDrawable tanımlar ve açı ölçümü sağlamazsanız gradyan yönü varsayılan olarak TOP_BOTTOM olur. Bu, Android'in varsayılan olarak LEFT_RIGHT olduğu önceki Android sürümlerine göre yapılan bir değişikliktir.

Geçici bir çözüm olarak, AAPT2'yi en son sürümüne güncellerseniz açı ölçümü belirtilmemişse 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ı

Android 7.0'dan (API düzeyi 24) itibaren platform, serileştirilebilir nesneler için varsayılan serialVersionUID düzeltmesini yapmıştır. Bu düzeltme, API düzeyi 23 veya altını hedefleyen uygulamaları etkilememiştir.

Android 10'dan başlayarak, API düzeyi 23 veya önceki sürümleri hedefleyen ve eski, yanlış, varsayılan serialVersionUID kullanan bir uygulama varsa sistem bir uyarı günlüğe kaydeder ve bir 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, serialVersionUID öğesini açıkça ayarlamak yerine varsayılan serialVersionUID öğesini 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 günlüğe 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öz konusu sınıftaki bir nesnenin, API düzeyi 23 veya altını hedefleyen bir uygulamada serileştirilmesi halinde nesnenin 24 veya sonraki bir sürümü hedefleyen uygulamalar tarafından (veya bunun tersi) doğru bir şekilde okunması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 hatayı yutmuş, ancak Android 10 bir IOException hatası göndermiştir. Eski davranışa ihtiyacınız varsa yerel kod kullanmanız gerekir.