每年 Google Play 均要求上架海外的 App 在 8 月 31 日前完成新系统版本适配,今年目标为 Android 16。若需更多时间,可申请延期至 11 月 1 日,但建议尽早完成。鉴于本次 Android 16 改动工作量较大,Google 提供了兼容方案以协助开发者高效合规。
本文提供两种适配方案:
- 基础版:简单适配,耗时短,但明年仍需进行详细适配。
- 进阶版:一次性完成 Android 16 全面适配(即本文内容)。
以下内容基于实际项目经验总结,供开发者参考。
进阶版 Android 16 适配教程
1. 升级 targetSdk 和 compileSdk
将 targetSdk 和 compileSdk 从 35 升级至 36。
2. 升级 Gradle 版本
将 Gradle 版本从 8.6.0 升级至 8.9.0 或更高(推荐 8.9.3)。
为避免配置遗漏,建议使用 Android Gradle 插件助理一次性完成升级。
3. 有序广播优先级范围调整
在 Android 16 中,广播优先级不再全局有效,仅在同一应用进程内生效。跨进程有序广播无法再设置优先级。
此外,广播优先级被限制在 -999 至 999 之间(SYSTEM_LOW_PRIORITY+1 到 SYSTEM_HIGH_PRIORITY-1),仅系统组件可使用边界值。若原设置超过此范围(如 1000),需调整为 999。
4. 强制适配 Edge-to-Edge
Android 15 曾允许通过 R.attr#windowOptOutEdgeToEdgeEnforcement 停用无边框设计,但 Android 16 已强制要求适配。具体方案可参考往期 Android 15 适配教程。
5. 适配预测性返回机制
针对 Android 16(API 36)及以上版本,预测性返回动画默认启用,系统不再调用 onBackPressed() 或调度 KeyEvent.KEYCODE_BACK。若业务逻辑依赖这两个方法,需进行如下兼容处理:
- 移除项目中所有的 onBackPressed() 及 KeyEvent.KEYCODE_BACK 相关代码。
- 在公共父类(如 BaseActivity)中添加以下回调逻辑:
getOnBackPressedDispatcher().addCallback(onBackPressedCallback());
// 默认不拦截,保留 Android 16 预测性返回行为
protected OnBackPressedCallback onBackPressedCallback(){
return new OnBackPressedCallback(false) {
@Override
public void handleOnBackPressed() {
}
};
}
// 若部分页面需自定义返回逻辑,可重写该方法
@Override
protected OnBackPressedCallback onBackPressedCallback() {
return new OnBackPressedCallback(true) {
@Override
public void handleOnBackPressed() {
// 原有 onBackPressed() 或 KEYCODE_BACK 中的业务逻辑
}
};
}
6. 适配屏幕方向、尺寸可调整性与宽高比
在 Android 16 中,最小宽度 ≥ 600dp 的大屏设备将忽略应用的屏幕方向、尺寸调整和宽高比限制,应用会填满整个窗口,不再出现竖屏黑边。需进行以下适配:
1) 配置 configChanges
为每个 Activity 添加以下配置,防止屏幕旋转时页面销毁:
android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize|density"
2) 折叠屏大小屏切换监听方案
方案 A:引入 WindowManager 库
// 依赖
androidx.window:window:1.3.0
// 监听屏幕状态变化
lifecycleScope.launch {
WindowInfoTracker.getOrCreate(this@MainActivity)
.windowLayoutInfo(this@MainActivity)
.collect { newLayoutInfo ->
updateLayout(newLayoutInfo)
}
}
private fun updateLayout(windowLayoutInfo: WindowLayoutInfo) {
val foldingFeatures = windowLayoutInfo.displayFeatures.filterIsInstance<FoldingFeature>()
if (foldingFeatures.isEmpty()) {
// 非折叠屏或外屏(小屏)
onControlScreenChanged(isBigScreen = false)
} else {
val feature = foldingFeatures.first()
if (feature.state == FoldingFeature.State.FLAT || feature.state == FoldingFeature.State.HALF_OPENED) {
// 大屏状态
onControlScreenChanged(isBigScreen = true)
}
}
}
方案 B:通过 onConfigurationChanged 监听
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
if (newConfig.smallestScreenWidthDp >= 600) {
// 大屏模式
} else {
// 小屏模式
}
}
方案 C:设置 OnLayoutChangeListener
val onLayoutChangeListener: View.OnLayoutChangeListener = View.OnLayoutChangeListener { view, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom ->
val smallestScreenWidthDp = getResources().getConfiguration().smallestScreenWidthDp
if (currentSmallestScreenWidthDp != smallestScreenWidthDp) {
currentSmallestScreenWidthDp = smallestScreenWidthDp
getScreenSizeChangeCallback()(this)
}
}
3) 大小屏 UI 调整
- 将易拉伸失真的图片替换为.9 格式。
- 避免硬编码宽高值(如 getDisplayMetrics().widthPixels),应动态计算以适应不同屏幕,防止控件在大屏切换小屏时不可见。
7. Kotlin 版本升级要求
Gradle 升级至 8.9.3 后,Kotlin 需同步升级至 2.1.0 或以上版本。
8. 底层库升级常见问题及解决方案
大版本更新时建议同步升级底层库,但需注意潜在兼容性问题:
1) Glide 5.0.7 在旧机型崩溃
错误信息:java.lang.NoClassDefFoundError: Failed resolution of: Ljava/util/function/Supplier;
解决方案:启用 coreLibraryDesugaring
android {
compileOptions {
coreLibraryDesugaringEnabled true
}
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.5'
}
2) Biometric 指纹识别异常
当 androidx.core 升级至 1.18.0+,若 biometric 仍使用 1.1.0 版本,canAuthenticate() 方法可能异常。
解决方案:将 biometric 升级至 1.4.0-alpha05 或以上版本。
本文总结
以上为 Android 16 进阶版完整适配方案,涵盖 SDK 升级、广播机制、返回手势、大屏适配及常见依赖冲突处理。希望能为出海开发者提供实用参考,助力业务顺利推进。

