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 vardır. 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 bu davranışları destekleyecek şekilde uygulamanızı değiştirmeniz gerekir.

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

Kullanıcı deneyimi ve sistem arayüzü

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

Uçtan uca kapsamı dışında kalmayı seçme seçeneği kaldırılıyor

Android 15, Android 15'i (API düzeyi 35) hedefleyen uygulamalar için uçtan uca görünümü zorunlu kıldı ancak uygulamanız R.attr#windowOptOutEdgeToEdgeEnforcement değerini true olarak ayarlayarak kapsamı dışında kalmayı seçebilir. Android 16'yı (API düzeyi 36) hedefleyen uygulamalarda R.attr#windowOptOutEdgeToEdgeEnforcement desteği sonlandırılmış ve devre dışı bırakılmıştır. Uygulamanız, uçtan uca ekran özelliğinin kapsamı dışında kalmayı seçemez.

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

Android 16'da test etmek için uygulamanızın uçtan uca ekranı desteklediğinden emin olun ve R.attr#windowOptOutEdgeToEdgeEnforcement kullanımını kaldırın. Böylece uygulamanız Android 15 cihazlarda da uçtan uca ekranı destekler. Uçtan uca ekranı desteklemek için Compose ve Görünümler kılavuzuna bakın.

Tahmin edilen geri gitme için taşıma veya kapsam dışında kalmayı seçme gerekiyor

Android 16'yı (API düzeyi 36) veya sonraki sürümleri hedefleyen ve Android 16 ya da sonraki sürümlerin yüklü olduğu cihazlarda çalışan uygulamalarda, tahmin edilen geri gitme sistem animasyonları (ana sayfaya geri gitme, görevler arası geçiş ve etkinlikler arası geçiş) varsayılan olarak etkinleştirilir. Ayrıca onBackPressed çağrılmaz ve KeyEvent.KEYCODE_BACK artık gönderilmez.

Uygulamanız geri gitme etkinliğini engelliyorsa ve henüz tahmin edilen geri gitme özelliğine geçiş yapmadıysanız uygulamanızı desteklenen geri gezinme API'lerini kullanacak şekilde güncelleyin veya uygulamanızın AndroidManifest.xml dosyasındaki <application> ya da <activity> etiketinde android:enableOnBackInvokedCallback özelliğini false olarak ayarlayarak geçici olarak devre dışı bırakın.

Tahmin edilen geri gitme animasyonu.
Tahmin edilen etkinlikler arası animasyon.
Tahmine dayalı görevler arası animasyon.

Zarif yazı tipi API'lerinin desteği sonlandı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 şeklinde ayarlanır. Bu sayede, kompakt yazı tipi çok daha okunabilir bir yazı tipiyle değiştirilir. elegantTextHeight özelliğini false olarak ayarlayarak bu durumu geçersiz kılabilirsiniz.

Android 16, elegantTextHeight özelliğinin desteğini sonlandırır. Uygulamanız Android 16'yı hedeflediğinde bu özellik yoksayılır. Bu API'ler tarafından kontrol edilen "UI fonts" desteği sonlandırılıyor. Bu nedenle, Arapça, Lao, Myanmar, Tamil, Gujarati, Kannada, Malayalam, Odia, Telugu veya Tayca dillerinde tutarlı ve gelecekte de geçerli olacak metin oluşturma için tüm düzenleri uyarlamanız gerekir.

Android 14'ü (API düzeyi 34) ve önceki sürümleri hedefleyen uygulamalarda veya elegantTextHeight özelliğini false olarak ayarlayarak varsayılan davranışı geçersiz kılan Android 15'i (API düzeyi 35) hedefleyen uygulamalarda
elegantTextHeight davranışı.
Android 16'yı (API düzeyi 36) hedefleyen uygulamalar veya elegantTextHeight özelliğini false olarak ayarlayarak varsayılanı geçersiz kılmayan Android 15'i (API düzeyi 35) hedefleyen uygulamalar için
elegantTextHeight 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 çalışma planlaması 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örüntülenen uygulamalar için aşağıdaki değişiklikleri içerir.

Uyarlanabilir düzenler

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

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

