apk的反编译

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

工具基础:

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

  2. 安装JDK

  3. apktool签名工具APKSign

开始—》运行—》cmd

跳转到apktool目录,输入:

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

例如:apktoold 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位编码的数值。

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

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

  1.  
    1. 如果需要添加type位id的项,还需要在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的注册。

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

Apktoolb反编译后代码存放目录

例如:apktoolb b

编译之后的代码结构为:

--build

--dist

--res

--smali

--AndroidManifest.xml

--apktool.yml

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

apk

相关推荐