Modifiche al comportamento: app che hanno come target Android 16 o versioni successive

Come le versioni precedenti, Android 16 include modifiche al comportamento che potrebbero influire sulla tua app. Le seguenti modifiche al comportamento si applicano esclusivamente alle app che hanno come target Android 16 o versioni successive. Se la tua app ha come target Android 16 o versioni successive, devi modificarla per supportare questi comportamenti, ove applicabile.

Assicurati di esaminare anche l'elenco delle modifiche al comportamento che interessano tutte le app in esecuzione su Android 16, indipendentemente dal targetSdkVersion della tua app.

Esperienza utente e UI di sistema

Android 16 (livello API 36) include le seguenti modifiche volte a creare un'esperienza utente più coerente e intuitiva.

Rimozione della disattivazione della visualizzazione edge-to-edge

Android 15 ha imposto la visualizzazione edge-to-edge per le app che hanno come target Android 15 (livello API 35), ma la tua app può disattivare questa funzionalità impostando R.attr#windowOptOutEdgeToEdgeEnforcement su true. Per le app che hanno come target Android 16 (livello API 36), R.attr#windowOptOutEdgeToEdgeEnforcement è deprecato e disabilitato e la tua app non può disattivare la visualizzazione edge-to-edge.

  • Se la tua app ha come target Android 16 (livello API 36) ed è in esecuzione su un dispositivo Android 15, R.attr#windowOptOutEdgeToEdgeEnforcement continua a funzionare.
  • Se la tua app ha come target Android 16 (livello API 36) ed è in esecuzione su un dispositivo Android 16, R.attr#windowOptOutEdgeToEdgeEnforcement è disattivato.

Per i test in Android 16, assicurati che la tua app supporti la visualizzazione edge-to-edge e rimuovi qualsiasi utilizzo di R.attr#windowOptOutEdgeToEdgeEnforcement in modo che la tua app supporti la visualizzazione edge-to-edge anche su un dispositivo Android 15. Per supportare la visualizzazione da bordo a bordo, consulta le indicazioni relative a Composizione e Visualizzazioni.

Migrazione o disattivazione richieste per la funzionalità Indietro predittivo

Per le app che hanno come target Android 16 (livello API 36) o versioni successive e in esecuzione su un dispositivo Android 16 o versioni successive, le animazioni del sistema Indietro predittivo (torna alla schermata Home, passaggio da un'attività all'altra e passaggio da un'attività all'altra) sono attive per impostazione predefinita. Inoltre, onBackPressed non viene chiamato e KeyEvent.KEYCODE_BACK non viene più inviato.

Se la tua app intercetta l'evento Indietro e non hai ancora eseguito la migrazione alla navigazione a ritroso predittiva, aggiorna l'app per utilizzare le API di navigazione a ritroso supportate oppure disattiva temporaneamente la funzionalità impostando l'attributo android:enableOnBackInvokedCallback su false nel tag <application> o <activity> del file AndroidManifest.xml dell'app.

L'animazione di ritorno alla home page predittiva.
L'animazione predittiva cross-activity.
L'animazione predittiva tra le attività.

API per caratteri eleganti ritirate e disabilitate

Le app che hanno come target Android 15 (livello API 35) hanno l'attributo elegantTextHeight TextView impostato su true per impostazione predefinita, sostituendo il carattere compatto con uno molto più leggibile. Puoi ignorare questa impostazione impostando l'attributo elegantTextHeight su false.

Android 16 ritira l'attributo elegantTextHeight e l'attributo verrà ignorato una volta che la tua app avrà come target Android 16. I "caratteri dell'interfaccia utente" controllati da queste API verranno ritirati, pertanto devi adattare tutti i layout per garantire il rendering del testo coerente e a prova di futuro in arabo, laotiano, birmano, tamil, gujarati, kannada, malayalam, odia, telugu o tailandese.

Comportamento di elegantTextHeight per le app che hanno come target Android 14 (livello API 34) e versioni precedenti o per le app che hanno come target Android 15 (livello API 35) che hanno sostituito il valore predefinito impostando l'attributo elegantTextHeight su false.
elegantTextHeight per le app che hanno come target Android 16 (livello API 36) o per le app che hanno come target Android 15 (livello API 35) che non hanno eseguito l'override del valore predefinito impostando l'attributo elegantTextHeight su false.

Funzionalità di base

Android 16 (livello API 36) include le seguenti modifiche che modificano o espandono varie funzionalità di base del sistema Android.

Ottimizzazione della pianificazione del lavoro a tariffa fissa

