当前位置: 首页 > news >正文

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

问题

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

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

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

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

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

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

下面来说一下具体操作

  1. 对APK进行4字节对齐
//对齐操作命令,4代表对齐为4个字节
zipalign -p -f -v 4 input.apk output_unsigned.apk
  1. 对齐后进行验证
//确认对齐结果命令,,4代表对齐为4个字节
zipalign -c -v 4 output_unsigned.apk
  1. 使用apksigner进行签名
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 签名的优点很明显:签名更安全(不能修改压缩包),签名验证时间更短(不需要解压验证),因而安装速度加快。

相关文章:

  • 在NET6项目中报错,未能在命名空间System.Data.SqlClient中找到类型名SqlCommand,解决办法
  • 一次由IDEA配置引发的Redis连接问题
  • 区块链赋能:用Python开发去中心化投票系统
  • 清晰易懂的Node.js安装教程
  • 五种方案实现双链路可靠数据传输
  • IntelliJ IDEA 调试技巧指南
  • LLM系列笔记之微调数据集格式
  • 网络编程---创建客户端和服务端以及协议包
  • 开源免费一句话生成儿童故事视频核心思想解析
  • Java基础语法练习42(基本绘图-基本的事件处理机制-小坦克的绘制-键盘控制坦克移动)
  • leetcode-47.全排列II
  • 深度学习之防止过拟合
  • 【华三】路由器交换机忘记登入密码或super密码的重启操作
  • 打乱一维数组中的元素,并按照4个一组的方式添加到二维数组中
  • Python基础入门掌握(十五)
  • 删除 Git 历史提交记录中的大文件
  • 大数据学习(71)-三范式构成
  • pycharm-python國際象棋遊戲代碼
  • 【程序人生】成功人生架构图(分层模型)
  • 前端面试:ajax 和 xhr 是什么关系?
  • 笔墨如何“构城”?上海美院城市山水晋京展出
  • 专业竞演、剧场LIVE直播,32位越剧新星逐梦上海
  • 央行副行长:研究建立民营中小企业增信制度,破解民营中小企业信用不足等融资制约
  • 百岁太极拳大师、陈氏太极拳第十一代嫡宗传人陈全忠逝世
  • 新剧|《淮水竹亭》明开播:前作扑街,本作能否改命
  • 屋顶上的阳光与火光:战争如何改变了加沙的能源格局