apk的反编译
本文涉及的环境是windows环境,所有的测试都未在ubuntu下进行过。
工具基础:
下载apktools 和 apktool-install-window,并将文件解压缩到同一个目录下。
安装JDK
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就不多做介绍了,大家懂的。
添加资源:
除了将相应的资源放到对应的目录下外,还要做如下修改:
-
在public.xml中,将添加的资源按照已有的格式,添加到对应的地方,并分配一个未使用的16位编码的数值。
格式:<publictype="填写对应type(drawable/layout/anim/color/string/id等)"name=" 定义的资源名称"id="分配的数值"/>
例如:<publictype="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的注册。
修改后,要再将代码编译后来,输入如下命令:
Apktoolb反编译后代码存放目录
例如:apktoolb b
编译之后的代码结构为:
--build
--dist
--res
--smali
--AndroidManifest.xml
--apktool.yml
编译后的apk就在dist文件夹中。将apk用签名工具签名后就可以使用了。
相关推荐
adb shell cd system/app rm *.apk21. 获取管理员权限: adb root22. 启动Activity: adb shell am start -n 包名/包名+类名。