Android 16'yı (API düzeyi 36) hedefleyen uygulamalarda, en küçük genişliği 600 dp'den büyük olan ekranlarda yön, yeniden boyutlandırılabilirlik ve en-boy oranı kısıtlamaları artık geçerli değildir. Uygulamalar, en boy oranına veya kullanıcının tercih ettiği yöne bakılmaksızın tüm ekran penceresini doldurur ve dikey kenar boşluğu 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ının beklendiği bir modele doğru ilerliyor. Sabit yön veya sınırlı yeniden boyutlandırma gibi kısıtlamalar, uygulamanın uyarlanabilirliğini engeller. Mümkün olan en iyi kullanıcı deneyimini sunmak için uygulamanızı uyarlanabilir hale getirin.

Bu davranışı, uygulama uyumluluk çerçevesini kullanarak ve UNIVERSAL_RESIZABLE_BY_DEFAULT uyumluluk işaretini etkinleştirerek de 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ının yoksayılması, uygulamanızın kullanıcı arayüzünü bazı cihazlarda etkileyebilir. Bu durum özellikle dikey yönde kilitli küçük düzenler için tasarlanmış öğeleri (ör. uzatılmış düzenler, ekran dışı animasyonlar ve bileşenler gibi sorunlar) etkileyebilir. En boy oranı veya yönle ilgili varsayımlar, uygulamanızda görsel sorunlara neden olabilir. Bu sorunları nasıl önleyeceğiniz ve uygulamanızın uyarlanabilir davranışını nasıl iyileştireceğiniz hakkında daha fazla bilgi edinin.

Cihazın döndürülmesine izin verilmesi, daha fazla etkinliğin yeniden oluşturulmasına neden olur. Bu da düzgün şekilde korunmadığı takdirde kullanıcı durumunun kaybedilmesine yol açabilir. Kullanıcı arayüzü durumunu doğru şekilde kaydetmeyi Kullanıcı arayüzü durumlarını kaydetme bölümünden öğrenebilirsiniz.

Uygulama ayrıntıları

Aşağıdaki manifest özellikleri ve çalışma zamanı API'leri, tam ekran ve çoklu pencere modlarında 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

Ekranı yeniden boyutlandırma konusunda 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. Tam olarak hazır olmayan her uygulama, kapsam dışında kalmayı seçerek bu davranışı geçici olarak geçersiz kılabilir. Bu durumda, uyumluluk moduna yerleştirilme şeklindeki önceki davranış geçerli olur.

İstisnalar

Android 16'daki yön, yeniden boyutlandırılabilirlik 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 boyutundan küçük ekranlar

Geçici olarak devre dışı bırakma

Belirli bir etkinliği devre dışı bırakmak için PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY manifest özelliğini beyan edin:

<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'ya hazır değilse aynı özelliği uygulama düzeyinde uygulayarak 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 uygulamalarda BODY_SENSORS izinleri, android.permissions.health altında Health Connect'in de kullandığı daha ayrıntılı izinler kullanır. Android 16'dan itibaren, 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 hizmet türlerini etkiler:

Uygulamanız bu API'leri kullanıyorsa 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'teki verileri okuma erişimini koruyan izinlerle aynıdır.

Mobil uygulamalar

READ_HEART_RATE ve diğer ayrıntılı izinleri kullanmaya geçiş yapan mobil uygulamaların, uygulamanın gizlilik politikasını göstermek için bir etkinlik beyan etmesi de gerekir. Bu, Health Connect ile aynı şarttır.

Bağlantı

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

Bağlantı kaybını 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.

Farklı OEM uygulamalarında uyum sağlama

Android 16 bu yeni intent'leri kullanıma sunsa da bunların uygulanması ve yayınlanması farklı cihaz üreticilerine (OEM'ler) göre değişiklik gösterebilir. Uygulamanızın tüm cihazlarda tutarlı ve güvenilir bir deneyim sunmasını sağlamak için geliştiricilerin, bağlantı kaybı işlemelerini bu olası varyasyonlara sorunsuz bir şekilde uyum sağlayacak şekilde tasarlamaları gerekir.