Prima di scegliere come target Android 16, quando scheduleAtFixedRate mancava un'esecuzione di attività perché non rientrava in un ciclo di vita del processo valido, tutte le esecuzioni mancate venivano eseguite immediatamente quando l'app tornava a un ciclo di vita valido.

Quando scegli come target Android 16, al massimo una esecuzione mancata di scheduleAtFixedRate viene eseguita immediatamente quando l'app torna a un ciclo di vita valido. Questa modifica del comportamento dovrebbe migliorare il rendimento dell'app. Testa questo comportamento nella tua app per verificare se è interessata. Puoi anche eseguire il test utilizzando il framework di compatibilità delle app e attivando il flag di compatibilità STPE_SKIP_MULTIPLE_MISSED_PERIODIC_TASKS.

Fattori di forma del dispositivo

Android 16 (livello API 36) include le seguenti modifiche per le app quando vengono visualizzate su dispositivi con schermi di grandi dimensioni.

Layout adattivi

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

Salute e fitness

Android 16 (livello API 36) include le seguenti modifiche relative ai dati sulla salute e sul fitness.

Autorizzazioni per salute e fitness

Per le app che hanno come target Android 16 (livello API 36) o versioni successive, le autorizzazioni BODY_SENSORS utilizzano autorizzazioni più granulari in android.permissions.health, che vengono utilizzate anche da Connessione Salute. A partire da Android 16, qualsiasi API che in precedenza richiedeva BODY_SENSORS o BODY_SENSORS_BACKGROUND richiede invece l'autorizzazione android.permissions.health corrispondente. Ciò influisce sui seguenti tipi di dati, API e tipi di servizi in primo piano:

Se la tua app utilizza queste API, deve richiedere le rispettive autorizzazioni granulari:

Queste autorizzazioni sono le stesse che proteggono l'accesso alla lettura dei dati da Health Connect, l'archivio dati Android per i dati relativi a salute, fitness e benessere.

App mobile

Le app mobile che eseguono la migrazione per utilizzare READ_HEART_RATE e altre autorizzazioni granulari devono anche dichiarare un'attività per visualizzare le norme sulla privacy dell'app. Si tratta dello stesso requisito di Health Connect.

Connettività

Android 16 (livello API 36) include le seguenti modifiche nello stack Bluetooth per migliorare la connettività con i dispositivi periferici.

Nuovi intent per gestire la perdita dell'associazione e le modifiche alla crittografia

Nell'ambito della gestione migliorata della perdita del legame, Android 16 introduce anche due nuovi intent per fornire alle app una maggiore consapevolezza della perdita del legame e delle modifiche alla crittografia.

Le app che hanno come target Android 16 ora possono:

  • Ricevere un'intenzione ACTION_KEY_MISSING quando viene rilevata la perdita del legame remoto, in modo da poter fornire un feedback più informativo agli utenti e intraprendere azioni appropriate.
  • Ricevere un'intenzione ACTION_ENCRYPTION_CHANGE ogni volta che cambia lo stato della crittografia del collegamento. Sono incluse la modifica dello stato della crittografia, la modifica dell'algoritmo di crittografia e la modifica delle dimensioni della chiave di crittografia. Le app devono considerare il legame ripristinato se il link viene criptato correttamente al momento della ricezione dell'intent ACTION_ENCRYPTION_CHANGE in un secondo momento.

Adattamento alle diverse implementazioni degli OEM

Sebbene Android 16 introduca questi nuovi intent, la loro implementazione e la loro trasmissione possono variare in base ai diversi produttori di dispositivi (OEM). Per garantire che la tua app offra un'esperienza coerente e affidabile su tutti i dispositivi, gli sviluppatori devono progettare la gestione della perdita di legame in modo che si adatti in modo graduale a queste potenziali variazioni.

Consigliamo i seguenti comportamenti delle app:

  • Se viene trasmesso l'intent ACTION_KEY_MISSING:

    Il link ACL (Asynchronous Connection-Less) verrà scollegato dal sistema, ma le informazioni sul legame del dispositivo verranno conservate (come descritto qui).

    L'app deve utilizzare questo intent come indicatore principale per il rilevamento della perdita del legame e guidare l'utente a verificare che il dispositivo remoto sia nel raggio d'azione prima di avviare l'eliminazione o la nuova accoppiata del dispositivo.

    Se un dispositivo si disconnette dopo aver ricevuto ACTION_KEY_MISSING, la tua app deve essere cauta nel riconnettersi, poiché il dispositivo potrebbe non essere più associato al sistema.

  • Se l'intent ACTION_KEY_MISSING NON viene trasmesso:

    Il link ACL rimarrà connesso e le informazioni sul legame del dispositivo verranno rimosse dal sistema, come accade in Android 15.

    In questo scenario, l'app dovrebbe continuare a utilizzare i meccanismi di gestione della perdita di pacchetti esistenti, come nelle release Android precedenti, per rilevare e gestire gli eventi di perdita di pacchetti.

