必须 链接到标题
如果不解决这些问题,将导致应用崩溃、网络流量被拦截或被应用市场拒绝上架。
Android 17 (API 37) 链接到标题
- 强制大屏可调整大小: 在最小宽度为 600dp 的显示屏上,系统现在会忽略开发者针对屏幕方向和可调整大小设置的豁免选项。像
screenOrientation和resizeableActivity="false"这样的清单属性将被废弃;应用必须原生支持自由窗口模式和屏幕方向更改。 - 本地网络锁定: 应用必须获取
ACCESS_LOCAL_NETWORK运行时权限才能与本地子网上的设备进行通信。如果缺少此权限,对本地地址的 Socket 连接尝试将被拦截并在内核层被阻断。 - 原生库强化: 通过
System.load()加载的任何原生库都必须标记为只读;否则系统将抛出UnsatisfiedLinkError异常。 - 静态常量完整性: 通过反射修改
static final字段现在会抛出IllegalAccessException,通过 JNI 进行修改将导致应用立即崩溃。 - 短信验证码保护: 为防止劫持,大多数应用以编程方式访问标准短信(SMS)一次性验证码(OTP)的权限将被延迟三个小时。开发者应迁移至 SMS Retriever API 以实现即时访问。
- 后台音频强化: 后台应用必须具备有效且拥有“使用中”权限的前台服务才能播放音频或请求音频焦点;否则,API 调用将静默失败。
- Play 商店通讯录政策: 使用
READ_CONTACTS权限现在需要在 Play Console 进行技术声明以证明其为核心功能,或者迁移至无需权限的系统通讯录选择器。 - 无锁 MessageQueue: 核心线程架构现在采用无锁设计以减少丢帧,这会破坏对
mMessages或mIdleHandlers等私有内部字段的深度反射。 - NPU 功能声明: 需要直接访问神经网络处理单元(NPU)的应用必须在清单中明确声明
android.hardware.npu功能标志,以避免被硬件层拦截。 - Activity 重建更新: 对于键盘可见性或颜色模式等配置更改,系统不再默认重启 Activity。如果应用依赖完全
restart重新加载资源,则必须使用android:recreateOnConfigChanges明确启用此行为。
Android 16 (API 36) 链接到标题
- 强制 Edge-to-Edge 显示: 用于退出 Edge-to-Edge 强制执行的清单选项已被弃用并禁用;应用必须原生支持在系统栏后方绘制界面。
- 预测性返回导航: 默认启用预测性返回系统动画;应用必须使用受支持的后退导航 API,因为
onBackPressed不再被调用。
Android 14 & 15 (API 34-35) 链接到标题
- 前台服务类型: 应用在启动服务前必须声明特定类型(例如
location、mediaPlayback)并获取相应的运行时权限。 - 选定照片访问: 用户可以授予部分媒体访问权限;应用应利用 Jetpack PickVisualMedia API 来支持进程外系统选择器。
- 可执行文件强化: 动态加载的可执行文件(DEX、JAR)必须标记为只读。
- 隐式 Intent 限制: 隐式 Intent 不再能指向未标记为
android:exported="true"的内部应用组件。
Android 13 (API 33) 链接到标题
- 媒体权限细化: 宽泛的
READ_EXTERNAL_STORAGE被拆分为READ_MEDIA_IMAGES、READ_MEDIA_VIDEO和READ_MEDIA_AUDIO。 - 通知权限: 应用必须请求
POST_NOTIFICATIONS运行时权限才能显示通知。
Android 12 (API 31-32) 链接到标题
- 更安全的组件导出: 每个带有 Intent 过滤器的 Activity 或 Service 必须明确声明
android:exported="true|false"。 - PendingIntent 可变性: 每个
PendingIntent都必须指定FLAG_IMMUTABLE或FLAG_MUTABLE,以防止后台劫持漏洞利用。
Android 11 (API 30) 链接到标题
- 强制分区存储: 永久移除了通过旧版兼容机制进行的宽泛文件系统访问;应用必须使用应用专属目录或 MediaStore API。
- 软件包可见性: 默认情况下,应用无法查询所有已安装的软件包;必须在清单的
<queries>中声明目标应用。
推荐 链接到标题
这些最佳实践可确保应用保持响应迅速和高效运行。
- 废弃 System.gc(): 现代 ART 使用分代并发标记-压缩收集器 频繁回收短生命周期对象。手动调用通常会被忽略以节省电量,或者触发破坏性停顿,导致明显的 UI 卡顿。
- 应用级内存防护栏: 系统根据设备容量强制执行严格的 RAM 限制,并跟踪匿名常驻内存集大小。超过这些限制会触发静默内核终止;可通过
ApplicationExitInfo.getDescription()查找 “MemoryLimiter” 字符串来识别此类问题。 - 强制启用 R8 “Full Mode”: 移除
android.enableR8.fullMode=false配置可允许激进的无效代码剔除和方法内联,从而显著减小 DEX 大小和常驻内存占用。 - 采用 Compose 优先的 UI: 标准的基于 View 的组件现已进入维护模式。所有新的平台 API 和工具均专为 Jetpack Compose 构建。
- AppFunctions 框架: 通过使用
@AppFunction注解功能向“智能系统”过渡。这使得 AI 智能体能够利用 KDoc 描述发现并执行应用工作流。 - 主动裁剪内存: 当应用离开可见状态时,实现
onTrimMemory()以释放大量内存分配(如 Bitmap 或视频缓冲区),从而延长进程保持缓存状态的时间。