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

Önceki sürümlerde olduğu gibi Android 16 da 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 uygulamanızı, geçerli olduğu durumlarda bu davranışları destekleyecek şekilde 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 oluşturmayı amaçlayan aşağıdaki değişiklikleri içerir.

Uçtan uca devre dışı bırakma özelliğ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ındı. Ancak uygulamanız R.attr#windowOptOutEdgeToEdgeEnforcement değerini true olarak ayarlayarak bu zorunluluğu 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ı. 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 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.

Tahmin edilen geri gitme ö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 edilen 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 aranmaz ve KeyEvent.KEYCODE_BACK artık gönderilmez.

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(API 级别 35)为目标平台的应用默认将 elegantTextHeight TextView 属性设置为 true,从而将紧凑型字体替换为可读性更高的字体。您可以通过将 elegantTextHeight 属性设置为 false 来替换此设置。

Android 16 弃用了 elegantTextHeight 属性,当您的应用以 Android 16 为目标平台后,系统会忽略该属性。由这些 API 控制的“界面字体”即将停用,因此您应调整所有布局,以确保阿拉伯语、老挝语、缅甸语、泰米尔语、古吉拉特语、卡纳达语、马拉雅拉姆语、奥里亚语、泰卢固语或泰语文本的呈现效果一致且不受未来变化的影响。

针对以 Android 14(API 级别 34)及更低版本为目标平台的应用,或针对以 Android 15(API 级别 35)为目标平台且通过将 elegantTextHeight 属性设置为 false 替换默认值的应用,
elegantTextHeight 行为。
以 Android 16(API 级别 36)为目标平台的应用,或以 Android 15(API 级别 35)为目标平台但未通过将 elegantTextHeight 属性设置为 false 来替换默认值的应用,其
elegantTextHeight 行为。

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 应用可在各种设备(例如手机、平板电脑、可折叠设备、桌面设备、汽车和电视)上运行,并且在大屏设备上支持多种窗口模式(例如分屏和桌面窗口化模式),因此开发者应构建能够适应任何屏幕和窗口尺寸的 Android 应用,无论设备屏幕方向如何。在当今多设备的世界中,限制屏幕方向和尺寸可调整性等范式过于严格。

忽略屏幕方向、尺寸可调整性和宽高比限制

对于以 Android 16(API 级别 36)为目标平台的应用,在最小宽度 >= 600dp 的显示屏上,屏幕方向、尺寸调整能力和宽高比限制不再适用。应用会填满整个显示窗口,无论宽高比或用户偏好的屏幕方向如何,都不会使用竖屏黑边模式。

此变更引入了新的标准平台行为。Android 正在向一种模型转变,在该模型中,应用需要适应各种屏幕方向、显示大小和宽高比。固定屏幕方向或有限的尺寸调整等限制会阻碍应用的适应性。使应用具有自适应性,以提供尽可能最佳的用户体验。

您还可以使用应用兼容性框架并启用 UNIVERSAL_RESIZABLE_BY_DEFAULT 兼容性标志来测试此行为。

常见的重大更改

忽略屏幕方向、可调整大小性和宽高比限制可能会影响应用在某些设备上的界面,尤其是那些专为锁定为纵向的小布局设计的元素:例如,布局拉伸、动画和组件超出屏幕等问题。任何关于宽高比或屏幕方向的假设都可能导致应用出现视觉问题。详细了解如何避免这些问题并改进应用的自适应行为。

允许设备旋转会导致更多 activity 重新创建,如果未正确保留用户状态,可能会导致用户状态丢失。如需了解如何正确保存界面状态,请参阅保存界面状态

实现细节

在全屏模式和多窗口模式下,以下清单属性和运行时 API 会被大屏设备忽略:

系统会忽略 screenOrientationsetRequestedOrientation()getRequestedOrientation() 的以下值:

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

对于显示屏可调整大小性,android:resizeableActivity="false"android:minAspectRatioandroid:maxAspectRatio 没有影响。

对于以 Android 16(API 级别 36)为目标平台的应用,默认情况下,大屏设备会忽略应用的屏幕方向、尺寸调整和宽高比限制。尚未完全准备就绪的每个应用都可以通过选择停用来暂时替换此行为,这会导致应用恢复到之前放置在兼容模式下的行为。

例外情况

在以下情况下,Android 16 的屏幕方向、尺寸调整能力和宽高比限制不适用:

  • 游戏(基于 android:appCategory 标志)
  • 用户在设备的宽高比设置中明确选择启用应用的默认行为
  • 小于 sw600dp 的屏幕

暂时选择不接收

如需选择停用特定 activity,请声明 PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY 清单属性:

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

