Davranış değişiklikleri: Android 16 veya sonraki sürümleri hedefleyen uygulamalar

Önceki sürümlerde olduğu gibi Android 16'da da uygulamanızı etkileyebilecek davranış değişiklikleri yer alıyor. Aşağıdaki davranış değişiklikleri yalnızca Android 16 veya sonraki sürümleri hedefleyen uygulamalar için geçerlidir. Uygulamanız Android 16 veya sonraki sürümleri hedefliyorsa geçerli olduğu durumlarda uygulamanızı bu davranışları destekleyecek şekilde değiştirmeniz gerekir.

Uygulamanızın targetSdkVersion sürümünden bağımsız olarak Android 16'da çalışan tüm uygulamaları etkileyen davranış değişiklikleri listesini de incelemeyi unutmayın.

Kullanıcı deneyimi ve sistem kullanıcı arayüzü

Android 16 (API düzeyi 36), daha tutarlı ve sezgisel bir kullanıcı deneyimi sunmak için tasarlanmış aşağıdaki değişiklikleri içerir.

Uçtan uca ekran kapsamı dışında kalma özelliği kullanımdan kaldırılıyor

Android 15 (API düzeyi 35) hedefleyen uygulamalar için Android 15'te tam ekran zorunlu kılındı ancak uygulamanız R.attr#windowOptOutEdgeToEdgeEnforcement değerini true olarak ayarlayarak bu özelliği devre dışı bırakabilir. Android 16'yı (API düzeyi 36) hedefleyen uygulamalarda R.attr#windowOptOutEdgeToEdgeEnforcement desteği sonlandırıldı ve devre dışı bırakıldı. Bu nedenle, uygulamanız uçtan uca ekran özelliğini devre dışı bırakamaz.

  • Uygulamanız Android 16'yı (API düzeyi 36) hedefliyorsa ve Android 15 çalıştıran bir cihazda çalışıyorsa R.attr#windowOptOutEdgeToEdgeEnforcement çalışmaya devam eder.
  • Uygulamanız Android 16'yı (API düzeyi 36) hedefliyorsa ve Android 16 çalıştıran bir cihazda çalışıyorsa R.attr#windowOptOutEdgeToEdgeEnforcement devre dışıdır.

Android 16 Beta 3'te test yapmak için uygulamanızın kenardan kenara ekranı desteklediğinden emin olun ve R.attr#windowOptOutEdgeToEdgeEnforcement kullanımını kaldırarak uygulamanızın Android 15 cihazlarda da kenardan kenara ekranı desteklemesini sağlayın. Kenardan kenara desteği sunmak için Oluşturma ve Görünümler ile ilgili yönergeleri inceleyin.

Tahmini geri arama için taşıma veya devre dışı bırakma işlemi gereklidir

Android 16 (API düzeyi 36) veya sonraki sürümleri hedefleyen ve Android 16 veya sonraki sürümlerin yüklü olduğu bir cihazda çalışan uygulamalarda tahmini geri sistem animasyonları (ana sayfaya geri, görevler arası ve etkinlikler arası) varsayılan olarak etkindir. Ayrıca onBackPressed çağrılmaz ve KeyEvent.KEYCODE_BACK artık gönderilmez.

Uygulamanız geri etkinliğini durduruyorsa ve henüz tahmini geri özelliğine geçmediyseniz uygulamanızı, desteklenen geri gezinme API'lerini kullanacak şekilde güncelleyin veya uygulamanızın AndroidManifest.xml dosyasının <application> veya <activity> etiketinde android:enableOnBackInvokedCallback özelliğini false olarak ayarlayarak geçici olarak devre dışı bırakın.

Tahmine dayalı geri hareketi animasyonu.
Tahmine dayalı etkinlik arası animasyon.
Tahmine dayalı görevler arası animasyon.

Elegant yazı tipi API'leri kullanımdan kaldırıldı ve devre dışı bırakıldı

Android 15'i (API düzeyi 35) hedefleyen uygulamalarda elegantTextHeight TextView özelliği varsayılan olarak true olarak ayarlanır. Bu sayede, kompakt yazı tipi çok daha okunaklı bir yazı tipiyle değiştirilir. elegantTextHeight özelliğini false olarak ayarlayarak bu ayarı geçersiz kılabilirsiniz.

Android 16'da elegantTextHeight özelliğinin desteği sonlandırılmıştır. Uygulamanız Android 16'yı hedeflediğinde bu özellik göz ardı edilir. Bu API'ler tarafından kontrol edilen "kullanıcı arayüzü yazı tipleri" kullanımdan kaldırılıyor. Bu nedenle, Arapça, Lao, Myanmar, Tamil, Guceratça, Kannada, Malayalam, Odia, Telugu veya Tayca dillerinde tutarlı ve geleceğe hazır metin oluşturma sağlamak için tüm düzenleri uyarlamanız gerekir.

