重新编译修改的Android应用无法在Android 11安装,报错-124求解决工具
Android 11 下APK安装错误(-124)的解决方法
问题描述
反编译现有Android应用并修改后,重新编译签名的APK无法在Android 11上安装,模拟器返回错误:
Error code: '-124', message='-124: Failed parse during installPackageLI: Targeting R+ (version 30 and above) requires the resources.arsc of installed APKs to be stored uncompressed and aligned on a 4-byte boundary'
我使用的手动操作流程如下:
手动流程: 步骤1:生成密钥库(仅需一次) 需要生成一个密钥库,用于给未签名的APK签名。使用JDK提供的keytool,路径为%JAVA_HOME%/bin/ keytool -genkey -v -keystore my.keystore -keyalg RSA -keysize 2048 -validity 10000 -alias app 步骤2或4:Zipalign对齐 zipalign是Android SDK提供的工具,示例路径为%ANDROID_HOME%/sdk/build-tools/24.0.2/,如果要上传APK到应用商店,这是必填的优化步骤。 zipalign -p 4 my.apk my-aligned.apk 注意:使用旧版jarsigner时,需要在签名**之后**执行zipalign;使用新版apksigner时,要在签名**之前**执行(确实容易搞混)。apksigner会保留APK的对齐和压缩状态(jarsigner做不到),所以先执行zipalign再用apksigner是可行的。 可以用以下命令验证对齐状态: zipalign -c 4 my-aligned.apk 步骤3:签名与验证 使用build-tools 24.0.3及更高版本 Android 7.0引入了APK签名方案v2,这是一种新的应用签名方案,能加快应用安装速度,还能更好地防止APK被未经授权篡改。因此谷歌推出了自己的签名工具apksigner,脚本文件位于%ANDROID_HOME%/sdk/build-tools/24.0.3/(jar包在/lib子目录下),使用方式如下: apksigner sign --ks-key-alias alias_name --ks my.keystore my-app.apk 验证签名的命令: apksigner verify my-app.apk 使用build-tools 24.0.2及更低版本 使用jarsigner,它和keytool一样属于JDK工具,路径为%JAVA_HOME%/bin/,使用方式: jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my.keystore my-app.apk my_alias_name 验证签名的命令: jarsigner -verify -verbose my_application.apk
解决方法
该错误是Android 11(API 30+)的强制规则:目标版本为R及以上的APK,其resources.arsc必须以未压缩状态存储,且满足4字节对齐。需通过以下工具和步骤修复:
1. 使用适配Android 11的Build Tools
确保你的Android SDK Build Tools版本在30.0.0及以上,旧版本工具不支持Android 11的APK格式要求。
2. 正确执行Zipalign对齐(核心步骤)
如果你使用apksigner(推荐,build-tools 24.0.3+):
- 先执行
zipalign时必须携带-p参数(保留未压缩文件的对齐属性),命令:zipalign -p 4 未签名APK路径 对齐后APK路径 - 再用
apksigner签名,它会完整保留resources.arsc的未压缩状态和4字节对齐属性。
3. 验证APK状态
使用aapt2工具(位于对应版本build-tools目录下)检查resources.arsc的状态:
aapt2 dump badging 你的APK路径 | findstr resources.arsc # Windows # 或 aapt2 dump badging 你的APK路径 | grep -A 2 resources.arsc # Linux/macOS
确认输出包含compressed: false和alignment: 4。
4. 弃用jarsigner,改用apksigner
旧版jarsigner会重新压缩APK内文件,破坏resources.arsc的未压缩状态,建议全程使用apksigner完成签名操作。
内容的提问来源于stack exchange,提问作者Juhász Tamás
相关产品推荐
相关产品推荐