如果应用的很多部分尚未准备好支持 Android 16,您可以在应用级别应用相同的属性,从而完全选择不启用该功能:

<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, 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

作为改进了对键值对丢失的处理的一部分,Android 16 还引入了 2 个新 intent,以便应用更好地了解键值对丢失和加密更改。

以 Android 16 为目标平台的应用现在可以:

  • 在检测到远程键盘连接丢失时接收 ACTION_KEY_MISSING intent,以便提供更具信息量的用户反馈并采取适当的措施。
  • 每当链接的加密状态发生变化时,都会收到 ACTION_ENCRYPTION_CHANGE intent。这包括加密状态更改、加密算法更改和加密密钥大小更改。如果应用在稍后收到 ACTION_ENCRYPTION_CHANGE intent 时成功加密了链接,则必须将该绑定视为已恢复。

适应不同的 OEM 实现

虽然 Android 16 引入了这些新 intent,但其实现和广播可能会因不同的设备制造商 (OEM) 而异。为了确保您的应用在所有设备上都能提供一致且可靠的体验,开发者应设计其绑定丢失处理机制,以妥善适应这些潜在的变化。

我们建议您采用以下应用行为:

  • 如果广播 ACTION_KEY_MISSING intent:

    系统会断开 ACL(异步无连接)链接,但会保留设备的配对信息(如此处所述)。

    您的应用应将此 intent 用作检测配对丢失的主要信号,并在发起设备忘记或重新配对之前引导用户确认远程设备是否在范围内。

    如果设备在收到 ACTION_KEY_MISSING 后断开连接,您的应用应谨慎重新连接,因为设备可能已不再与系统绑定。

  • 如果未广播 ACTION_KEY_MISSING intent:

    ACL 链接将保持连接状态,系统会移除设备的配对信息,与 Android 15 中的行为相同。

    在这种情况下,您的应用应继续使用与之前的 Android 版本相同的现有配对丢失处理机制,以检测和管理配对丢失事件。

Bluetooth eşlemesini kaldırmanın yeni yolu

现在,以 Android 16 为目标平台的所有应用都可以使用 CompanionDeviceManager 中的公共 API 解除蓝牙设备配对。如果配套设备作为 CDM 关联进行管理,则应用可以在关联的设备上使用新的 removeBond(int) API 触发蓝牙配对的移除。该应用可以通过监听蓝牙设备广播事件 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 或更高版本为目标平台的应用,MediaStore#getVersion() 现在将是每个应用的唯一标识。这会从版本字符串中移除标识属性,以防止滥用和用于指纹识别技术。应用不应对此版本的格式做出任何假设。在使用此 API 时,应用应已处理版本变更,并且在大多数情况下无需更改其当前行为,除非开发者尝试推断超出此 API 预期范围的其他信息。

Daha güvenli amaçlar

“更安全的 intent”功能是一项多阶段安全计划,旨在提高 Android 的 intent 解析机制的安全性。目标是在 intent 处理期间添加检查,并过滤不符合特定条件的 intent,从而保护应用免受恶意操作的侵害。

Android 15 中,该功能侧重于发送应用。现在,在 Android 16 中,控制权转移到了接收应用,开发者可以使用其应用清单选择启用严格的 intent 解析。

我们正在实施两项关键变更:

  1. 显式 intent 必须与目标组件的 intent 过滤器匹配:如果 intent 显式定位到某个组件,则应与该组件的 intent 过滤器匹配。

  2. 没有操作的 intent 无法匹配任何 intent 过滤器:未指定操作的 intent 不应解析为任何 intent 过滤器。

这些变更仅在涉及多个应用时适用,不会影响单个应用内的 intent 处理。

影响

选择启用性质意味着,开发者必须在应用清单中明确启用它,才能使其生效。 因此,此功能的影响将仅限于以下应用:

  • 了解“更安全的 intent”功能及其优势。
  • 主动选择在应用中采用更严格的 intent 处理实践。

这种选择性采用的方法可最大限度地降低破坏可能依赖于当前不太安全的 intent 解析行为的现有应用的风险。

虽然 Safer Intents 计划在 Android 16 中的初始影响可能有限,但其路线图表明,该计划将在未来的 Android 版本中产生更广泛的影响。我们计划最终将严格的意图解析设为默认行为。

通过使恶意应用更难利用 intent 解析机制中的漏洞,“更安全的 intent”功能有望显著提升 Android 生态系统的安全性。

不过,向选择停用和强制执行的过渡必须谨慎管理,以解决现有应用可能存在的兼容性问题。

实现

