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

Android 16, önceki sürümlerde olduğu gibi uygulamanızı etkileyebilecek davranış değişiklikleri içerir. 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 uygulanabilir durumlarda bu davranışları destekleyecek şekilde uygulamanızı değiştirmeniz gerekir.

Uygulamanızın targetSdkVersion'sinden 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 oluşturmak için aşağıdaki değişiklikleri içerir.

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

Android 15'i (API düzeyi 35) hedefleyen uygulamalarda Android 15'te uçtan uca görünüm zorunlu kılınmıştır. Ancak uygulamanız R.attr#windowOptOutEdgeToEdgeEnforcement değerini true olarak ayarlayarak bu zorunluluğun dışında kalabilir. Android 16'yı (API düzeyi 36) hedefleyen uygulamalarda R.attr#windowOptOutEdgeToEdgeEnforcement desteği sonlandırıldı ve devre dışı bırakıldı. 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 cihazda çalışıyorsa R.attr#windowOptOutEdgeToEdgeEnforcement çalışmaya devam eder.
  • Uygulamanız Android 16'yı (API düzeyi 36) hedefliyorsa ve Android 16 yüklü bir cihazda çalışıyorsa R.attr#windowOptOutEdgeToEdgeEnforcement devre dışı bırakılır.

Android 16'da test için uygulamanızın uçtan uca özelliği 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 özelliği destekler. Uçtan uca destek için Compose (Oluşturma) ve Views (Görünümler) kılavuzuna bakın.

Tahmini geri özelliği için taşıma veya devre dışı bırakma işlemi gerekir

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î geri gitme sistem animasyonları (ana sayfaya geri gitme, görevler arası geçiş ve etkinlikler arası geçiş) varsayılan olarak etkindir. Ayrıca, onBackPressed çağrılmıyor ve KeyEvent.KEYCODE_BACK artık gönderilmiyor.

Uygulamanız geri etkinliğini yakalıyorsa 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> ya da <activity> etiketinde android:enableOnBackInvokedCallback özelliğini false olarak ayarlayarak geçici olarak devre dışı bırakın.

Tahmine dayalı ana ekrana geri dönme animasyonu.
Tahmine dayalı, etkinlikler arası animasyon.
Tahmine dayalı görevler arası animasyon.

Elegant Font 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 ş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 iş planlaması optimizasyonu

在以 Android 16 为目标平台之前,如果 scheduleAtFixedRate 因不在有效的进程生命周期内而错过了任务执行,则当应用返回到有效的生命周期时,所有错过的执行会立即执行。

以 Android 16 为目标平台时,当应用返回到有效的生命周期时,系统会立即执行最多 1 次未执行的 scheduleAtFixedRate 执行。此行为变更预计会提升应用性能。在您的应用中测试此行为,检查您的应用是否受到影响。您还可以使用应用兼容性框架并启用 STPE_SKIP_MULTIPLE_MISSED_PERIODIC_TASKS 兼容性标志进行测试。

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

With Android apps now running on a variety of devices (such as phones, tablets, foldables, desktops, cars, and TVs) and windowing modes on large screens (such as split screen and desktop windowing), developers should build Android apps that adapt to any screen and window size, regardless of device orientation. Paradigms like restricting orientation and resizability are too restrictive in today's multidevice world.

Ignore orientation, resizability, and aspect ratio restrictions

For apps targeting Android 16 (API level 36), Android 16 includes changes to how the system manages orientation, resizability, and aspect ratio restrictions. On displays with smallest width >= 600dp, the restrictions no longer apply. Apps also fill the entire display window, regardless of aspect ratio or a user's preferred orientation, and pillarboxing isn't used.

This change introduces a new standard platform behavior. Android is moving toward a model where apps are expected to adapt to various orientations, display sizes, and aspect ratios. Restrictions like fixed orientation or limited resizability hinder app adaptability, so we recommend making your app adaptive to deliver the best possible user experience.