Aşağıdaki uygulama davranışlarını öneririz:

  • ACTION_KEY_MISSING intent'i yayınlanırsa:

    ACL (Asenkron Bağlantısız) bağlantısının bağlantısı sistem tarafından kesilir ancak cihazın bağ bilgileri saklanır (burada açıklandığı gibi).

    Uygulamanız, bağlantı kaybı algılama için birincil sinyal olarak bu intent'i kullanmalı ve cihazı unutma veya yeniden eşleme işlemini başlatmadan önce kullanıcıyı uzak cihazın kapsama alanında olduğunu onaylamasına yönlendirmelidir.

    Bir cihaz ACTION_KEY_MISSING alındıktan sonra bağlantısını keserse uygulamanız, cihaz artık sistemle bağlı olmayabileceğinden yeniden bağlantı kurarken dikkatli olmalıdır.

  • ACTION_KEY_MISSING intent'i yayınlanmıyorsa:

    ACL bağlantısı bağlı kalır ve Android 15'teki davranışla aynı şekilde cihazın bağ bilgileri sistem tarafından kaldırılır.

    Bu senaryoda, uygulamanız, bağ kaybı etkinliklerini algılayıp yönetmek için önceki Android sürümlerindeki mevcut bağ kaybı işleme mekanizmalarını kullanmaya devam etmelidir.

Bluetooth bağlantısını kaldırmanın yeni yolu

Android 16'yı hedefleyen tüm uygulamalar artık CompanionDeviceManager'teki herkese açık bir API'yi kullanarak Bluetooth cihazlarının eşlemesini kaldırabilir. Bir tamamlayıcı cihaz CDM ilişkisi olarak yönetiliyorsa uygulama, ilişkili cihazdaki yeni removeBond(int) API'yi kullanarak Bluetooth bağını kaldırmayı tetikleyebilir. Uygulama, Bluetooth cihaz yayın etkinliğini dinleyerek ACTION_BOND_STATE_CHANGED bağ durumu değişikliklerini izleyebilir.

Güvenlik

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

MediaStore sürümünü kilitleme

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.

Daha Güvenli Intent'ler

Safer Intents özelliği, Android'in intent çözümleme mekanizmasının güvenliğini artırmak için tasarlanmış çok aşamalı bir güvenlik girişimidir. Amaç, intent işleme sırasında kontroller ekleyerek ve belirli ölçütleri karşılamayan intent'leri filtreleyerek uygulamaları kötü amaçlı eylemlerden korumaktır.

Android 15'te bu özellik, gönderen uygulamaya odaklanıyordu. Android 16'da ise kontrol, alan uygulamaya geçiyor. Böylece geliştiriciler, uygulama manifestlerini kullanarak katı intent çözümlemeyi etkinleştirebiliyor.

İki önemli değişiklik yapılıyor:

  1. Belirgin Intent'ler, Hedef Bileşenin Intent Filtresiyle Eşleşmelidir: Bir Intent açıkça bir bileşeni hedefliyorsa o bileşenin Intent filtresiyle eşleşmelidir.

  2. İşlem içermeyen intent'ler hiçbir intent filtresiyle eşleşemez: İşlem belirtilmeyen intent'ler hiçbir intent filtresiyle çözümlenmemelidir.

Bu değişiklikler yalnızca birden fazla uygulama söz konusu olduğunda geçerlidir ve tek bir uygulama içindeki intent işlemeyi etkilemez.

Etki

Bu özelliğin etkinleştirilmesi için geliştiricilerin uygulama manifestinde özelliği açıkça etkinleştirmesi gerekir. Bu nedenle, özelliğin etkisi yalnızca aşağıdaki geliştiricilerin uygulamalarıyla sınırlı olacaktır:

  • Daha Güvenli Intent'ler özelliği ve avantajları hakkında bilgi sahibi olma
  • Uygulamalarında daha katı intent işleme uygulamalarını kullanmayı etkin bir şekilde tercih etmelidir.

Bu etkinleştirme yaklaşımı, mevcut daha az güvenli intent çözümleme davranışına bağlı olabilecek mevcut uygulamaların bozulma riskini en aza indirir.

Android 16'daki ilk etki sınırlı olsa da Safer Intents girişimi, gelecekteki Android sürümlerinde daha geniş bir etki yaratacak bir yol haritasına sahiptir. Zaman içinde katı niyet çözümlemeyi varsayılan davranış hâline getirmeyi planlıyoruz.

