重打包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图片文件的,同理重打包的时候编译器去图片里找边框黑线是找不到的。