Como nas versões anteriores, o Android 16 inclui mudanças de comportamento que podem afetar seu app. As mudanças de comportamento abaixo se aplicam exclusivamente a apps destinados ao Android 16 ou versões mais recentes. Caso seu app seja direcionado ao Android 16 ou a versões mais recentes, faça modificações para oferecer suporte a esses comportamentos, quando aplicável.
Consulte também a lista de mudanças de comportamento que afetam todos os apps
executados no Android 16, independente da targetSdkVersion do app.
Experiência do usuário e interface do sistema
O Android 16 (nível 36 da API) inclui as seguintes mudanças que visam criar uma experiência do usuário mais consistente e intuitiva.
Fim da opção de recusar a exibição de ponta a ponta
O Android 15 impôs a exibição de ponta a ponta para apps destinados ao Android 15 (nível 35 da API), mas o app pode desativar essa opção definindo
R.attr#windowOptOutEdgeToEdgeEnforcement como true. Para apps destinados ao Android 16 (nível 36 da API), R.attr#windowOptOutEdgeToEdgeEnforcement foi descontinuado e desativado, e o app não pode desativar a exibição de ponta a ponta.
- Se o app for destinado ao Android 16 (nível da API 36) e estiver em execução em um dispositivo Android 15,
R.attr#windowOptOutEdgeToEdgeEnforcementvai continuar funcionando. - Se o app for destinado ao Android 16 (nível da API 36) e estiver em execução em um dispositivo Android 16,
R.attr#windowOptOutEdgeToEdgeEnforcementserá desativado.
Para testes no Android 16, verifique se o app oferece suporte à exibição de ponta a ponta e remova qualquer uso de R.attr#windowOptOutEdgeToEdgeEnforcement para que o app também ofereça suporte à exibição de ponta a ponta em um dispositivo Android 15. Para oferecer suporte à exibição de ponta a ponta,
consulte as orientações do Compose e das visualizações.
Migração ou opção de recusar necessária para o botão Voltar preditivo
对于以 Android 16(API 级别 36)或更高版本为目标平台且在 Android 16 或更高版本的设备上运行的应用,预测性返回系统动画(返回主屏幕、跨任务和跨 activity)默认处于启用状态。此外,系统不再调用 onBackPressed,也不再调度 KeyEvent.KEYCODE_BACK。
如果您的应用会拦截返回事件,但您尚未迁移到预测性返回,请更新应用以使用受支持的返回导航 API,或者通过在应用的 AndroidManifest.xml 文件的 <application> 或 <activity> 标记中将 android:enableOnBackInvokedCallback 属性设置为 false 来暂时选择停用。
APIs de fontes elegantes descontinuadas e desativadas
Os apps destinados ao Android 15 (nível 35 da API) têm o atributo
elegantTextHeight
TextView definido como true por
padrão, substituindo a fonte compacta por uma muito mais legível. É possível substituir isso definindo o atributo elegantTextHeight como false.
O Android 16 descontinua o
atributo elegantTextHeight,
que será ignorado quando o app for destinado ao Android 16. As "fontes da interface" controladas por essas APIs serão descontinuadas. Por isso, adapte todos os layouts para garantir a renderização de texto consistente e à prova de futuro em árabe, laosiano, birmanês, tâmil, gujarati, canarês, malaiala, odia, télugo ou tailandês.
elegantTextHeight para apps destinados ao Android
14 (nível 34 da API) e versões anteriores ou para apps destinados ao Android 15 (nível 35 da API)
que substituíram o padrão definindo o atributo elegantTextHeight
como false.elegantTextHeight para apps direcionados ao Android
16 (nível 36 da API) ou ao Android 15 (nível 35 da API) que não
substituíram o padrão definindo o atributo elegantTextHeight
como false.
Funcionalidade principal
O Android 16 (nível 36 da API) inclui as seguintes mudanças que modificam ou expandem vários recursos principais do sistema Android.
Otimização do agendamento de trabalho de taxa fixa
Antes de segmentar o Android 16, quando o scheduleAtFixedRate
perdia uma execução de tarefa por estar fora de um
ciclo de vida do processo válido, todas as execuções perdidas eram executadas imediatamente
quando o app retornava a um ciclo de vida válido.
Ao segmentar o Android 16, no máximo uma execução perdida de
scheduleAtFixedRate é executada imediatamente quando o app
retorna a um ciclo de vida válido. Essa mudança de comportamento deve melhorar o desempenho
do app. Teste esse comportamento no seu app para verificar se ele é afetado.
Também é possível testar usando o framework de compatibilidade de apps
e ativando a flag de compatibilidade STPE_SKIP_MULTIPLE_MISSED_PERIODIC_TASKS.
Formatos de dispositivos
O Android 16 (nível 36 da API) inclui as seguintes mudanças para apps quando exibidos em dispositivos de tela grande.
Layouts adaptáveis
现在,Android 应用可在各种设备(例如手机、平板电脑、可折叠设备、桌面设备、汽车和电视)上运行,并且在大屏设备上支持多种窗口模式(例如分屏和桌面窗口化模式),因此开发者应构建能够适应任何屏幕和窗口尺寸的 Android 应用,无论设备屏幕方向如何。在当今多设备的世界中,限制屏幕方向和尺寸可调整性等范式过于严格。
忽略屏幕方向、尺寸可调整性和宽高比限制
对于以 Android 16(API 级别 36)为目标平台的应用,在最小宽度 >= 600dp 的显示屏上,屏幕方向、尺寸调整能力和宽高比限制不再适用。应用会填满整个显示窗口,无论宽高比或用户偏好的屏幕方向如何,都不会使用竖屏黑边模式。
此变更引入了新的标准平台行为。Android 正在向一种模型转变,在该模型中,应用需要适应各种屏幕方向、显示大小和宽高比。固定屏幕方向或有限的尺寸调整等限制会阻碍应用的适应性。使应用具有自适应性,以提供尽可能最佳的用户体验。
您还可以使用应用兼容性框架并启用 UNIVERSAL_RESIZABLE_BY_DEFAULT 兼容性标志来测试此行为。
常见的重大更改
忽略屏幕方向、可调整大小性和宽高比限制可能会影响应用在某些设备上的界面,尤其是那些专为锁定为纵向的小布局设计的元素:例如,布局拉伸、动画和组件超出屏幕等问题。任何关于宽高比或屏幕方向的假设都可能导致应用出现视觉问题。详细了解如何避免这些问题并改进应用的自适应行为。
允许设备旋转会导致更多 activity 重新创建,如果未正确保留用户状态,可能会导致用户状态丢失。如需了解如何正确保存界面状态,请参阅保存界面状态。
实现细节
在全屏模式和多窗口模式下,以下清单属性和运行时 API 会被大屏设备忽略:
screenOrientationresizableActivityminAspectRatiomaxAspectRatiosetRequestedOrientation()getRequestedOrientation()
系统会忽略 screenOrientation、setRequestedOrientation() 和 getRequestedOrientation() 的以下值:
portraitreversePortraitsensorPortraituserPortraitlandscapereverseLandscapesensorLandscapeuserLandscape
对于显示屏可调整大小性,android:resizeableActivity="false"、android:minAspectRatio 和 android: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úde e fitness
O Android 16 (nível 36 da API) inclui as seguintes mudanças relacionadas a dados de saúde e fitness.
Permissões de saúde e fitness
Para apps direcionados ao Android 16 (nível 36 da API) ou mais recentes, as permissões
BODY_SENSORS são mais granulares
em android.permissions.health, um modelo adotado também pelo Conexão Saúde. No Android 16, qualquer API que antes exigia BODY_SENSORS
ou BODY_SENSORS_BACKGROUND agora precisa da permissão
android.permissions.health correspondente. Isso afeta os seguintes tipos de dados, APIs e tipos de serviços em primeiro plano:
HEART_RATE_BPMdos Recursos de Saúde no Wear OSSensor.TYPE_HEART_RATEdo Android Sensor ManagerheartRateAccuracyeheartRateBpmdeProtoLayoutno Wear OSFOREGROUND_SERVICE_TYPE_HEALTH, em que a permissãoandroid.permission.healthé necessária em vez deBODY_SENSORS
Se o app usa essas APIs, ele precisa solicitar as permissões granulares respectivas:
- Para monitoramento da frequência cardíaca, SpO2 ou temperatura da pele durante o uso:
solicite a permissão granular em
android.permissions.health, comoREAD_HEART_RATEem vez deBODY_SENSORS. - Para acesso ao sensor em segundo plano: solicite
READ_HEALTH_DATA_IN_BACKGROUNDem vez deBODY_SENSORS_BACKGROUND.
Essas permissões são as mesmas que protegem o acesso à leitura de dados da Conexão Saúde, o repositório de dados do Android para informações de saúde, condicionamento físico e bem-estar.
Apps para dispositivos móveis
Os apps para dispositivos móveis que migram para usar a READ_HEART_RATE e outras permissões granulares
também precisam declarar uma atividade para mostrar
a Política de Privacidade do app. Esse é o mesmo requisito da Conexão Saúde.
Conectividade
O Android 16 (nível 36 da API) inclui as seguintes mudanças na pilha do Bluetooth para melhorar a conectividade com dispositivos periféricos.
Novas intents para processar a perda de vinculação e mudanças de criptografia
Como parte do Processamento de perda de vínculo aprimorado, o Android 16 também apresenta duas novas intents para dar aos apps mais consciência da perda de vínculo e mudanças de criptografia.
Os apps destinados ao Android 16 agora podem:
- Receber uma intent
ACTION_KEY_MISSINGquando a perda de vínculo remoto é detectada, permitindo que eles forneçam feedback mais informativo ao usuário e realizem ações adequadas. - Receba uma intent
ACTION_ENCRYPTION_CHANGEsempre que o status de criptografia do link mudar. Isso inclui a mudança de status de criptografia, de algoritmo de criptografia e de tamanho da chave de criptografia. Os apps precisam considerar a vinculação restaurada se o link for criptografado ao receber a intentACTION_ENCRYPTION_CHANGEmais tarde.
Como se adaptar a diferentes implementações de OEM
Embora o Android 16 apresente essas novas intents, a implementação e a transmissão delas podem variar de acordo com os diferentes fabricantes de dispositivos (OEMs). Para garantir que o app ofereça uma experiência consistente e confiável em todos os dispositivos, os desenvolvedores precisam projetar o processamento de perda de vínculo para se adaptar a essas variações.
Recomendamos os seguintes comportamentos do app:
Se a intent
ACTION_KEY_MISSINGfor transmitida:O link ACL (Asynchronous Connection-Less) será desconectado pelo sistema, mas as informações de vinculação do dispositivo serão mantidas, conforme descrito aqui.
Seu app precisa usar essa intent como o indicador principal para a detecção de perda de conexão e orientar o usuário a confirmar se o dispositivo remoto está no alcance antes de iniciar o esquecimento ou o novo pareamento do dispositivo.
Se um dispositivo se desconectar depois que o
ACTION_KEY_MISSINGfor recebido, o app precisará ter cuidado ao se reconectar, porque o dispositivo pode não estar mais vinculado ao sistema.Se a intent
ACTION_KEY_MISSINGNÃO for transmitida:O link ACL vai permanecer conectado, e as informações de vinculação do dispositivo serão removidas pelo sistema, assim como no comportamento do Android 15.
Nesse cenário, o app precisa continuar com os mecanismos de processamento de perda de vínculo existentes, como nas versões anteriores do Android, para detectar e gerenciar eventos de perda de vínculo.
Nova maneira de remover a vinculação do Bluetooth
Todos os apps destinados ao Android 16 agora podem desvincular dispositivos Bluetooth usando uma
API pública em CompanionDeviceManager. Se um dispositivo complementar estiver
sendo gerenciado como uma associação de CDM, o app poderá acionar
a remoção de pareamento Bluetooth usando a nova API removeBond(int)
no dispositivo associado. O app pode monitorar as mudanças de estado de vinculação
ouvindo o evento de transmissão do dispositivo Bluetooth
ACTION_BOND_STATE_CHANGED.
Segurança
O Android 16 (nível 36 da API) inclui as seguintes mudanças de segurança.
Bloqueio da versão do MediaStore
Para apps destinados ao Android 16 ou mais recente, o MediaStore#getVersion() agora
será exclusivo para cada app. Isso elimina as propriedades de identificação da string
de versão para evitar abuso e uso para técnicas de impressão digital. Os apps não podem
fazer suposições sobre o formato dessa versão. Os apps já precisam
processar mudanças de versão ao usar essa API e, na maioria dos casos, não precisam
mudar o comportamento atual, a menos que o desenvolvedor tenha tentado inferir
informações adicionais que estão além do escopo pretendido dessa API.
Intents mais seguras
O recurso Intents mais seguros é uma iniciativa de segurança multifásica projetada para melhorar a segurança do mecanismo de resolução de intents do Android. O objetivo é proteger os apps contra ações maliciosas adicionando verificações durante o processamento de intents e filtrando intents que não atendem a critérios específicos.
No Android 15, o recurso se concentrou no app de envio. Agora, com o Android 16, o controle muda para o app de recebimento, permitindo que os desenvolvedores ativem a resolução de intents estrita usando o manifesto do app.
Duas mudanças importantes estão sendo implementadas:
As intents explícitas precisam corresponder ao filtro de intent do componente de destino: se uma intent segmentar explicitamente um componente, ela precisará corresponder ao filtro de intent desse componente.
Intents sem uma ação não podem corresponder a nenhum filtro de intent: as intents que não têm uma ação especificada não podem ser resolvidas para nenhum filtro de intent.
Essas mudanças só se aplicam quando vários apps estão envolvidos e não afetam o processamento de intents em um único app.
Impacto
A natureza de ativação significa que os desenvolvedores precisam ativar explicitamente o recurso no manifesto do app para que ele entre em vigor. Como resultado, o impacto do recurso será limitado aos apps cujos desenvolvedores:
- Conhecem o recurso Intents mais seguros e os benefícios dele.
- Escolhem ativamente incorporar práticas de processamento de intents mais rigorosas nos apps.
Essa abordagem de ativação minimiza o risco de quebrar apps atuais que podem depender do comportamento de resolução de intents menos seguro.
Embora o impacto inicial no Android 16 possa ser limitado, a iniciativa Intents mais seguros tem um roteiro para um impacto mais amplo em versões futuras do Android. O plano é tornar a resolução de intents estrita o comportamento padrão.
O recurso Intents mais seguros tem o potencial de melhorar significativamente a segurança do ecossistema Android, dificultando a exploração de vulnerabilidades no mecanismo de resolução de intents por apps maliciosos.
No entanto, a transição para a desativação e a aplicação obrigatória precisa ser gerenciada com cuidado para resolver possíveis problemas de compatibilidade com apps atuais.
Implementação
Os desenvolvedores precisam ativar explicitamente a correspondência de intents mais rigorosa usando o
intentMatchingFlags atributo no manifesto do app.
Confira um exemplo em que o recurso é ativado para todo o app, mas desativado em um receptor:
<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>
Mais informações sobre as flags aceitas:
| Nome da flag | Descrição |
|---|---|
| enforceIntentFilter | Aplica uma correspondência mais rigorosa para intents recebidas. |
| nenhum | Desativa todas as regras de correspondência especiais para intents recebidas. Ao especificar várias flags, os valores conflitantes são resolvidos dando precedência à flag "nenhum". |
| allowNullAction | Relaxa as regras de correspondência para permitir que intents sem uma ação correspondam. Essa flag precisa ser usada em conjunto com "enforceIntentFilter" para alcançar um comportamento específico. |
Como testar e depurar
Quando a aplicação está ativa, os apps funcionam corretamente se o autor da chamada de intent tiver preenchido a intent corretamente.
No entanto, as intents bloqueadas vão acionar mensagens de registro de aviso como
"Intent does not match component's intent filter:" e "Access blocked:"
com a tag "PackageManager."
Isso indica um possível problema que pode afetar o app e exige
atenção.
Filtro do Logcat:
tag=:PackageManager & (message:"Intent does not match component's intent filter:" | message: "Access blocked:")
Filtragem de chamadas de sistema da GPU
Para reforçar a superfície da GPU Mali, os IOCTLs da GPU Mali que foram descontinuados ou destinados apenas ao desenvolvimento de GPU foram bloqueados em builds de produção. Além disso, as IOCTLs usadas para criação de perfil de GPU foram restritas ao processo de shell ou a aplicativos depuráveis. Consulte a atualização do SAC para mais detalhes sobre a política no nível da plataforma.
Essa mudança ocorre em dispositivos Pixel que usam a GPU Mali (Pixel 6 a 9). A Arm
forneceu a categorização oficial dos IOCTLs em
Documentation/ioctl-categories.rst da versão r54p2. Essa
lista vai continuar sendo atualizada em versões futuras de drivers.
Essa mudança não afeta as APIs gráficas compatíveis (incluindo Vulkan e OpenGL) e não deve impactar desenvolvedores ou aplicativos atuais. Ferramentas de criação de perfil da GPU, como o Streamline Performance Analyzer e o Android GPU Inspector, não serão afetadas.
Teste
Se você encontrar uma negação do SELinux semelhante a esta, é provável que seu aplicativo tenha sido afetado por essa mudança:
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
Se o aplicativo precisar usar IOCTLs bloqueados, registre um bug e atribua-o a android-partner-security@google.com.
Perguntas frequentes
Essa mudança na política se aplica a todos os OEMs? Essa mudança será opcional, mas estará disponível para qualquer OEM que queira usar esse método de reforço da proteção. As instruções para implementar a mudança estão na documentação de implementação.
É obrigatório fazer mudanças na base de código do OEM para implementar isso, ou ele vem com uma nova versão do AOSP por padrão? A mudança no nível da plataforma virá com uma nova versão do AOSP por padrão. Os fornecedores podem ativar essa mudança no codebase se quiserem aplicá-la.
Os SoCs são responsáveis por manter a lista de IOCTLs atualizada? Por exemplo, se meu dispositivo usa uma GPU ARM Mali, preciso entrar em contato com a ARM para fazer alguma mudança? Os SoCs individuais precisam atualizar as listas de IOCTL por dispositivo após o lançamento do driver. Por exemplo, a ARM vai atualizar a lista de IOCTLs publicada quando houver atualizações de driver. No entanto, os OEMs precisam incorporar as atualizações na SEPolicy e adicionar os IOCTLs personalizados selecionados às listas, conforme necessário.
Essa mudança se aplica automaticamente a todos os dispositivos Pixel disponíveis no mercado ou é necessário que o usuário faça alguma ação para ativar algo e aplicar a mudança? Essa mudança se aplica a todos os dispositivos Pixel no mercado que usam a GPU Mali (Pixel 6 a 9). Nenhuma ação do usuário é necessária para aplicar essa mudança.
O uso dessa política afeta o desempenho do driver do kernel? Essa política foi testada na GPU Mali usando o GFXBench, e não foi observada nenhuma mudança mensurável no desempenho da GPU.
É necessário que a lista de IOCTLs esteja alinhada com as versões atuais do espaço do usuário e do driver do kernel? Sim, a lista de IOCTLs permitidos precisa ser sincronizada com os IOCTLs compatíveis com os drivers de espaço do usuário e do kernel. Se os IOCTLs no espaço do usuário ou no driver do kernel forem atualizados, a lista de IOCTLs da SEPolicy também precisará ser atualizada para corresponder.
A ARM categorizou IOCTLs como "restritas" / "instrumentação", mas queremos usar algumas delas em casos de uso de produção e/ou negar outras. Os OEMs/SoCs individuais são responsáveis por decidir como categorizar os IOCTLs que usam, com base na configuração das bibliotecas Mali do espaço do usuário. A lista da ARM pode ser usada para ajudar a decidir sobre isso, mas o caso de uso de cada OEM/SoC pode ser diferente.
Privacidade
O Android 16 (nível 36 da API) inclui as seguintes mudanças de privacidade.
Permissão de rede local
具有 INTERNET 权限的任何应用都可以访问局域网中的设备。
这使得应用可以轻松连接到本地设备,但也存在隐私方面的影响,例如形成用户指纹,以及成为位置信息的代理。
本地网络保护项目旨在通过在新的运行时权限后限制对本地网络的访问,来保护用户的隐私。
发布计划
这项变更将分别在 25Q2 和 26Q2 这两个版本之间部署。 开发者必须遵循 25Q2 的相关指南并分享反馈,因为这些保护措施将在后续 Android 版本中强制执行。此外,他们还需要按照以下指南更新依赖于隐式本地网络访问权限的场景,并为用户拒绝和撤消新权限做好准备。
影响
在当前阶段,LNP 是一项选择启用功能,这意味着只有选择启用的应用会受到影响。选择启用阶段的目标是让应用开发者了解应用的哪些部分依赖于隐式本地网络访问权限,以便他们为下一个版本做好权限保护准备。
如果应用使用以下方式访问用户的本地网络,则会受到影响:
- 直接或通过库使用本地网络地址(例如 mDNS 或 SSDP 服务发现协议)上的原始套接字
- 使用可访问本地网络的框架级类(例如 NsdManager)
向本地网络地址发送流量和从本地网络地址接收流量需要本地网络访问权限。下表列出了一些常见情况:
| 应用低级层网络操作 | 需要本地网络权限 |
|---|---|
| 建立出站 TCP 连接 | 是 |
| 接受传入的 TCP 连接 | 是 |
| 发送 UDP 单播、多播、广播 | 是 |
| 接收传入的 UDP 单播、多播、广播 | 是 |
这些限制是在网络堆栈深处实现的,因此适用于所有网络 API。这包括在原生代码或受管理代码中创建的套接字、Cronet 和 OkHttp 等网络库,以及基于这些库实现的任何 API。尝试解析本地网络上的服务(即带有 .local 后缀的服务)将需要本地网络权限。
上述规则的例外情况:
- 如果设备的 DNS 服务器位于本地网络上,则进出该服务器(位于端口 53)的流量不需要本地网络访问权限。
- 使用输出切换器作为其应用内选择器的应用将不需要本地网络权限(更多指南将在 2025 年第 4 季度发布)。
开发者指南(选择启用)
如需选择启用本地网络限制,请执行以下操作:
- 将设备刷写到 25Q2 Beta 3 或更高版本的 build。
- 安装要测试的应用。
在 adb 中切换 Appcompat 标志:
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>重启设备
现在,您的应用对本地网络的访问受到限制,任何访问本地网络的尝试都会导致套接字错误。如果您使用的 API 在应用进程之外执行本地网络操作(例如:NsdManager),在选择启用阶段,这些 API 不会受到影响。
如需恢复访问权限,您必须向应用授予 NEARBY_WIFI_DEVICES 权限。
- 确保应用在其清单中声明了
NEARBY_WIFI_DEVICES权限。 - 依次前往设置 > 应用 > [应用名称] > 权限 > 附近的设备 > 允许。
现在,应用对本地网络的访问权限应该已恢复,并且所有场景都应像选择启用应用之前一样正常运行。
本地网络保护功能开始强制执行后,应用的网络流量将受到以下影响。
| 权限 | 出站 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) 也被归类为本地网络地址。
Fotos pertencentes ao app
Quando um app destinado ao SDK 36 ou mais recente solicitar permissões de fotos e vídeos em dispositivos com o Android 16 ou versões mais recentes, os usuários que optarem por limitar o acesso à mídia selecionada vão encontrar as fotos pertencentes ao app pré-selecionadas no seletor de fotos. Os usuários podem desmarcar qualquer um desses itens pré-selecionados, o que revoga o acesso do app a essas fotos e vídeos.