Daha Güvenli Intent'ler özelliği, kötü amaçlı uygulamaların intent çözümleme mekanizmasındaki güvenlik açıklarından yararlanmasını zorlaştırarak Android ekosisteminin güvenliğini önemli ölçüde artırabilir.

Ancak kapsam dışında kalmayı seçme ve zorunlu yaptırıma geçiş, mevcut uygulamalarla ilgili olası uyumluluk sorunlarını gidermek için dikkatli bir şekilde yönetilmelidir.

Uygulama

Geliştiricilerin, uygulama manifestlerinde intentMatchingFlags özelliğini kullanarak daha katı intent eşlemeyi açıkça etkinleştirmeleri gerekir. Aşağıda, özelliğin tüm uygulama için etkinleştirildiği ancak bir alıcıda devre dışı bırakıldığı/kapsamı dışında kalmayı seçildiği bir örnek verilmiştir:

<application android:intentMatchingFlags="enforceIntentFilter">
    <receiver android:name=".MyBroadcastReceiver" android:exported="true" android:intentMatchingFlags="none">
        <intent-filter>
            <action android:name="com.example.MY_CUSTOM_ACTION" />
        </intent-filter>
        <intent-filter>
            <action android:name="com.example.MY_ANOTHER_CUSTOM_ACTION" />
        </intent-filter>
    </receiver>
</application>

Desteklenen işaretler hakkında daha fazla bilgi:

İşaret Adı Açıklama
enforceIntentFilter Gelen intent'ler için daha katı eşleştirme uygular.
yok Gelen amaçlar için tüm özel eşleme kurallarını devre dışı bırakır. Birden fazla işaret belirtildiğinde, çakışan değerler "none" işaretine öncelik verilerek çözülür.
allowNullAction Eşleşme kurallarını esneterek işlem içermeyen niyetlerin eşleşmesine izin verir. Bu işaret, belirli bir davranışı elde etmek için "enforceIntentFilter" ile birlikte kullanılır.

Test ve Hata Ayıklama

Yaptırım etkin olduğunda, intent'i çağıran taraf intent'i doğru şekilde doldurmuşsa uygulamalar düzgün çalışmalıdır. Ancak engellenen intent'ler, "PackageManager." etiketiyle "Intent does not match component's intent filter:" ve "Access blocked:" gibi uyarı günlüğü mesajlarını tetikler. Bu, uygulamayı etkileyebilecek ve dikkat edilmesi gereken olası bir sorunu gösterir.

Logcat filtresi:

tag=:PackageManager & (message:"Intent does not match component's intent filter:" | message: "Access blocked:")

GPU sistem çağrısı filtreleme

Mali GPU yüzeyini sağlamlaştırmak için kullanımdan kaldırılan veya yalnızca GPU geliştirmesi için tasarlanan Mali GPU IOCTL'leri üretim derlemelerinde engellenmiştir. Ayrıca, GPU profil oluşturma için kullanılan IOCTL'ler kabuk işlemi veya hata ayıklanabilir uygulamalarla sınırlandırılmıştır. Platform düzeyindeki politika hakkında daha fazla bilgi için SAC güncellemesine bakın.

Bu değişiklik, Mali GPU'yu kullanan Pixel cihazlarda (Pixel 6-9) gerçekleşir. Arm, r54p2 sürümündeki Documentation/ioctl-categories.rst dosyasında IOCTL'lerinin resmi sınıflandırmasını sağlamıştır. Bu liste, gelecekteki sürücü sürümlerinde güncellenmeye devam edecektir.

Bu değişiklik, desteklenen grafik API'lerini (Vulkan ve OpenGL dahil) etkilemez ve geliştiricileri veya mevcut uygulamaları etkilemesi beklenmez. Streamline Performance Analyzer ve Android GPU Inspector gibi GPU profili oluşturma araçları bu durumdan etkilenmez.

Test

Aşağıdakine benzer bir SELinux reddi görüyorsanız uygulamanız bu değişiklikten etkilenmiş olabilir:

