必须 链接到标题

如果不解决这些问题,将导致应用崩溃、网络流量被拦截或被应用市场拒绝上架。

Android 17 (API 37) 链接到标题

  • 强制大屏可调整大小: 在最小宽度为 600dp 的显示屏上,系统现在会忽略开发者针对屏幕方向和可调整大小设置的豁免选项。像 screenOrientationresizeableActivity="false" 这样的清单属性将被废弃;应用必须原生支持自由窗口模式和屏幕方向更改。
  • 本地网络锁定: 应用必须获取 ACCESS_LOCAL_NETWORK 运行时权限才能与本地子网上的设备进行通信。如果缺少此权限,对本地地址的 Socket 连接尝试将被拦截并在内核层被阻断。
  • 原生库强化: 通过 System.load() 加载的任何原生库都必须标记为只读;否则系统将抛出 UnsatisfiedLinkError 异常。
  • 静态常量完整性: 通过反射修改 static final 字段现在会抛出 IllegalAccessException,通过 JNI 进行修改将导致应用立即崩溃。
  • 短信验证码保护: 为防止劫持,大多数应用以编程方式访问标准短信(SMS)一次性验证码(OTP)的权限将被延迟三个小时。开发者应迁移至 SMS Retriever API 以实现即时访问。
  • 后台音频强化: 后台应用必须具备有效且拥有“使用中”权限的前台服务才能播放音频或请求音频焦点;否则,API 调用将静默失败。
  • Play 商店通讯录政策: 使用 READ_CONTACTS 权限现在需要在 Play Console 进行技术声明以证明其为核心功能,或者迁移至无需权限的系统通讯录选择器。
  • 无锁 MessageQueue: 核心线程架构现在采用无锁设计以减少丢帧,这会破坏对 mMessagesmIdleHandlers 等私有内部字段的深度反射。
  • 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) 链接到标题

  • 前台服务类型: 应用在启动服务前必须声明特定类型(例如 locationmediaPlayback)并获取相应的运行时权限。
  • 选定照片访问: 用户可以授予部分媒体访问权限;应用应利用 Jetpack PickVisualMedia API 来支持进程外系统选择器。
  • 可执行文件强化: 动态加载的可执行文件(DEX、JAR)必须标记为只读。
  • 隐式 Intent 限制: 隐式 Intent 不再能指向未标记为 android:exported="true" 的内部应用组件。

Android 13 (API 33) 链接到标题

  • 媒体权限细化: 宽泛的 READ_EXTERNAL_STORAGE 被拆分为 READ_MEDIA_IMAGESREAD_MEDIA_VIDEOREAD_MEDIA_AUDIO
  • 通知权限: 应用必须请求 POST_NOTIFICATIONS 运行时权限才能显示通知。

Android 12 (API 31-32) 链接到标题

  • 更安全的组件导出: 每个带有 Intent 过滤器的 Activity 或 Service 必须明确声明 android:exported="true|false"
  • PendingIntent 可变性: 每个 PendingIntent 都必须指定 FLAG_IMMUTABLEFLAG_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 或视频缓冲区),从而延长进程保持缓存状态的时间。