使用ADB降级安装不同Target SDK版本APK时遇权限限制报错的解决方法咨询
解决ADB降级安装APK时的Target SDK权限限制问题
刚好碰到过类似的情况,你遇到的[-26]错误其实是Android系统的一道安全关卡:当前已装应用的Target SDK是29,支持运行时权限,而你要降级的旧APK Target SDK仅为7,完全没有运行时权限的逻辑,系统怕这种降级会搞乱权限管理,所以直接阻止了。
给你几个可行的解决思路:
1. 先卸载现有应用再装旧版(最稳妥)
这是最直接的办法,虽然会丢失应用数据,但能彻底绕开权限限制:
adb uninstall <你的包名> adb install <旧APK路径>
要是想保留数据,可以先备份再操作:
# 备份应用数据 adb backup -apk <你的包名> # 卸载当前版本 adb uninstall <你的包名> # 安装旧版本 adb install <旧APK路径> # 恢复备份的数据 adb restore backup.ab
不过备份恢复不一定能完美适配旧版本,可能会有小问题,得做好心理准备。
2. 用Android 12+专属的ADB参数绕过
从Android 12(API 31)开始,ADB加了个专门对付这种情况的参数--bypass-low-target-sdk-block,直接把它加到你的命令里就行:
adb install -t -r -d --bypass-low-target-sdk-block <旧APK路径>
这个参数就是为了解决低Target SDK版本应用降级安装的限制,不过只在Android 12及以上的设备上生效。
3. 修改旧APK的Target SDK版本(进阶操作)
如果上面的方法都不行,你可以试试把旧APK的Target SDK改成和当前版本一样的29,让系统觉得它权限逻辑是兼容的:
- 用Apktool反编译旧APK:
apktool d <旧APK路径> - 打开反编译后的
AndroidManifest.xml,把android:targetSdkVersion改成29:<uses-sdk android:targetSdkVersion="29" android:minSdkVersion="7" ... /> - 重新编译并签名APK:
apktool b <反编译后的文件夹> -o modified.apk # 用你自己的签名文件签名,没有的话可以生成一个测试签名 jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 modified.apk 你的签名文件.jks - 用修改后的APK执行降级安装:
adb install -t -r -d modified.apk
这个方法需要点APK修改的基础,而且签名最好和原APK一致,不然得开启设备的未知来源权限或者禁用签名验证。
你说的那些macOS应用能完成降级,本质上也是用了类似的思路:要么先卸载再恢复数据,要么偷偷修改了APK的Target SDK版本,或者调用了系统的隐藏接口绕过限制,原理和上面的方法差不多。
内容的提问来源于stack exchange,提问作者user3673952