06-30 10:47:18.617 20360 20360 W roidJUnitRunner: type=1400 audit(0.0:85): avc:  denied  { ioctl }
for  path="/dev/mali0" dev="tmpfs" ino=1188 ioctlcmd=0x8023
scontext=u:r:untrusted_app_25:s0:c512,c768 tcontext=u:object_r:gpu_device:s0 tclass=chr_file
permissive=0 app=com.google.android.selinux.pts

Uygulamanızın engellenen IOCTL'leri kullanması gerekiyorsa lütfen bir hata bildiriminde bulunun ve bu bildirimi android-partner-security@google.com adresine atayın.

SSS

  1. Bu politika değişikliği tüm OEM'ler için geçerli mi? Bu değişiklik isteğe bağlı olacak ancak bu sağlamlaştırma yöntemini kullanmak isteyen tüm OEM'ler tarafından kullanılabilecek. Değişikliği uygulama talimatlarını uygulama belgelerinde bulabilirsiniz.

  2. Bunu uygulamak için OEM kod tabanında değişiklik yapmak zorunlu mu yoksa varsayılan olarak yeni bir AOSP sürümüyle birlikte mi geliyor? Platform düzeyindeki değişiklik, varsayılan olarak yeni bir AOSP sürümüyle birlikte sunulacak. Tedarikçiler, bu değişikliği uygulamak isterlerse kod tabanlarında etkinleştirebilirler.

  3. IOCTL listesinin güncel tutulmasından SoC'ler mi sorumludur? Örneğin, cihazım ARM Mali GPU kullanıyorsa değişiklikler için ARM ile iletişime geçmem gerekir mi? Her SoC, sürücü yayınlandıktan sonra IOCTL listelerini cihaz başına güncellemelidir. Örneğin, ARM, sürücü güncellemesi yaptığında kendisine ait yayınlanmış IOCTL listesini günceller. Ancak OEM'ler, güncellemeleri SEPolicy'lerine dahil ettiklerinden ve gerektiğinde seçilen özel IOCTL'leri listelere eklediklerinden emin olmalıdır.

  4. Bu değişiklik, piyasadaki tüm Pixel cihazlara otomatik olarak uygulanır mı yoksa kullanıcının bu değişikliği uygulamak için bir ayarı değiştirmesi gerekir mi? Bu değişiklik, Mali GPU'yu kullanan tüm Pixel cihazlar (Pixel 6-9) için geçerlidir. Bu değişikliğin uygulanması için kullanıcıların herhangi bir işlem yapması gerekmez.

  5. Bu politikanın kullanılması çekirdek sürücüsünün performansını etkiler mi? Bu politika, GFXBench kullanılarak Mali GPU'da test edilmiş ve GPU performansında ölçülebilir bir değişiklik gözlemlenmemiştir.

  6. IOCTL listesinin mevcut kullanıcı alanı ve çekirdek sürücü sürümleriyle uyumlu olması gerekli mi? Evet, izin verilen IOCTL'lerin listesi, hem kullanıcı alanı hem de çekirdek sürücüleri tarafından desteklenen IOCTL'lerle senkronize edilmelidir. Kullanıcı alanındaki veya çekirdek sürücüsündeki IOCTL'ler güncellenirse SEPolicy IOCTL listesi de buna göre güncellenmelidir.

  7. ARM, IOCTL'leri "kısıtlanmış" / "enstrümantasyon" olarak sınıflandırdı ancak bazılarını üretim kullanım alanlarında kullanmak ve/veya diğerlerini reddetmek istiyoruz. Kullanıcı alanı Mali kitaplıklarının yapılandırmasına bağlı olarak, kullandıkları IOCTL'leri nasıl sınıflandıracaklarına karar vermek OEM/SoC'lerin sorumluluğundadır. Bu konuda karar vermenize yardımcı olması için ARM'nin listesini kullanabilirsiniz ancak her OEM/SoC'nin kullanım alanı farklı olabilir.

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 sayede uygulamalar yerel cihazlara kolayca bağlanabilir ancak kullanıcının parmak izini oluşturma ve konum için proxy görevi görme gibi gizlilikle ilgili sonuçları da vardır.

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

Yayın planı

