修改 APK 的 targetSdkVersion 到 31 就想在 Android 12 上正常运行?别天真了——签名失效、权限崩溃、UI 错位、启动白屏,随便一个都能让你寸步难行。这不是改个数字就能糊弄过去的工作。

今天把这套完整流程拆开揉碎了讲,跟着操作,能帮你避开大部分坑。
先确认你的 APK 是否允许修改
打开你惯用的 APK 编辑器(MT 管理器、APK Editor Studio 都行),把目标 APK 拖进去。如果一上来就弹出“未签名”或“签名验证失败”,那基本可以断定这个 APK 被加固过,或者自带严格的签名校验。遇到这种情况别硬来——强行修改只会得到一个无法安装的废包。老老实实走源码重建的路才是正解。
如果能正常浏览到里面的资源文件和代码,好,继续往下走。
修改 AndroidManifest.xml 中的 targetSdkVersion
在 APK 编辑器里找到 AndroidManifest.xml,双击编辑。定位到 标签,把 android:targetSdkVersion 改为你要的目标版本——Android 12 是 31,Android 13 是 33,Android 14 是 34。
这里有个很容易忽略的细节:顺手看一眼 android:minSdkVersion,如果它比新的 target 还高,那就搞反了,安装时会直接报 INSTALL_FAILED_OLDER_SDK。
改完保存,编辑器会自动打包并提示你签名。这一步是必须的,不签名的 APK 装不上。
关键补救:修复因 target 升级引发的崩溃项
Android 10 开始强制分区存储,到了 Android 12,requestLegacyExternalStorage 属性直接被禁用。如果你的旧 APK 里还挂着 android:requestLegacyExternalStorage="true",赶紧删掉,不然在 Android 12+ 设备上,一启动就闪退给你看。
Android 13 限制了后台启动 Activity。如果你在 Manifest 里把某个组件设为 android:exported="true",却没有配对应的 android:permission,那安装阶段就会被系统判死刑。最好的做法是:对所有 exported="true" 的组件,都补上明确的权限声明。
Android 14 则开始清理非 SDK 接口的反射调用。如果 APK 里用了 ActivityThread.currentApplication() 这类 HiddenApi,要么手动删掉,要么换成官方的 Compat API。APK 编辑器不会帮你自动识别这些代码,你只能去翻 smali 或者反编译 Java 源码,一条条核对。
重签名与验证
签名这一步,有两个路子。
方法一:用 APK 编辑器内置签名功能
点击“保存并签名”,选择“生成新密钥”,随便填点信息(国家填 CN,别的默认就行),等它跑完。得到的文件后缀必须是 .apk,不是 .zip。
方法二:命令行签名(更可靠,推荐)
把编辑好的 APK 导出到电脑,先跑这条命令生成密钥库:
keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias
然后再用 apksigner 签名:
apksigner sign --ks my-release-key.jks app-debug-unaligned.apk
【特别提醒】 签名之后,务必用 adb install -r 来安装测试。别图方便直接双击 APK 或者用文件管理器安装——后者会跳过一些校验,给你一个“假成功”的错觉。
真机验证必做三件事
- 在 Android 12+ 的真机上装好之后,打开设置 → 应用 → 你的 APP → 权限,挨个看看所有必需的权限(比如存储、位置)是不是都能正常手动开启。
- 触发一次文件读写操作,比如导出个日志或者选一张图片。观察弹出的到底是系统目录选择器,还是老旧的那种
/storage/emulated/0路径——如果是后者,说明分区存储适配没到位。 - 杀掉进程,冷启动一次。确认不闪退、不黑屏、不卡死在启动页。这一步最暴露问题,别偷懒。
