重打包APK
反编译和编译使用Apktool (https://ibotpeaches.github.io/Apktool/)
反编译:1
apktool d xxx.apk -o smali_path
-r,–no-res 不解析资源文件
-s,–no-src 不解析代码文件
编译:1
apktool b smali_path -o new.apk
签名:
- 使用keytools生成一个私钥(keytool 位于 JDK 中的 bin/ 目录中)
1
2keytool -genkey -v -keystore my-release-key.jks
-keyalg RSA -keysize 2048 -validity 10000 -alias my-alias
输入密码和“Distinguished Name”字段等其他信息后,会在当前目录生成一个私钥文件my-release-key.jks
- 通过 apksigner 使用私钥对APK进行签名
1
apksigner sign --ks my-release-key.jks --out my-app-release.apk my-app-unsigned-aligned.apk
apksigner位于SDK目录的build-tools目录下。必须说明的是,v2签名方式时在Android7.0后才推出的,所以只有版本>25的SDK\build-tools\中才能找到apksigner.jar
其他坑
1. Can’t find framework resources for package of id
- 问题描述
1
2
3
4
5
6
7
8$ apktool d HtcContacts.apk
I: Loading resource table...
I: Decoding resources...
I: Loading resource table from file: /home/brutall/apktool/framework/1.apk
W: Could not decode attr value, using undecoded value instead: ns=android, name=drawable, value=0x02020542
...
W: Could not decode attr value, using undecoded value instead: ns=android, name=icon, value=0x02020520
Can't find framework resources for package of id: 2. You must install proper framework files, see project website for more info.
一般来说,android应用需要使用一些设备上的资源文件,Apktool 需要 framework文件来编译apk。标准的frameworks框架文件已经嵌入在 apktool中, 所以大多数的apk不需要你再安装frameworks文件。
但是有一些厂商, 比如 HTC, 增加了他们自己的 framework文件. 为了使apktool 能够反编译上述 apps, 必须从设备中导出framework文件并且在apktool中安装/注册。
解决方法
从手机里搞出来Framework文件
通常位于/system/framework/目录,少数位于/data/system-framework/,甚至有些在/system/app 或 /system/priv-app目录下,通常以”resources”, “res” 或 “framework”命名。例如HTC的资源文件为com.htc.resources.apk, LG为lge-res.apk
- 使用Framework文件进行反编译
1
2
3
4
5
6
7
8
9$ apktool if com.htc.resources.apk
I: Framework installed to: /home/brutall/apktool/framework/2.apk
$ apktool d HtcContacts.apk
I: Loading resource table...
I: Decoding resources...
I: Loading resource table from file: /home/brutall/apktool/framework/1.apk
I: Loading resource table from file: /home/brutall/apktool/framework/2.apk
I: Copying assets and libs...
2. 9patch文件
9patch文件用于对图片进行拉伸,其左侧和上方有一条黑线,用于判断可拉伸的区域。
9patch有两种表现形式:
- 直接的图片
存在于编译APK之前的工程中,表现为图片四周有一个黑线 - 二进制文件
android在编译成apk文件后,会把9patch信息写入到一个二进制块中叫作npTc,并且把原图片的边框去掉,直接解压缩apk看到的.9.png文件是没有黑线的
所以从apk里是反编译不出来真正的9patch图片文件的,同理重打包的时候编译器去图片里找边框黑线是找不到的。