android 12+ 兼容性问题核心在于权限模型、硬件声明和abi支持三方面变更:需重设minsdkversion(建议19)、targetsdkversion(至少31),手动补全bluetooth_scan等新权限及uses-feature声明,同步build.gradle中abifilters与.so文件架构,并重构运行时权限检查逻辑。

Android 12+ 的兼容性问题不是配置没填全,而是权限模型、硬件声明、ABI 支持这三块全变了——不改就装不上、一调就闪退、连蓝牙/相机都直接拒之门外。
manifest.json 里 minSdkVersion 和 permissions 必须重设
很多项目沿用旧模板,minSdkVersion 还设成 23 或更高,直接把 Android 10–11 设备拦在外面;而更关键的是,Android 12 强制要求显式声明新权限,光靠 HBuilderX 可视化勾选或旧版 permissions 配置根本无效。
-
minSdkVersion建议设为19(覆盖 Android 4.4+),除非你明确放弃老设备 -
targetSdkVersion至少设为31(Android 12),否则系统会降级行为,但高版本权限仍不生效 -
permissions数组必须手动补全,尤其涉及硬件功能时:"<uses-permission android:name='\"android.permission.BLUETOOTH_SCAN\"/'>"</uses-permission>"<uses-permission android:name='\"android.permission.BLUETOOTH_CONNECT\"/'>"</uses-permission>"<uses-permission android:name='\"android.permission.ACCESS_FINE_LOCATION\"/'>"</uses-permission>"<uses-feature android:name='\"android.hardware.camera\"' android:required='\"false\"/'>"</uses-feature> - 注意:
android:required="false"对相机、蓝牙等硬件特性是必需的,否则 Google Play 或部分国产系统会直接判定“不兼容”
离线打包时 build.gradle 里要检查 ABI 过滤和 targetSdkVersion 同步
云打包掩盖了底层细节,但离线打包(导出 Android Studio 工程)后,build.gradle 里的 targetSdkVersion 和 abiFilters 若没同步 manifest.json,APK 就会和配置脱节。
YZTurboWebAndroid 高性能 Android WebView 容器 SDK 接入。用于在 Android 项目中集成 WebView 容器,实现: (1) WebView 预加载与复用,提升 H5 页面加载速度 (2) 离线包管理,拦截请求优先命中本地资源 (3) JS Bridge 双向通信,Na...
- 打开
app/build.gradle,确认android { defaultConfig { targetSdkVersion 31 } }与 manifest.json 一致 - 在
ndk { abiFilters 'arm64-v8a', 'armeabi-v7a' }中显式声明支持的 CPU 架构,避免华为 Mate 50、小米 14 等新机因找不到对应 so 库而报INSTALL_FAILED_NO_MATCHING_ABIS - 如果用了原生插件,检查其
libs/目录是否包含arm64-v8a下的 .so 文件;缺失会导致安装成功但运行时报UnsatisfiedLinkError
运行时权限请求逻辑必须按 Android 12+ 规则重构
单纯调用 uni.authorize 或 plus.android.requestPermissions 在 Android 12+ 上大概率失败——系统根本不弹窗,也不回调,静默拒绝。
- 必须先检查
plus.android.hasPermission('android.permission.BLUETOOTH_CONNECT'),再决定是否请求;不能只查旧权限如BLUETOOTH - 蓝牙相关操作(扫描、连接、配对)需分两步:先确保
BLUETOOTH_SCAN+ACCESS_FINE_LOCATION已授权,再请求BLUETOOTH_CONNECT - 相机调用前,务必用
plus.android.hasPermission('android.permission.CAMERA')显式判断,且不能依赖uni.getProvider返回结果代替真实权限状态 - 鸿蒙设备上,即使返回“已授权”,仍可能触发二次系统弹窗,需监听
plus.android.onRequestPermissionsResult做兜底处理
横竖屏、安全区、字体图标这些“小问题”在 Android 12+ 上更容易暴露
它们平时不报错,但在 Android 12+ 的严格校验下会变成兼容性断点:比如横屏设置失效导致 Activity 重建崩溃,或字体图标路径缺协议被 WebView 拦截。
- 横竖屏锁定必须在
pages.json的页面级style中写"pageOrientation": "landscape-primary",全局globalStyle设置在某些 OEM 系统(如 ColorOS 14)上会被忽略 - 状态栏和安全区适配要用
env(safe-area-inset-top),constant()在 Android 12+ WebView 中已废弃,强行使用会导致 padding 计算为 0 - 字体图标 URL 必须带完整协议,
url('//at.alicdn.com/...')会触发 Mixed Content 被拦截,得改成url('https://at.alicdn.com/...')
真正卡住人的从来不是单个配置项,而是 manifest.json、build.gradle、运行时 JS 权限检查、原生插件 ABI 四者不同步——改完一个,忘了另一个,结果在某台 Android 13 的 OPPO Find X6 上一切正常,换到华为 P60 就提示“不兼容”。每次调整后,务必用 adb install -r 重装并观察 logcat 输出,别只信安装成功弹窗。










