android编译,反编译

最近需要反编译一些程序来看看实现原理。


反编译相对的是android编译,通常我们的android程序中会有

manifest:应用描述信息文件

src:代码文件夹

assets 和 res :资源文件

eclipse根据res 生成的R文件索引文件


步骤中提到的工具如下表:

名称功能介绍在操作系统中的路径
aaptAndroid资源打包工具${ANDROID_SDK_HOME}/platform-tools/appt
aidlAndroid接口描述语言转化为.java文件的工具${ANDROID_SDK_HOME}/platform-tools/aidl
javacJava Compiler${JDK_HOME}/javac或/usr/bin/javac
dex转化.class文件为Davik VM能识别的.dex文件${ANDROID_SDK_HOME}/platform-tools/dex
apkbuilder生成apk包${ANDROID_SDK_HOME}/tools/opkbuilder
jarsigner.jar文件的签名工具${JDK_HOME}/jarsigner或/usr/bin/jarsigner
zipalign字节码对齐工具${ANDROID_SDK_HOME}/tools/zipalign

第一步:打包资源文件,生成R.java文件
【输入】Resource文件(就是工程中res中的文件)、Assets文件(相当于另外一种资源,这种资源Android系统并不像对res中的文件那样优化它)、AndroidManifest.xml文件(包名就是从这里读取的,因为生成R.java文件需要包名)、Android基础类库(Android.jar文件)
【输出】打包好的资源(一般在Android工程的bin目录可以看到一个叫resources.ap_的文件就是它了)、R.java文件(在gen目录中,大家应该很熟悉了)
【工具】aapt工具,它的路径在${ANDROID_SDK_HOME}/platform-tools/aapt(如果你使用的是Windows系统,按惯例路径应该这样写:%ANDROID_SDK_HOME%\platform-tools\aapt.exe,下同)。

第二步:处理AIDL文件,生成对应的.java文件(当然,有很多工程没有用到AIDL,那这个过程就可以省了)
【输入】源码文件、aidl文件、framework.aidl文件
【输出】对应的.java文件
【工具】aidl工具

第三步:编译Java文件,生成对应的.class文件
【输入】源码文件(包括R.java和AIDL生成的.java文件)、库文件(.jar文件)
【输出】.class文件
【工具】javac工具

第四步:把.class文件转化成Davik VM支持的.dex文件
【输入】源码文件(包括R.java和AIDL生成的.java文件)、库文件(.jar文件)
【输出】.class文件
【工具】javac工具

第五步:打包生成未签名的.apk文件
【输入】打包后的资源文件、打包后类文件(.dex文件)、libs文件(包括.so文件,当然很多工程都没有这样的文件,如果你不使用C/C++开发的话)
【输出】未签名的.apk文件
【工具】apkbuilder工具

第六步:对未签名.apk文件进行签名
【输入】未签名的.apk文件
【输出】签名的.apk文件
【工具】jarsigner

第七步:对签名后的.apk文件进行对齐处理(不进行对齐处理是不能发布到Google Market的)
【输入】签名后的.apk文件
【输出】对齐后的.apk文件
【工具】zipalign工具

加上个图:



如果真的想要了解实现这个编译的过程,不妨写ant脚本试试,整个编译过程都通过ant来调用相关命令来实现,便于了解这个过程。


普通apk 文件(系统级的apk还有不同,研究中)

apk文件本质是一个压缩文件

将apk文件重命名为压缩文件:rar,然后用解压工具解压,就可以得到.dex文件   这个对应的class文件。


这样一个文件夹里面的内容manifest  res中的xml 打开后都是乱码。下面我们开始一点点解开这个应用。

需要工具:


1. 代码  对应的  dex 

普通的apk文件只是有dex文件,这个文件是由java编译器的class文件来生成的,需要把它先转回去。网上搜索了下找到了个挺好的工具。dex2jar,

http://code.google.com/p/dex2jar/网址是这个。下载下来把dex文件拖拽到dex2jar.bat这个批处理命令上就可以生成对应的jar包了。

通过jd-gui这个工具就可以看到里面的代码了。

2. manifest xml、

manifest文件中有很多程序的信息,这个app有多少个service 多少个receiver 多少个权限...都可以从这个文件中得到。

AXMLPrinter2.jar可以做到

3. res中的布局文件

xm文件的反编译一样

有时候需要反编译系统的东西来查看一些内容,android不同的rom实现都是不一样的,想了解这个差异就得反编译系统的framwork代码或者是系统的一些app的代码。发现里面都是odex结尾的文件,不同的手机还不一样,具体细节待研究。只解决了把代码弄出来

https://code.google.com/p/smali/

网上有解决办法android


参考文档:

http://www.oschina.net/question/54100_33877

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值