开发者需要在应用清单中使用 intentMatchingFlags 属性明确启用更严格的 intent 匹配。以下示例展示了如何为整个应用选择启用该功能,但在接收器上停用/选择停用该功能:

<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>

有关支持的标志的更多信息:

标志名称 说明
enforceIntentFilter 对传入的 intent 强制执行更严格的匹配
针对传入 intent 停用所有特殊匹配规则。指定多个标志时,系统会优先考虑“无”标志,以解决值冲突问题
allowNullAction 放宽匹配规则,以允许匹配没有操作的 intent。此标志应与“enforceIntentFilter”结合使用,以实现特定行为

测试和调试

在强制执行处于有效状态时,如果 intent 调用方已正确填充 intent,应用应能正常运行。 不过,被屏蔽的 intent 会触发警告日志消息(例如 "Intent does not match component's intent filter:""Access blocked:"),并带有标记 "PackageManager."。这表示存在可能会影响应用的潜在问题,需要引起注意。

Logcat 过滤条件:

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 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 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. Bu özelliği uygulamak için OEM kod tabanında değişiklik yapmak zorunlu mu yoksa yeni bir AOSP sürümüyle varsayılan olarak mı 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? 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, 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ı tarafından herhangi bir işlem yapılması 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 uygun şekilde 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, 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 gizlilikle ilgili sonuçları da vardır.

Yerel Ağ Korumaları projesi, yerel ağa erişimi yeni bir çalışma zamanında istenen izinle sınırlayarak kullanıcının 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 dağıtılacak. Geliştiricilerin 25Q2 için bu yönergelere uyması ve geri bildirim paylaşması zorunludur. Çünkü bu korumalar daha sonraki bir Android sürümünde zorunlu kılınacaktır. Ayrıca, aşağıdaki yönergeleri kullanarak örtülü yerel ağ erişimine bağlı senaryoları güncellemeleri ve kullanıcıların yeni izni reddetmesine ve iptal etmesine hazırlanmaları gerekir.

Etki

LNP, şu anki aşamada etkinleştirilmesi gereken bir özelliktir. Bu nedenle, yalnızca etkinleştirilen uygulamalar etkilenir. Katılma aşamasının amacı, uygulama geliştiricilerin uygulamalarının hangi bölümlerinin örtülü yerel ağ erişimine bağlı olduğunu anlamalarını sağlamaktır. Böylece, bir sonraki sürümde bu bölümler için izin koruması hazırlayabilirler.

Uygulamalar, kullanıcının yerel ağına şu yöntemlerle erişirse etkilenir:

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

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

Uygulama Düşük Düzeyli 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 veya yayın gönderme evet
Gelen bir UDP tek yayını, çoklu yayını veya yayını alma evet

Bu kısıtlamalar ağ yığınına derinlemesine uygulanır ve bu nedenle 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 soneki olanlar) çözümlemeye çalışmak için yerel ağ izni gerekir.

Yukarıdaki kurallarla ilgili istisnalar:

  • Bir cihazın DNS sunucusu yerel ağdaysa bu cihaza veya bu cihazdan gelen 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ı olmayacak (2025'in 4. çeyreğinde daha fazla bilgi verilecek).

Geliştirici Yönergeleri (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 yükleyin.
  2. Test edilecek uygulamayı yükleyin.
  3. adb'de Appcompat işaretini açın veya kapatı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ıştır ve yerel ağa erişme girişimleri soket hatalarına yol açar. Uygulama sürecinizin dışında yerel ağ işlemleri gerçekleştiren API'ler (ör. NsdManager) kullanıyorsanız bu API'ler, kayıt 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.

Uygulamanızın yerel ağa erişimi geri yüklenir ve tüm senaryolarınız, uygulamayı kaydetmeden önceki gibi çalışır.

Yerel ağ koruması zorunlu kılındığında uygulama ağ trafiği şu şekilde etkilenecek:

İ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 ağ adresine gönderme veya gönderme varyantı çağrıldığında arayan 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ğ, kablosuz veya Ethernet gibi yayın yapabilen bir ağ arayüzü kullanan ancak hücresel (WWAN) veya VPN bağlantılarını hariç tutan bir IP ağıdır.

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

IPv4:

  • 169.254.0.0/16 // Link Local
  • 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 saplama ağlar
  • Birden fazla alt ağ (henüz belli değil)

Ayrıca, hem çok noktalı 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

当面向 SDK 36 或更高版本的应用在搭载 Android 16 或更高版本的设备上提示用户授予照片和视频权限时,如果用户选择限制对所选媒体的访问权限,则会在照片选择器中看到该应用拥有的所有照片。用户可以取消选择任何这些预选项,这会撤消该应用对这些照片和视频的访问权限。