大数跨境

Android 16 适配保姆级实战教程(进阶版)

Android 16 适配保姆级实战教程(进阶版) 趣浪出海
2026-08-03
6
导读:还是建议大家一次性把 Android 16 完整适配完,要不后续随着版本的更新迭代,工作量肯定是越来越大的。

每年 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。若业务逻辑依赖这两个方法,需进行如下兼容处理:

  1. 移除项目中所有的 onBackPressed() 及 KeyEvent.KEYCODE_BACK 相关代码。
  2. 在公共父类(如 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 升级、广播机制、返回手势、大屏适配及常见依赖冲突处理。希望能为出海开发者提供实用参考,助力业务顺利推进。

【声明】内容源于网络
0
0
趣浪出海
各类跨境出海行业相关资讯
内容 327
粉丝 0
趣浪出海 各类跨境出海行业相关资讯
总阅读29.1k
粉丝0
内容327