Nuovo modo per rimuovere l'accoppiamento Bluetooth

Tutte le app che hanno come target Android 16 ora possono disaccoppiare i dispositivi Bluetooth utilizzando un'API pubblica in CompanionDeviceManager. Se un dispositivo complementare viene gestito come associazione CDM, l'app può attivare la rimozione del legame Bluetooth utilizzando la nuova API removeBond(int) sul dispositivo associato. L'app può monitorare le modifiche dello stato del legame ascoltando l'evento di trasmissione del dispositivo Bluetooth ACTION_BOND_STATE_CHANGED.

Sicurezza

Android 16 (livello API 36) include le seguenti modifiche alla sicurezza.

Blocco della versione di MediaStore

Per le app destinate ad Android 16 o versioni successive, MediaStore#getVersion() sarà ora univoco per ogni app. In questo modo, le proprietà di identificazione vengono eliminate dalla stringa di versione per impedire l'uso improprio e l'utilizzo per le tecniche di fingerprinting. Le app non devono fare supposizioni sul formato di questa versione. Le app dovrebbero già gestire le modifiche delle versioni quando utilizzano questa API e nella maggior parte dei casi non dovrebbero dover cambiare il loro comportamento attuale, a meno che lo sviluppatore non abbia tentato di dedurre informazioni aggiuntive che vanno oltre lo scopo previsto di questa API.

Intenti più sicuri

La funzionalità Intent più sicuri è un'iniziativa di sicurezza in più fasi progettata per migliorare la sicurezza del meccanismo di risoluzione degli intent di Android. L'obiettivo è proteggere le app da azioni dannose aggiungendo controlli durante l'elaborazione degli intent e filtrando gli intent che non soddisfano criteri specifici.

In Android 15, la funzionalità si concentrava sull'app di invio, mentre in Android 16, il controllo passa all'app di ricezione, consentendo agli sviluppatori di attivare la risoluzione degli intent rigorosa utilizzando il file manifest dell'app.

Verranno implementate due modifiche principali:

  1. Gli intent espliciti devono corrispondere al filtro per intent del componente di destinazione: se un intent seleziona esplicitamente come target un componente, deve corrispondere al filtro per intent di quel componente.

  2. Gli intent senza un'azione non possono corrispondere a nessun filtro per intent: gli intent per cui non è specificata un'azione non devono essere risolti in nessun filtro per intent.

Queste modifiche si applicano solo quando sono coinvolte più app e non influiscono sulla gestione degli intent all'interno di una singola app.

Impatto

Poiché è una funzionalità di attivazione, gli sviluppatori devono attivarla esplicitamente nel file manifest dell'app affinché abbia effetto. Di conseguenza, l'impatto della funzionalità sarà limitato alle app i cui sviluppatori:

  • Sono a conoscenza della funzionalità Intent più sicuri e dei suoi vantaggi.
  • Scelgono attivamente di incorporare pratiche di gestione degli intent più rigorose nelle loro app.

Questo approccio di attivazione riduce al minimo il rischio di interrompere le app esistenti che potrebbero fare affidamento sul comportamento di risoluzione degli intent corrente, meno sicuro.

Sebbene l'impatto iniziale in Android 16 possa essere limitato, l'iniziativa Intent più sicuri prevede una roadmap per un impatto più ampio nelle future release di Android. L'obiettivo è rendere la risoluzione degli intent rigorosa il comportamento predefinito.

La funzionalità Intent più sicuri ha il potenziale per migliorare significativamente la sicurezza dell'ecosistema Android, rendendo più difficile per le app dannose sfruttare le vulnerabilità nel meccanismo di risoluzione degli intent.

Tuttavia, la transizione all'esclusione e all'applicazione obbligatoria deve essere gestita con attenzione per risolvere i potenziali problemi di compatibilità con le app esistenti.

Implementazione

Gli sviluppatori devono attivare esplicitamente la corrispondenza degli intent più rigorosa utilizzando l'attributo intentMatchingFlags nel file manifest dell'app. Ecco un esempio in cui la funzionalità è di attivazione per l'intera app, ma è disattivata/di esclusione su un ricevitore:

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

Ulteriori informazioni sui flag supportati:

