本文涉及的环境是windows 环境,所有的测试都未在ubuntu 下进行过。
工具基础:
-
下载apktools 和 apktool-install-window ,并将文件解压缩到同一个目录下。
-
安装JDK
-
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 就不多做介绍了,大家懂的。
-
添加资源:
除了将相应的资源放到对应的目录下外,还要做如下修改:
-
-
在public.xml 中,将添加的资源按照已有的格式,添加到对应的地方,并分配一个未使用的16 位编码的数值。
-
格式:<public type=" 填写对应type(drawable/layout/anim/color/string/id 等)" name=" 定义的资源名称" id=" 分配的数值" />
例如:<public type="id" name="Img" id="0x7f080054" />
-
-
如果需要添加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 。
-
添加代码
将要添加的代码单独的作用一个应用(以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 用签名工具签名后就可以使用了。