安卓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 签名的优点很明显:签名更安全(不能修改压缩包),签名验证时间更短(不需要解压验证),因而安装速度加快。
相关推荐
三少爷的鞋4 小时前
Android 架构七条铁律:架构师真正设计的不是代码,而是秩序
android
xiangxiongfly9155 小时前
Android GsonFactory总结
android·gson·gsonfactory
WythePlus7 小时前
Android 14 SELinux策略深度解析
android·安全策略·selinux策略
俩个逗号。。10 小时前
Kotlin flow 详解
android·开发语言·kotlin
橙光成长12 小时前
android-ad-cleaner:android免 Root 批量关闭系统开屏与营销推送
android·1024程序员节
深圳雨林凯AI12 小时前
图案裂变的底色衰减:alpha通道、亮度对比与白墨分色的量化拆解
android
mmsx13 小时前
Android 模块化收口:能力组合框架、手写 LifecycleOwner 与热修复共存
android
恋猫de小郭15 小时前
Flutter 可以更直接地调用原生 API 了,Dart Direct Native Interop
android·前端·flutter
2501_9160088915 小时前
iPhone 设备信息查看,用 KeyMob 看型号、序列号、电池健康和 UDID
android·ios·小程序·https·uni-app·iphone·webview
好的佩奇1 天前
蓝牙之通信架构
android·flutter·蓝牙