You can also test this behavior by using the app compatibility framework and enabling the UNIVERSAL_RESIZABLE_BY_DEFAULT compat flag.

Common breaking changes

Ignoring orientation, resizability, and aspect ratio restrictions might impact your app's UI on some devices, especially elements that were designed for small layouts locked in portrait orientation: for example, issues like stretched layouts and off-screen animations and components. Any assumptions about aspect ratio or orientation can cause visual issues with your app. Learn more about how to avoid them and improve your app's adaptive behaviour.

Allowing device rotation results in more activity re-creation, which can result in losing user state if not properly preserved. Learn how to correctly save UI state in Save UI states.

Implementation details

The following manifest attributes and runtime APIs are ignored across large screen devices in full-screen and multi-window modes:

The following values for screenOrientation, setRequestedOrientation(), and getRequestedOrientation() are ignored:

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

Regarding display resizability, android:resizeableActivity="false", android:minAspectRatio, and android:maxAspectRatio have no effect.

For apps targeting Android 16 (API level 36), app orientation, resizability, and aspect ratio constraints are ignored on large screens by default, but every app that isn't fully ready can temporarily override this behavior by opting out (which results in the previous behavior of being placed in compatibility mode).

Exceptions

The Android 16 orientation, resizability, and aspect ratio restrictions don't apply in the following situations:

  • Games (based on the android:appCategory flag)
  • Users explicitly opting in to the app's default behavior in aspect ratio settings of the device
  • Screens that are smaller than sw600dp

Opt out temporarily

To opt out a specific activity, declare the PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY manifest property:

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

If too many parts of your app aren't ready for Android 16, you can opt out completely by applying the same property at the application level:

<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 izinler, android.permissions.health altında daha ayrıntılı izinler kullanır. Bu izinler Health Connect tarafından da kullanılır. Android 16'dan itibaren, daha önce BODY_SENSORS veya BODY_SENSORS_BACKGROUND iznini gerektiren tüm API'ler bunun yerine ilgili android.permissions.health iznini gerektirir. Bu durum aşağıdaki veri türlerini, API'leri ve ön plan hizmeti 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'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östermek için etkinlik bildirmelidir. Bu, Health Connect ile aynı koşuldur.

Bağlantı

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

Bağlantı kaybı ve şifreleme değişikliklerini işlemek için yeni amaçlar

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 eşlemesini kaldırmanın yeni yolu

All apps targeting Android 16 are now able to unpair bluetooth devices using a public API in CompanionDeviceManager. If a companion device is being managed as a CDM association, then the app can trigger bluetooth bond removal by using the new removeBond(int) API on the associated device. The app can monitor the bond state changes by listening to the bluetooth device broadcast event ACTION_BOND_STATE_CHANGED.

Güvenlik

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

MediaStore sürüm 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

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

Android 15'te gönderen uygulamaya odaklanan bu özellik, Android 16 ile birlikte kontrolü alan uygulamaya kaydırıyor. Böylece geliştiriciler, uygulama manifestlerini kullanarak katı amaç çözümlemeyi etkinleştirebiliyor.

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

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

  2. İşlem içermeyen Intent'ler herhangi bir Intent Filtresiyle eşleşemez: İşlemi belirtilmemiş Intent'ler herhangi bir Intent filtresiyle çözümlenmemelidir.

Bu değişiklikler yalnızca birden fazla uygulamanın söz konusu olduğu durumlarda geçerlidir ve tek bir uygulamadaki amaç işleme özelliğini etkilemez.

Etki

Etkinleştirme özelliği, geliştiricilerin bu özelliğin geçerli olması için uygulama manifestlerinde açıkça etkinleştirmesi gerektiği anlamına gelir. Bu nedenle, özelliğin etkisi yalnızca geliştiricileri aşağıdaki koşulları karşılayan uygulamalarla sınırlı olacaktır:

  • Daha Güvenli Amaçlar özelliği ve avantajları hakkında bilgi sahibi olmalıdır.
  • Uygulamalarına daha katı amaç işleme uygulamaları eklemeyi aktif olarak seçmelidir.

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