Android 14 (API düzeyi 34) ve önceki sürümleri hedefleyen uygulamalar veya Android 15 (API düzeyi 35)'i hedefleyen ve elegantTextHeight özelliğini false olarak ayarlayarak varsayılan ayarı geçersiz kılan uygulamalar için
elegantTextHeight davranışı.
elegantTextHeight Android 16'yı hedefleyen uygulamalar veya elegantTextHeight özelliğini false olarak ayarlayarak varsayılan değeri geçersiz kılmayan Android 15'i (API düzeyi 35) hedefleyen uygulamalar için davranış.

Temel işlevler

Android 16 (API düzeyi 36), Android sisteminin çeşitli temel özelliklerini değiştiren veya genişleten aşağıdaki değişiklikleri içerir.

Sabit ücretli iş planlama optimizasyonu

Android 16'yı hedeflemeden önce, scheduleAtFixedRate geçerli bir işlem yaşam döngüsü dışında olduğu için bir görev yürütmeyi kaçırdığında, uygulama geçerli bir yaşam döngüsüne döndüğünde tüm kaçırılan yürütmeler hemen yürütülür.

Android 16'yı hedeflerken, uygulama geçerli bir yaşam döngüsüne döndüğünde en fazla bir scheduleAtFixedRate yürütme işleminin eksikliği hemen yürütülür. Bu davranış değişikliğinin uygulama performansını iyileştirmesi bekleniyor. Uygulamanızın etkilenip etkilenmediğini kontrol etmek için uygulamanızda bu davranışı test edin. Uygulama uyumluluk çerçevesini kullanarak ve STPE_SKIP_MULTIPLE_MISSED_PERIODIC_TASKS uyumluluk işaretini etkinleştirerek de test yapabilirsiniz.

Cihaz form faktörleri

Android 16 (API düzeyi 36), büyük ekranlı cihazlarda gösterilen uygulamalar için aşağıdaki değişiklikleri içerir.

Uyarlanabilir düzenler