Nome del flag Descrizione
enforceIntentFilter Applica una corrispondenza più rigorosa per gli intent in entrata
none Disattiva tutte le regole di corrispondenza speciali per gli intent in entrata. Quando si specificano più flag, i valori in conflitto vengono risolti dando la precedenza al flag "none"
allowNullAction Rilassa le regole di corrispondenza per consentire la corrispondenza degli intent senza un'azione. Questo flag deve essere utilizzato insieme a "enforceIntentFilter" per ottenere un comportamento specifico

Test e debug

Quando l'applicazione è attiva, le app dovrebbero funzionare correttamente se il chiamante dell'intent ha compilato correttamente l'intent. Tuttavia, gli intent bloccati attiveranno messaggi di log di avviso come "Intent does not match component's intent filter:" e "Access blocked:" con il tag "PackageManager." Ciò indica un potenziale problema che potrebbe influire sull'app e richiede attenzione.

Filtro logcat:

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

Filtro delle chiamate di sistema della GPU

为了加固 Mali GPU Surface,我们已在生产版本中屏蔽了已废弃或仅用于 GPU 开发的 Mali GPU IOCTL。 此外,用于 GPU 性能剖析的 IOCTL 已限制为 shell 进程或可调试的应用。如需详细了解平台级政策,请参阅 SAC 更新。

此项变更适用于使用 Mali GPU 的 Pixel 设备(Pixel 6-9)。Arm 已在其 r54p2 release 版本的 Documentation/ioctl-categories.rst 中提供了 IOCTL 的官方分类。此列表将在未来的驱动程序版本中继续维护。

此项变更不会影响受支持的图形 API(包括 Vulkan 和 OpenGL),预计也不会影响开发者或现有应用。 Streamline Performance Analyzer 和 Android GPU 检查器等 GPU 性能剖析工具不会受到影响。

测试

如果您看到类似以下内容的 SELinux 拒绝,则您的应用很可能受到了此项变更的影响:

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

如果您的应用需要使用被屏蔽的 IOCTL,请提交 bug 并将其分配给 android-partner-security@google.com。

常见问题解答

  1. 此项政策变更是否适用于所有 OEM? 此项变更将采用选择启用模式,但任何想要使用此加固方法的原始设备制造商(OEM)都可以使用。如需了解如何实现此项变更,请参阅实现文档。

  2. 是否必须在 OEM 代码库中进行更改才能实现此项变更,还是默认随新的 AOSP 版本提供? 平台级变更将默认随新的 AOSP 版本提供。供应商可以选择在其代码库中启用此项变更,以便应用此项变更。

  3. SoC 是否负责让 IOCTL 列表保持最新状态?例如,如果我的设备使用 ARM Mali GPU,我是否需要就任何变更与 ARM 联系? 各个 SoC 必须在驱动程序发布后根据设备更新其 IOCTL 列表。 例如,ARM 会在驱动程序更新后更新其发布的 IOCTL 列表。 不过,OEM 应确保将更新纳入其 SEPolicy,并根据需要将任何选定的自定义 IOCTL 添加到列表中。

  4. 此项变更是否会自动应用于所有在售 Pixel 设备,还是需要用户执行操作来切换某些内容以应用此项变更? 此项变更适用于所有使用 Mali GPU 的在售 Pixel 设备(Pixel 6-9)。无需用户执行任何操作即可应用此项变更。

  5. 使用此政策是否会影响内核驱动程序的性能? 我们已使用 GFXBench 在 Mali GPU 上对此政策进行了测试,未观察到 GPU 性能发生任何可衡量的变化。

  6. IOCTL 列表是否需要与当前的用户空间和内核驱动程序版本保持一致?是,允许的 IOCTL 列表必须与用户空间和内核驱动程序支持的 IOCTL 同步。如果用户空间或内核驱动程序中的 IOCTL 发生更新,则必须更新 SEPolicy IOCTL 列表以进行匹配。

  7. ARM 已将 IOCTL 分类为“受限”/“检测”,但我们希望在生产用例中使用其中的一些 IOCTL,并/或拒绝其他 IOCTL。 各个 OEM/SoC 负责根据其用户空间 Mali 库的配置,决定如何对其使用的 IOCTL 进行分类。 ARM 的列表可用于帮助决定这些内容,但每个 OEM/SoC 的用例可能有所不同。

Privacy

Android 16 (livello API 36) include le seguenti modifiche alla privacy.

Autorizzazione di accesso alla rete locale

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

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

发布计划

这项变更将分别在 25Q2 和 26Q2 这两个版本之间部署。 开发者必须遵循 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) 也被归类为本地网络地址。

Foto di proprietà dell'app

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