安卓apk加固后,Android11+无法安装

问题

正常打包APK,可以在Android11+上正常安装。

  1. 为了安全使用加固软件对apk进行加固。
  2. 加固后对APK重新签名。
    进过上述两步后,Android11+无法安装apk,通过adb命令安装测试,安装失败,报出如下错误:
bash 复制代码
Failure [-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]

翻译一下就是:如果以 Android 11(API 级别 30)或更高版本为目标平台的应用包含压缩的 resources.arsc 文件或者如果此文件未按 4 字节边界对齐,应用将无法安装。

解决办法

方案一:

降级targetSdkVersion版本到30以下(我在项目中降低了这个版本后项目报错了,所以放弃这个方法)

方案二:

根据错误提示,检查一下加固后的APK 文件中的 resources.arsc 文件是否已经按照 Android 11(API 级别 30)及更高版本的要求进行了对齐和未压缩。

zipalign 工具在 Android SDK 的 Build-Tools 文件夹下)

bash 复制代码
//确认对齐结果命令,,4代表对齐为4个字节
zipalign -c -v 4 output_unsigned.apk

如果输出Verification FAILED 说明APK不符合要求

如果输出Verification succesful 说明APK符合要求

到这里,我以为我加固后的APK是不符合要求的,但是没想到控制台输出的结果是Verification succesful。那么问题就出现在签名后的APK上了。

这里我签名的软件使用的是梆梆加固提供的,果然签名过后,在执行上面的命令,控制台输出的就是Verification FAILED ,太坑人了。

下面来说一下具体操作

  1. 对APK进行4字节对齐
bash 复制代码
//对齐操作命令,4代表对齐为4个字节
zipalign -p -f -v 4 input.apk output_unsigned.apk
  1. 对齐后进行验证
bash 复制代码
//确认对齐结果命令,,4代表对齐为4个字节
zipalign -c -v 4 output_unsigned.apk
  1. 使用apksigner进行签名
bash 复制代码
apksigner sign --ks your-key.jks --out output_signed.apk output_unsigned.apk

这里不能使用 jarsigner, 因为jarsigner只能进行V1签名,而V2签名是SDK>=24时才支持的,所以使用jarsigner签名后,安装时会报错:INSTALL_PARSE_FAILED_NO_CERTIFICATES

补充V1、V2签名

  • v1 方案(JAR签名)
    v1 方案是较老的签名方式,基于 JAR 签名。它主要保护 APK 的某些部分,例如 ZIP 元数据。然而,v1 签名存在两个主要问题:
  1. 签名校验过程较慢,因为它需要针对 APK 中的所有文件进行校验,这会延长老设备的安装时间。
  2. 仅针对 ZIP 条目进行校验,不包括 META-INF 文件。这可能导致安全风险,因为可以移动条目顺序或重新压缩 APK,从而修改 META-INF 文件下的内容。
  • v2 方案(APK签名方案 v2)
  1. v2 方案是 Android 7.0 (Nougat) 中引入的。它是一种全文件签名方案,能够发现对 APK 受保护部分进行的所有更改,有助于加快验证速度并增强完整性保证。
  2. 使用 APK 签名方案 v2 进行签名时,会在 APK 文件中插入一个 APK 签名分块,该分块位于"ZIP 中央目录"部分之前并紧邻该部分。在 APK 签名分块内,v2 签名和签名者身份信息会存储在 APK 签名方案 v2 分块中。
  3. v2 签名的优点很明显:签名更安全(不能修改压缩包),签名验证时间更短(不需要解压验证),因而安装速度加快。
相关推荐
练习本3 小时前
Android系统架构模式分析
android·java·架构·系统架构
每次的天空8 小时前
Kotlin 内联函数深度解析:从源码到实践优化
android·开发语言·kotlin
练习本8 小时前
Android MVC架构的现代化改造:构建清晰单向数据流
android·架构·mvc
早上好啊! 树哥8 小时前
android studio开发:设置屏幕朝向为竖屏,强制应用的包体始终以竖屏(纵向)展示
android·ide·android studio
YY_pdd9 小时前
使用go开发安卓程序
android·golang
Android 小码峰啊11 小时前
Android Compose 框架物理动画之捕捉动画深入剖析(29)
android·spring
bubiyoushang88811 小时前
深入探索Laravel框架中的Blade模板引擎
android·android studio·laravel
cyy29811 小时前
android 记录应用内存
android·linux·运维
CYRUS STUDIO11 小时前
adb 实用命令汇总
android·adb·命令模式·工具
这儿有一堆花12 小时前
安卓应用卡顿、性能低下的背后原因
android·安卓