Bu değişiklik, sırasıyla 25Q2 ve 26Q2 olmak üzere iki sürüm arasında uygulanacaktır. Bu korumalar gelecekteki bir Android sürümünde zorunlu kılınacağından geliştiricilerin 2025'in 2. çeyreği için bu kılavuzu takip etmesi ve geri bildirimlerini paylaşması zorunludur. Ayrıca, dolaylı yerel ağ erişimine bağlı senaryoları aşağıdaki kılavuzu kullanarak güncellemeleri ve kullanıcının yeni izni reddetmesine ve iptal etmesine hazırlıklı olmaları gerekir.

Etki

LNP şu anda etkinleştirilmesi gereken bir özelliktir. Bu nedenle, yalnızca özelliği etkinleştiren uygulamalar etkilenir. 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 anlamasıdır. Böylece, bir sonraki sürümde bu bölümleri izinle korumaya hazırlanabilirler.

Kullanıcının yerel ağına aşağıdaki yöntemlerle erişen uygulamalar etkilenir:

  • 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üzeyindeki sınıfların kullanımı (ör. NsdManager)

Yerel ağ adresine giden ve bu adresten gelen trafik için yerel ağ erişim izni gerekir. Aşağıdaki tabloda bazı yaygın durumlar listelenmiştir:

Uygulama Düşük Seviyeli Ağ İşlemi Yerel Ağ İzni Gerekli
Giden TCP bağlantısı oluşturma evet
Gelen TCP bağlantılarını kabul etme evet
UDP tek noktaya yayın, çok noktaya yayın, genel yayın gönderme evet
Gelen UDP tek noktaya yayın, çok noktaya yayın, genel yayın alma evet

Bu kısıtlamalar ağ yığınının derinliklerinde 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 üzerinde uygulanan tüm API'ler buna dahildir. Yerel ağdaki hizmetleri (ör. .local son ekine sahip olanlar) çözmeye çalışmak için yerel ağ izni gerekir.

Yukarıdaki kuralların istisnaları:

  • Bir cihazın DNS sunucusu yerel ağdaysa bu sunucuya giden veya sunucudan gelen trafik (53 numaralı bağlantı noktasında) yerel ağ erişim izni gerektirmez.
  • Uygulama içi seçici olarak çıkış değiştiriciyi kullanan uygulamaların yerel ağ izinlerine ihtiyacı olmayacak (2025'in 4. çeyreğinde daha fazla bilgi paylaşılacak).

Geliştirici Rehberliği (Etkinleştirme)

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

  1. Cihazı 25Q2 Beta 3 veya sonraki sürümlerin yüklü olduğu bir derlemeye güncelleyin.
  2. Test edilecek uygulamayı yükleyin.
  3. adb'de Appcompat işaretini açma/kapatma:

    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ıştır ve yerel ağa erişme girişimleri soket hatalarına yol açar. Uygulama işleminizin dışında yerel ağ işlemleri gerçekleştiren API'ler (ör. NsdManager) kullanıyorsanız bu API'ler etkinleştirme aşamasında etkilenmez.

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üklenmiş olmalı ve tüm senaryolarınız, uygulamayı etkinleştirmeden önceki gibi çalışmalıdır.

Yerel ağ koruması için yaptırım başladığında uygulama ağ trafiği şu ş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 devre dışı bırakmak 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 ağ adresine gönderme veya gönderme varyantı çağrıldığında çağrı yapan 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 projedeki yerel ağ, Wi-Fi veya Ethernet gibi yayın özellikli 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 // Yerel Bağlantı
  • 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:

  • Yerel bağlantı
  • Doğrudan bağlı rotalar
  • Thread gibi saplama ağlar
  • Birden çok 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.

Uygulamaya ait fotoğraflar

Android 16 veya sonraki sürümleri çalıştıran cihazlarda SDK 36 veya sonraki sürümleri hedefleyen bir uygulama tarafından fotoğraf ve video izinleri istendiğinde, seçili medyaya erişimi sınırlamayı seçen kullanıcılar, uygulamaya ait tüm fotoğrafları fotoğraf seçicide önceden seçili olarak görür. Kullanıcılar önceden seçilmiş öğelerden herhangi birinin seçimini kaldırabilir. Bu durumda uygulamanın söz konusu fotoğraf ve videolara erişimi iptal edilir.