安卓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 签名的优点很明显:签名更安全(不能修改压缩包),签名验证时间更短(不需要解压验证),因而安装速度加快。
相关推荐
奔跑吧 android2 小时前
【android bluetooth 协议分析 07】【SDP详解 2】【SDP 初始化】
android·bluetooth·aosp15·bt·gd·sdp_init
梦否4 小时前
Android 代码热度统计(概述)
android
xchenhao8 小时前
基于 Flutter 的开源文本 TTS 朗读器(支持 Windows/macOS/Android)
android·windows·flutter·macos·openai·tts·朗读器
coder_pig8 小时前
跟🤡杰哥一起学Flutter (三十五、玩转Flutter滑动机制📱)
android·flutter·harmonyos
消失的旧时光-19439 小时前
OkHttp SSE 完整总结(最终版)
android·okhttp·okhttp sse
ansondroider10 小时前
OpenCV 4.10.0 移植 - Android
android·人工智能·opencv
hsx66613 小时前
Kotlin return@label到底怎么用
android
itgather14 小时前
安卓设备信息查看器 - 源码编译
android
whysqwhw14 小时前
OkHttp之buildSrc模块分析
android
hsx66614 小时前
从源码角度理解Android事件的传递流程
android