Android 16'daki ilk etkisi sınırlı olsa da Safer Intents girişimi, gelecekteki Android sürümlerinde daha geniş bir etki yaratacak bir yol haritasına sahiptir. Nihayetinde katı amaç çözümlemeyi varsayılan davranış haline getirmek planlanmaktadır.

Daha Güvenli Amaçlar özelliği, kötü amaçlı uygulamaların amaç çö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 mevcut uygulamalarla ilgili olası uyumluluk sorunlarını gidermek için devre dışı bırakma ve zorunlu yaptırım geçişi dikkatli bir şekilde yönetilmelidir.

Uygulama

Geliştiricilerin, uygulama manifestlerinde intentMatchingFlags özelliğini kullanarak daha katı amaç eşleşmesini açıkça etkinleştirmesi gerekir. Özelliğin uygulamanın tamamı için etkinleştirildiği ancak alıcıda devre dışı bırakıldığı/devre dışı bırakma seçeneğinin kullanıldığı bir örneği aşağıda bulabilirsiniz:

<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şme uygular.
yok Gelen amaçlar için tüm özel eşleşme kurallarını devre dışı bırakır. Birden fazla işaret belirtilirken çakışan değerler, "none" işaretine öncelik verilerek çözülür.
allowNullAction Eşleşme kurallarını gevşeterek işlem içermeyen niyetlerin eşleşmesine izin verir. Belirli bir davranış elde etmek için bu işaret "enforceIntentFilter" ile birlikte kullanılmalıdır.

Test ve Hata Ayıklama

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

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 zorlaştırmak için kullanımdan kaldırılan veya yalnızca GPU geliştirmesi için tasarlanan Mali GPU IOCTL'leri üretim derlemelerinde engellendi. 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ünde IOCTL'lerinin resmi sınıflandırmasını sağlamıştır.Documentation/ioctl-categories.rst 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 profil oluşturma araçları 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 hata bildirimi gönderin 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 güvenlik yöntemini kullanmak isteyen tüm OEM'ler tarafından kullanılabilecek. Değişikliği uygulama talimatlarını uygulama belgelerinde bulabilirsiniz.

  2. Bu özelliği uygulamak için OEM kod tabanında değişiklik yapmak zorunlu mu yoksa varsayılan olarak yeni bir AOSP sürümüyle mi geliyor? Platform düzeyindeki değişiklik, varsayılan olarak yeni bir AOSP sürümüyle birlikte gelir. Sağlayıcılar, 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? Ayrı ayrı SoC'ler, sürücü yayınlandıktan sonra IOCTL listelerini cihaz başına güncellemelidir. Örneğin, ARM, sürücü güncellemeleri yapıldığında yayınlanan 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, piyasada bulunan tüm Pixel cihazlara otomatik olarak mı uygulanır yoksa kullanıcının bu değişikliği uygulamak için bir ayarı etkinleştirmesi mi gerekir? 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ı işlemi 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 edildi ve GPU performansında ölçülebilir bir değişiklik gözlemlenmedi.

  6. IOCTL listesinin mevcut kullanıcı alanı ve çekirdek sürücüsü 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 listesinin de eşleşecek şekilde güncellenmesi gerekir.

  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 her bir OEM/SoC'nin 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

具有 INTERNET 权限的任何应用都可以访问局域网中的设备。 这使得应用可以轻松连接到本地设备,但也存在隐私影响,例如形成用户指纹,以及成为位置信息的代理。

本地网络保护项目旨在通过在新的运行时权限后限制对本地网络的访问来保护用户隐私。

发布计划