Android uygulamaları artık çeşitli cihazlarda (telefonlar, tabletler, katlanabilir cihazlar, masaüstü bilgisayarlar, arabalar ve TV'ler gibi) ve büyük ekranlarda pencere modlarında (bölünmüş ekran ve masaüstü pencere modu gibi) çalıştığından, geliştiriciler cihaz yöneliminden bağımsız olarak her ekran ve pencere boyutuna uyum sağlayan Android uygulamaları oluşturmalıdır. Yön kısıtlaması ve yeniden boyutlandırılabilirlik gibi paradigmalar, günümüzün çok cihazlı dünyasında çok kısıtlayıcı.

Yön, yeniden boyutlandırılabilirlik ve en boy oranı kısıtlamalarını yoksayma

Android 16 (API düzeyi 36) hedefleyen uygulamalar için Android 16, sistemin yön, yeniden boyutlandırma ve en boy oranı kısıtlamalarını yönetme şekliyle ilgili değişiklikler içerir. En küçük genişliği >= 600 dp olan ekranlarda kısıtlamalar artık geçerli değildir. Ayrıca, uygulamalar en boy oranına veya kullanıcının tercih ettiği yönde bakılmaksızın ekran penceresinin tamamını doldurur ve dikey kenarlık kullanılmaz.

Bu değişiklik, yeni bir standart platform davranışı sunar. Android, uygulamaların çeşitli yönlere, ekran boyutlarına ve en boy oranlarına uyum sağlaması beklenen bir modele doğru ilerliyor. Sabit yön veya sınırlı yeniden boyutlandırma gibi kısıtlamalar, uygulamanın uyarlanabilirliğini engeller. Bu nedenle, mümkün olan en iyi kullanıcı deneyimini sunmak için uygulamanızı uyarlanabilir hale getirmenizi öneririz.

Uygulama uyumluluk çerçevesini kullanarak ve UNIVERSAL_RESIZABLE_BY_DEFAULT uyumluluk işaretini etkinleştirerek de bu davranışı test edebilirsiniz.

Sık karşılaşılan zarar veren değişiklikler

Yön, yeniden boyutlandırılabilirlik ve en boy oranı kısıtlamaları göz ardı edildiğinde, uygulamanızın kullanıcı arayüzü bazı cihazlarda, özellikle de dikey yönde kilitli küçük düzenler için tasarlanmış öğeler etkilenebilir. Örneğin, gerilmiş düzenler, ekran dışı animasyonlar ve bileşenler gibi sorunlar ortaya çıkabilir. En boy oranı veya yönle ilgili varsayımların hepsi uygulamanızda görsel sorunlara neden olabilir. Bu sorunların nasıl önleneceği ve uygulamanızın uyarlanabilir davranışının nasıl iyileştirileceği hakkında daha fazla bilgi edinin.

Cihaz rotasyonuna izin vermek, daha fazla etkinliğin yeniden oluşturulmasına neden olur. Bu da, düzgün şekilde korunmazsa kullanıcı durumunun kaybedilmesine yol açabilir. Kullanıcı arayüzü durumlarını kaydetme başlıklı makalede, kullanıcı arayüzü durumunu nasıl doğru şekilde kaydedeceğinizi öğrenin.

Uygulama ayrıntıları

Aşağıdaki manifest özellikleri ve çalışma zamanı API'leri, tam ekran ve çok pencereli modlarda büyük ekranlı cihazlarda yoksayılır:

screenOrientation, setRequestedOrientation() ve getRequestedOrientation() için aşağıdaki değerler yoksayılır:

  • portrait
  • reversePortrait
  • sensorPortrait
  • userPortrait
  • landscape
  • reverseLandscape
  • sensorLandscape
  • userLandscape

Görüntü yeniden boyutlandırılabilirliği açısından android:resizeableActivity="false", android:minAspectRatio ve android:maxAspectRatio'nin hiçbir etkisi yoktur.

Android 16'yı (API düzeyi 36) hedefleyen uygulamalarda, uygulama yönü, yeniden boyutlandırılabilirlik ve en boy oranı kısıtlamaları büyük ekranlarda varsayılan olarak yoksayılır. Ancak tam olarak hazır olmayan her uygulama, bu özelliği devre dışı bırakarak bu davranışı geçici olarak geçersiz kılabilir (bu da uygulamanın uyumluluk moduna yerleştirildiği önceki davranışa neden olur).

İstisnalar

Android 16 yön, yeniden boyutlandırma ve en boy oranı kısıtlamaları aşağıdaki durumlarda geçerli değildir:

  • Oyunlar (android:appCategory işaretine göre)
  • Kullanıcıların, cihazın en boy oranı ayarlarında uygulamanın varsayılan davranışını açıkça etkinleştirmesi
  • sw600dp'ten küçük ekranlar

Özelliği geçici olarak devre dışı bırakma

Belirli bir etkinliği kapsam dışında bırakmak için PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY manifest mülkünü tanımlayın:

<activity ...>
  <property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
  ...
</activity>

Uygulamanızın çok fazla bölümü Android 16 için hazır değilse aynı özelliği uygulama düzeyinde uygulayarak özelliği tamamen devre dışı bırakabilirsiniz:

<application ...>
  <property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
</application>

Sağlık ve fitness

Android 16 (API düzeyi 36), sağlık ve fitness verileriyle ilgili aşağıdaki değişiklikleri içerir.

Sağlık ve fitness izinleri

Android 16 (API düzeyi 36) veya sonraki sürümleri hedefleyen uygulamalar için BODY_SENSORS izinleri, Health Connect tarafından da kullanılan android.permissions.health altındaki ayrıntılı izinlere geçiriliyor. Daha önce BODY_SENSORS veya BODY_SENSORS_BACKGROUND iznini gerektiren tüm API'ler artık ilgili android.permissions.health iznini gerektiriyor. Bu durum aşağıdaki veri türlerini, API'leri ve ön plan hizmeti türlerini etkiler:

Uygulamanız bu API'leri kullanıyorsa artık ilgili ayrıntılı izinleri istemelidir:

Bu izinler, sağlık, fitness ve sağlıklı yaşam verileri için Android veri deposu olan Health Connect'ten veri okuma erişimini koruyan izinlerle aynıdır.

Mobil uygulamalar

READ_HEART_RATE ve diğer ayrıntılı izinleri kullanmaya geçen mobil uygulamalar, uygulamanın gizlilik politikasını görüntülemek için bir etkinlik de beyan etmelidir. Bu, Health Connect ile aynı koşuldur.

Bağlantı

Android 16 (API düzeyi 36), çevre birimleri ile bağlantıyı iyileştirmek için Bluetooth yığınında aşağıdaki değişiklikleri içerir.

Bağ kaybı ve şifreleme değişikliklerini işlemek için yeni intent'ler

Daha iyi bağ kaybı yönetimi kapsamında Android 16, uygulamalara bağ kaybı ve şifreleme değişiklikleri hakkında daha fazla bilgi sağlamak için 2 yeni intent de sunar.

Android 16'yı hedefleyen uygulamalar artık:

  • Uzaktan bağ kaybı algılandığında ACTION_KEY_MISSING intent'i alır. Bu sayede daha bilgilendirici kullanıcı geri bildirimleri sağlayabilir ve uygun işlemleri yapabilirler.
  • Bağlantının şifreleme durumu değiştiğinde bir ACTION_ENCRYPTION_CHANGE intent'i alın. Şifreleme durumu değişikliği, şifreleme algoritması değişikliği ve şifreleme anahtarı boyutu değişikliği buna dahildir. Uygulamalar, daha sonra ACTION_ENCRYPTION_CHANGE intent'i aldıktan sonra bağlantı başarıyla şifrelenirse bağın geri yüklendiğini dikkate almalıdır.

Uygulamanız şu anda bağ kaybıyla ilgili işlemler için özel mekanizmalar kullanıyorsa bağ kaybı etkinliklerini algılayıp yönetmek için yeni intent'e ACTION_KEY_MISSING geçin. Uygulamanızın, cihazı unutma ve yeniden eşleme işlemini başlatmadan önce kullanıcıyı uzak cihazın menzilde olduğunu onaylamaya yönlendirmesini öneririz.

Ayrıca, ACTION_KEY_MISSING intent'i alındıktan sonra bir cihazın bağlantısı kesilirse uygulamanız, cihaz artık sistemle bağlı olmayabileceğinden cihaza yeniden bağlanırken dikkatli olmalıdır.

Güvenlik

Android 16 (API düzeyi 36), aşağıdaki güvenlik değişikliklerini içerir.

MediaStore sürüm kilidi

Android 16 veya sonraki sürümleri hedefleyen uygulamalarda MediaStore#getVersion() artık her uygulamaya özgü olacak. Bu sayede, kötüye kullanımı ve parmak izi teknikleri için kullanımını önlemek amacıyla sürüm dizesinden tanımlayıcı özellikler kaldırılır. Uygulamalar bu sürümün biçimiyle ilgili herhangi bir varsayıma kapılmamalıdır. Uygulamalar, bu API'yi kullanırken sürüm değişikliklerini zaten ele almalıdır. Geliştirici, bu API'nin amaçlanan kapsamının dışında ek bilgiler elde etmeye çalışmadığı sürece çoğu durumda mevcut davranışlarını değiştirmeleri gerekmez.

Gizlilik

Android 16 (API düzeyi 36), aşağıdaki gizlilik değişikliklerini içerir.

Yerel Ağ İzni

LAN'daki cihazlara INTERNET iznine sahip tüm uygulamalar erişebilir. Bu, uygulamaların yerel cihazlara bağlanmasını kolaylaştırır ancak kullanıcının parmak izini oluşturma ve konum için proxy olma gibi gizlilik etkileri de vardır.

Yerel Ağ Korumaları projesi, yerel ağa erişimi yeni bir çalışma zamanında izinle sınırlayarak kullanıcının gizliliğini korumayı amaçlar.

Yayın planı

Bu değişiklik, sırasıyla 25. yılın 2. çeyreği ve TBD olmak üzere iki sürüm arasında dağıtılacaktır. Bu korumalar daha sonraki bir Android sürümünde zorunlu kılınacağından geliştiricilerin 2025'in 2. çeyreğinde bu yönergelere uyması ve geri bildirim paylaşması zorunludur. Ayrıca, aşağıdaki kılavuzu kullanarak, kullanıcının yeni izni reddetmesine ve iptal etmesine hazırlanmak için, yerel ağ erişimine bağlı olan senaryolar güncellenmelidir.

Etki

LNP şu aşamada etkinleştirme gerektiren bir özelliktir. Bu nedenle, yalnızca etkinleştirilen uygulamalar etkilenecektir. Etkinleştirme aşamasının amacı, uygulama geliştiricilerin uygulamalarının hangi bölümlerinin dolaylı yerel ağ erişimine bağlı olduğunu anlayarak bir sonraki sürümde bu bölümleri izin korumasına hazırlamalarını sağlamaktır.

Aşağıdakileri kullanarak kullanıcının yerel ağına erişen uygulamalar etkilenecektir:

  • Yerel ağ adreslerinde ham soketlerin doğrudan veya kitaplık kullanımı (ör. mDNS veya SSDP hizmet keşfi protokolü)
  • Yerel ağa erişen çerçeve düzeyinde sınıfların kullanılması (ör. NsdManager)

Yerel ağ adresine gelen ve giden trafik için yerel ağ erişimi izni gerekir. Aşağıdaki tabloda sık karşılaşılan bazı durumlar listelenmiştir:

Uygulama Düşük Seviye Ağ İşlemi Yerel Ağ İzni Gerekiyor
Giden TCP bağlantısı oluşturma evet
Gelen TCP bağlantılarını kabul etme evet
UDP tekil yayın, çoklu yayın, yayın gönderme evet
Gelen UDP tekil yayın, çoklu yayın, anons alma evet

Bu kısıtlamalar ağ yığınının derinliklerine uygulandığından tüm ağ API'leri için geçerlidir. Yerel veya yönetilen kodda oluşturulan soketler, Cronet ve OkHttp gibi ağ kitaplıkları ve bunların üzerine uygulanan tüm API'ler buna dahildir. Yerel ağdaki hizmetleri (ör. .local son eki olan hizmetler) çözmeye çalışmak için yerel ağ izni gerekir.

Yukarıdaki kurallara istisnalar:

  • Bir cihazın DNS sunucusu yerel ağdaysa bu sunucuya gelen veya sunucudan giden trafik (53 numaralı bağlantı noktasında) için yerel ağ erişim izni gerekmez.
  • Uygulama içi seçici olarak Çıkış Değiştirici'yi kullanan uygulamaların yerel ağ izinlerine ihtiyacı yoktur (2025'in 4. çeyreğinde daha fazla bilgi sağlanacaktır).

