apk的反编译

 

本文涉及的环境是windows 环境,所有的测试都未在ubuntu 下进行过。

工具基础:

  1. 下载apktools apktool-install-window ,并将文件解压缩到同一个目录下。

  2. 安装JDK

  3. apktool 签名工具APKSign

 

开始—》运行—》cmd

跳转到apktool 目录,输入:

Apktool d 需要反编译apk 反编译后代码存放目录

 

例如:apktool d c:/a.apk b

c: 根目录下的a.apk 进行反编译,并将反编译后的代码存放到当前目录下的b 文件夹内。

当然,也可以存放到其它地方的文件夹,只需要指定正确的路径。

 

反编译后的文件如下:

--res

--smali

--AndroidManifest.xml

--apktool.yml

 

其中,res 是所有的资源,包括图片,字符串,动画等等;smail 文件夹中是反编译之后的代码资源。这些代码不是java 格式的,所以阅读修改起来有些麻烦;AndroidManifest.xml 就不多做介绍了,大家懂的。

 

  1. 添加资源:

除了将相应的资源放到对应的目录下外,还要做如下修改:

  1.  
    1. public.xml 中,将添加的资源按照已有的格式,添加到对应的地方,并分配一个未使用的16 位编码的数值。

格式:<public type=" 填写对应type(drawable/layout/anim/color/string/id)" name=" 定义的资源名称" id=" 分配的数值" />

例如:<public type="id" name="Img" id="0x7f080054" />

  1.  
    1. 如果需要添加typeid 的项,还需要在ids.xml 中添加如下格式的项:

<item type="id" name=" 定义的资源名字">false</item>

例如:<item type="id" name="Img">false</item>

这是因为,"@+id/" 格式定义的id 表示在修改完某个布局文件并保持后,自动在R.java 中生成相应的int 类型变量。但是反编译后的代码不可能再自动去生成,只能把id 设置成好像已经存在的样子,去调用一个已经存在的资源的id 。相应的在修改layout 时,也不能使用"@+id/" 而是"@id/" 格式去定义id

  1. 添加代码

将要添加的代码单独的作用一个应用(以b 代替)进行编译调试,测试ok 后,将b 应用的apk 进行反编译。如果a 应用是需要添加这些改动的应用,只需要反编译a 应用,然后将b 的代码加入到a 中对应位置就可以。注意其中package 及所属class 文件名字修改。

如果是添加了activity ,记得要在AndroidMenifest.xml 中添加activity 的注册。

 

修改后,要再将代码编译后来,输入如下命令:

Apktool b 反编译后代码存放目录

例如:apktool b b

编译之后的代码结构为:

--build

--dist

--res

--smali

--AndroidManifest.xml

--apktool.yml

 

编译后的apk 就在dist 文件夹中。将apk 用签名工具签名后就可以使用了。

 

猜你喜欢

转载自xiamidatou-gmail-com.iteye.com/blog/1676031