此变更将部署在两个版本(即 25Q2 和 TBD)之间。 开发者必须遵循 25Q2 的相关指南并分享反馈,因为这些保护措施将在后续 Android 版本中强制执行。此外,他们还需要按照以下指南更新依赖于隐式本地网络访问权限的场景,并为用户拒绝和撤消新权限做好准备。

影响

在当前阶段,LNP 是一项选择启用功能,这意味着只有选择启用的应用会受到影响。选择启用阶段的目标是让应用开发者了解应用的哪些部分依赖于隐式本地网络访问权限,以便他们为下一个版本做好权限保护准备。

如果应用使用以下方式访问用户的本地网络,则会受到影响:

  • 直接或通过库使用本地网络地址(例如 mDNS 或 SSDP 服务发现协议)上的原始套接字
  • 使用可访问本地网络的框架级类(例如 NsdManager)

本地网络地址发送流量和本地网络地址接收流量需要本地网络访问权限。下表列出了一些常见情况:

应用低级层网络操作 需要本地网络权限
建立出站 TCP 连接
接受传入的 TCP 连接
发送 UDP 单播、多播、广播
接收传入的 UDP 单播、多播、广播

这些限制是在网络堆栈深处实现的,因此适用于所有网络 API。这包括在原生代码或受管理代码中创建的套接字、Cronet 和 OkHttp 等网络库,以及基于这些库实现的任何 API。尝试解析本地网络上的服务(即带有 .local 后缀的服务)将需要本地网络权限。

上述规则的例外情况:

  • 如果设备的 DNS 服务器位于本地网络上,则进出该服务器(位于端口 53)的流量不需要本地网络访问权限。
  • 使用输出源切换器作为其应用内选择器的应用将不需要本地网络权限(更多指南将于 2025 年第 4 季度发布)。

开发者指南(选择启用)

如需选择启用本地网络限制,请执行以下操作:

  1. 将设备刷写到 25Q2 Beta 3 或更高版本的 build。
  2. 安装要测试的应用。
  3. 在 adb 中切换 Appcompat 标志:

    adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
    
  4. 重新启动设备

现在,您的应用对本地网络的访问受到限制,任何访问本地网络的尝试都会导致套接字错误。如果您使用的 API 在应用进程之外执行本地网络操作(例如:NsdManager),在选择启用阶段,这些 API 不会受到影响。

如需恢复访问权限,您必须向应用授予 NEARBY_WIFI_DEVICES 权限。

  1. 确保应用在其清单中声明了 NEARBY_WIFI_DEVICES 权限。
  2. 依次前往设置 > 应用 > [应用名称] > 权限 > 附近的设备 > 允许

现在,应用对本地网络的访问权限应该已恢复,并且所有场景都应像选择启用应用之前一样正常运行。

本地网络保护功能开始强制执行后,应用的网络流量将受到以下影响。

权限 出站 LAN 请求 出站/入站互联网请求 入站 LAN 请求
已授予 Works Works Works
未授予 最差排行榜 Works 最差排行榜

使用以下命令关闭应用兼容性标志

adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>

错误

每当调用套接字调用 send 或 send 变体向本地网络地址发送数据时,系统都会向该套接字返回因这些限制而产生的错误。

错误示例:

sendto failed: EPERM (Operation not permitted)

sendto failed: ECONNABORTED (Operation not permitted)

本地网络定义

此项目中的本地网络是指使用支持广播的网络接口(例如 Wi-Fi 或以太网)的 IP 网络,但不包括移动网络 (WWAN) 或 VPN 连接。

以下网络被视为本地网络:

IPv4

  • 169.254.0.0/16 // 链路本地
  • 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

  • 链路本地
  • 直接连接的路线
  • Thread 等桩网络
  • 多个子网(待定)

此外,多播地址 (224.0.0.0/4、ff00::/8) 和 IPv4 广播地址 (255.255.255.255) 也被归类为本地网络地址。

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.