Geliştirici Rehberi (Etkinleştirme)

Yerel ağ kısıtlamalarını etkinleştirmek için aşağıdakileri yapın:

  1. Cihazı 25Q2 Beta 3 veya sonraki bir sürüme flaşlayın.
  2. Test edilecek uygulamayı yükleyin.
  3. adb'de Appcompat işaretini etkinleştirin veya devre dışı bırakın:

    adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
    
  4. Cihazı yeniden başlatın

Artık uygulamanızın yerel ağa erişimi kısıtlanmış durumdadır ve yerel ağa erişme girişimleri soket hatalarına neden olur. Uygulama sürecinizin dışında yerel ağ işlemleri gerçekleştiren API'ler (ör. NsdManager) kullanıyorsanız bu API'ler etkinleştirme aşamasında etkilenmeyecektir.

Erişimi geri yüklemek için uygulamanıza NEARBY_WIFI_DEVICES izni vermeniz gerekir.

  1. Uygulamanın manifest dosyasında NEARBY_WIFI_DEVICES iznini beyan ettiğinden emin olun.
  2. Ayarlar > Uygulamalar > [Uygulama Adı] > İzinler > Yakındaki cihazlar > İzin ver'e gidin.

Artık uygulamanızın yerel ağa erişimi geri yüklenecektir ve tüm senaryolarınız, uygulamayı etkinleştirmeden önceki gibi çalışacaktır.

