Unity自动化出多渠道包apk,Mac环境下对apk反编译并重签名

Posted on By

需要的工具

  1. apktool 按照下载页的提示进行下载
  2. dex2jar 找到dex2jar-2.0的最新release下载zip
  3. jarsigner(需要安装JDK)

反编译及重签名主要流程

  1. 反编译apk文件
  2. 解出jar包(若不需要修改java代码,则不需要此步骤)
  3. 修改资源文件或代码
  4. 回编译出apk文件
  5. 重签名

    PS:在流程之前先声明几个文件和路径

  6. 新创建的文件夹为 User/liyiyuan/Desktop/ReSignTest
  7. 需要重签名的apk为 base-test.apk
  8. 重签名导出的apk为 resigned-test.apk

流程详解

  1. 创建一个新的文件夹,目录为User/liyiyuan/Desktop/ReSignTest
  2. 将需要重签名的apk和下载的dex2jar解压出的dex2jar-2.0文件夹放入 User/liyiyuan/Desktop/ReSignTest此时的目录结构为:
    ReSignTest
    │   base-test.apk
    │
    └───dex2jar-2.0
        │   
        ...
    
  3. 打开termnial.app(终端)进入ReSignTest文件夹,执行
    apktool d base-test.apk
    

    此命令会将base-test.apk反编译,得到base-test文件夹,此时目录结构为:

    ReSignTest
    │    base-test.apk
    │
    └─── dex2jar-2.0
    │       │   
    │       ...
    │
    └─── base-test  
         │     AndroidManifest.xml
         │     apktool.yml
         │     assets
         │     lib
         │     original
         │     res
         │     smali
    
  4. (如果不需要修改app内java代码可以省略此步骤)在termnial.app(终端)中执行命令:
    sh dex2jar-2.0/d2j-dex2jar.sh base-test.apk
    

    此命令是将*.dex文件转成*.jar文件,这个jar文件就是java代码的压缩包,需要查看代码的可以用使用此压缩包查看。 此时目录结构为:

    ReSignTest
    │   base-test.apk
    │   base-test-dex2jar.jar
    │
    └───dex2jar-2.0
        │   
        ...
    

PS:用apktool解包后不会在文件夹中存在*.dex文件。但是通过改apk后缀名为ziprar等,在将压缩包解压会存在classes.dex文件。

  1. 反编译结束后base-test文件夹中assets存放着base-test.apk的一些资源,一半渠道CHANNEL信息会存到Config.*文件里面(根据项目会有各自的差别)。此时就可以根据需求修改。
  2. 修改完成后,需要进行回编译,就是将base-test文件夹编译成apk文件,需要运行命令:
    apktool b base-test.apk
    

    此时目录结构为

    ReSignTest
    │    base-test.apk
    │
    └─── dex2jar-2.0
    │       │   
    │       ...
    │
    └─── base-test  
         │     AndroidManifest.xml
         │     apktool.yml
         │     assets
         │     build
         │     dist
         │     lib
         │     original
         │     res
         │     smali
    

执行此命令后,会在base-test文件夹下生成builddist文件夹,其中回编译的新的apk文件就是在dist文件夹中。

  1. 有了回编译的文件后就可以对新的apk进行重签名,在termnial.app(终端)输入命令:
    jarsigner -verbose -keystore [keystore路径] -signedjar [签名后的文件保存路径] [dist文件夹下的路径] [证书名]
    

    执行完后回需要输入keystore的密码,也可以在命令行中加上-storepass-keypass-sigalg-digestalg等参数来添加密码、加密方式等。 最终重签名得到的包为就是resigned-test.apk

自动化出多渠道包工具项目地址

请参考我的github项目:tools-channelpackages

参考文章

  1. MAC对APK包进行重新签名
  2. Mac环境下反编译apk