重打包apk以及问题汇总

重打包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

签名:

  1. 使用keytools生成一个私钥(keytool 位于 JDK 中的 bin/ 目录中)
    1
    2
    keytool -genkey -v -keystore my-release-key.jks
    -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias

输入密码和“Distinguished Name”字段等其他信息后,会在当前目录生成一个私钥文件my-release-key.jks

  1. 通过 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中安装/注册。

  • 解决方法

    1. 从手机里搞出来Framework文件
      通常位于/system/framework/目录,少数位于/data/system-framework/,甚至有些在/system/app 或 /system/priv-app目录下,通常以”resources”, “res” 或 “framework”命名。

      例如HTC的资源文件为com.htc.resources.apk, LG为lge-res.apk

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