Yerel ağ koruması yaptırımı başladıktan sonra uygulamanın ağ trafiği aşağıdaki şekilde etkilenir.

İzin Giden LAN İsteği Giden/Gelen İnternet İsteği Gelen LAN İsteği
Verildi Works Works Works
İzin Verilmedi Başarısızlar Works Başarısızlar

Uygulama uyumluluğu işaretini kapatmak için aşağıdaki komutu kullanın

adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>

Hatalar

Bu kısıtlamalardan kaynaklanan hatalar, yerel bir ağ adresine gönderme veya gönderme varyantı çağrısında bulunduğunda çağıran sokete döndürülür.

Örnek hatalar:

sendto failed: EPERM (Operation not permitted)

sendto failed: ECONNABORTED (Operation not permitted)

Yerel Ağ Tanımı

Bu projede yerel ağ, kablosuz veya Ethernet gibi yayın yapmaya uygun bir ağ arayüzü kullanan ancak hücresel (WWAN) veya VPN bağlantılarını hariç tutan bir IP ağını ifade eder.

Aşağıdakiler yerel ağ olarak kabul edilir:

IPv4:

  • 169.254.0.0/16 // Bağlantı Yerel
  • 100.64.0.0/10 // CGNAT
  • 10.0.0.0/8 // RFC1918
  • 172.16.0.0/12 // RFC1918
  • 192.168.0.0/16 // RFC1918

IPv6:

  • Bağlantı yerel
  • Doğrudan bağlı rotalar
  • Thread gibi stub ağları
  • Birden fazla alt ağ (TBD)

Ayrıca hem çoklu yayın adresleri (224.0.0.0/4, ff00::/8) hem de IPv4 yayın adresi (255.255.255.255) yerel ağ adresleri olarak sınıflandırılır.