摘要
当你对一个安卓 apk 应用比较感兴趣,可能会想了解学习一下它的源码内容,甚至希望可以稍作修改后重新打包再安装体验。此时你可能会需要 apktool 这个工具。本文介绍了使用 apktool 反编译安卓 apk 文件、重新打包与签名的基本方法。本文内容仅供技术研究学习参考,请尊重原应用版权,切勿作破解再分发等事宜,避免惹上不必要的麻烦。
1 配置 apktool
工具环境
- 安装 java jdk 8+
- 下载并配置 apktool
2 使用 apktool 解压、重新打包与签名
- 解压 apk 文件。执行命令示例:
apktool d -f -s -o a_dev a.apk
- 重新打包为 apk,执行命令示例:
apktool b a_dev -o a_unsigned.apk
- 对重新打包的 apk 文件签名。示例:
jarsigner -verbose -keystore [证书存放路径] -signedjar [签名后文件存放路径] [未签名的文件路径] [证书别名]
jarsigner 参数说明:
- keystore 参数指定您的私钥的绝对路径,例如:
a.keystore
- signedjar 参数指定签名后apk文件存放的路径,例如
a_signed.apk
- [未签名的文件路径] 指定要签名apk文件的路径,例如
a_unsigned.apk
- [证书别名] 是指创建密钥时设置的证书名称。
2.1 密钥证书:生成一个 keystore 文件
执行如下命令,生成 abc.keysotre
文件。需要输入密码时,输入为 123456
。
keytool -genkey -alias abc.keystore -keyalg RSA -validity 20000 -keystore abc.keystore
2.2 签名示例:使用 jarsigner
重新签名 apk 文件
使用 jarsigner
基于 abc.keystore
对 a_unsigned.apk
签名,生成已签名的 a_signed.apk
文件:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -storepass 123456 -keypass 123456 -keystore abc.keystore -signedjar a_signed.apk a_unsigned.apk abc.keystore
查看文件 a_signed.apk
的签名信息:
keytool -printcert -jarfile a_signed.apk
2.3 jarsigner 签名问题之一:找不到证书链
在使用 Android Studio 生成的密钥执行签名命令时,遇到如下错误提示:
jarsigner: 找不到a.keystore的证书链。a.keystore必须引用包含私有密钥和相应的公共密钥证书链的有效密钥库密钥条目。
这是因为证书别名
不对。可以执行如下命令查看其别名:
# 假若安装了 Android Studio, 则会生成一个默认的密钥证书: # - 其默认位置在 <用户目录>/.android/debug.keystore # - 默认别名为: androiddebugkey # - 默认密码为: android # 查看 debug.keystore 信息 keytool -list -v -keystore debug.keystore # 查看 xxx.jks 密钥证书信息 keytool -list -v -keystore xxx.jks
输出信息参考如下:
输入密钥库口令:
密钥库类型: JKS
密钥库提供方: SUN您的密钥库包含 1 个条目
别名: androiddebugkey
创建日期: 2019-1-7
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: C=US, O=Android, CN=Android Debug
发布者: C=US, O=Android, CN=Android Debug
序列号: 1
可以看到这里的证书别名
为 androiddebugkey
。
2.4 签名示例:使用 apksigner
重新签名 apk 文件
jarsigner
是 Java JDK 提供的 jar 文件通用签名工具,只支持 V1 签名校验。
从 Android 7.0 开始, 谷歌增加新签名方案 V2 Scheme (APK Signature)。在 Android SDK
中提供了 apksigner
等用于 apk 签名。
Android SDK/build-tools/<SDK版本>/apksigner
Android SDK/build-tools/<SDK版本>/zipalign
使用 zipalign
执行包对齐优化:
# 4字节对齐优化 zipalign -v 4 a_unsgined.apk a_unsgined_4.apk # 检查 APK 是否对齐 zipalign -c -v 4 a_unsgined.apk
使用 apksigner
执行 V2 签名:
apksigner sign --ks abc.keystore --ks-key-alias abc.keystore --out a_signed_v2.apk a_unsigned_4.apk
查看签名信息:
apksigner verify -v --print-certs a_signed_v2.apk
4 小结
上面介绍的使用 apktool
解压、重打包与签名 apk 的方法和流程,可以总结为如下几个步骤及命令:
# 1. 解包: a.apk 至 a_dev 目录 apktool d -f -s -o a_dev a.apk # 2. 打包:a_dev 目录打包为 a_unsigned.apk apktool b a_dev -o a_unsigned.apk # 3. 生成证书 abc.keystore keytool -genkey -alias abc.keystore -keyalg RSA -validity 30000 -keystore abc.keystore # 4. 签名:a_unsigned.apk -> a_signed.apk jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -storepass 123456 -keypass 123456 -keystore abc.keystore -signedjar a_signed.apk a_unsigned.apk abc.keystore
5 相关参考
- https://ibotpeaches.github.io/Apktool/install/
- http://www.dayanzai.me/apktool.html
- https://www.jianshu.com/p/a5af94a963d0
- https://blog.csdn.net/weixin_44212888/article/details/111396635