Mac下反编译和重新编译打包APK

反编译APK需要的工具如下:
- dex2jar 这个工具用于将dex文件转换成jar文件
下载地址:http://sourceforge.net/projects/dex2jar/files/
- apktool 这个工具用于最大幅度地还原APK文件中的9-patch图片、布局、字符串等等一系列的资源。
下载地址:http://ibotpeaches.github.io/Apktool/install/
- jd-gui 这个工具用于将jar文件转换成java代码
下载地址:http://jd.benow.ca/
在上面的网址中可以下载最新版本的工具。有些工具旧了,反编译过程可能会失败,所以建议保持最新的工具版本。
其中apktool和jd-gui有点和谐,所以我将它们打包放到了CSDN服务器。点击下载

反编译代码

  1. 解压dex2jar压缩包。
  2. 终端中cd命令到dex2jar目录。
  3. 将apk文件改后缀apk为zip,将其中的classes.dex文件拷贝到dex2jar目录
  4. 在终端运行./d2j-dex2jar.sh classes.dex (出现Permission Denied异常,是哪个文件报的就改哪个文件的权限。比如我这里出现的是d2j_invoke.sh,修改权限即可:chmod 777 d2j_invoke.sh)
  5. 这样反编译代码成功,目录中会生成一个classes-dex2jar.jar文件,将这个文件用jd-gui打开,即可看到源码(可能给是混淆过的)。
    dex2jar

反编译资源

  1. 下载好apktool和apktool.jar(最新2.1.0)之后,将其拷贝到/usr/local/bin目录(如果有root权限)。
  2. chmod 保证apktool命令不会出现Permission Denied
  3. apktool d /xx/xx.apk
    apktool
    完成!这样阅读Manifest.xml以及drawable或anim中的xml文件不会是混淆的乱码了。

上图反编译过程中,会在/Users/dengpan/Library/apktool/framework/ 目录中生成一个1.apk的缓存文件,有时反编译失败,删除它再试试。

注意:当前terminal终端在哪个目录,那么apktool反编译的资源目录就在哪个目录下。

其中d是decode的意思,表示我们要对xx.apk这个文件进行解码。那除了这个基本用法之外,我们还可以再加上一些附加参数来控制decode的更多行为
- -f 如果目标文件夹已存在,则强制删除现有文件夹(默认如果目标文件夹已存在,则解码失败)。
- -o 指定解码目标文件夹的名称(默认使用APK文件的名字来命名目标文件夹)。
- -s 不反编译dex文件,也就是说classes.dex文件会被保留(默认会将dex文件解码成smali文件)。
- -r 不反编译资源文件,也就是说resources.arsc文件会被保留(默认会将resources.arsc解码成具体的资源文件)。

重新打包

  1. 在刚反编译的目录,运行命令apktool b app-release -o app-release1.apk 即将反编译出来的文件重新在当前目录打包成了新的apk,这apk是未签名的,不能安装到机器上(提示解析包错误)。
    apktool-b
  2. 使用命令jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 签名文件名 -storepass 签名密码 待签名的APK文件名 签名的别名 给apk签名。
    jarsigner
  3. 对齐APK。Android官方建议打包签名后apk进行一个对齐操作。将export PATH=${PATH}:/xxx/build-tools/23.0.2 添加到自己用户目录的.bash_profile中。然后执行zipalign 4 app-release1.apk app-release-align.apk

参考文章:http://blog.csdn.net/guolin_blog/article/details/49738023

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值