首页
社区
课程
招聘
[转帖]Android工程的编译过程
发表于: 2013-3-6 12:42 8049

[转帖]Android工程的编译过程

2013-3-6 12:42
8049
Android工程的编译过程
转载自:http://www.cnblogs.com/devinzhang/archive/2011/12/20/2294686.html



现在很多人想对Android工程的编译和打包进行自动化,比如建立每日构建系统、自动生成发布文件等等。这些都需要我们对Android工程的编译和打包有一个深入的理解,至少要知道它的每一步都做了什么,需要什么环境和工具,输入和输出是什么。那么我们就来挖掘一下Android的编译过程中的细节。

首先,我们假定你的系统(什么系统都行,不限于Linux还是Windows系统,当然,我在这里默认使用Linux系统来举例子,但在 Windows中几乎没有什么差别)已经安装了JDK和Android SDK。再假定你的Android SDK的路径是ANDROID_SDK_HOME,你想要编译的Android OS版本是ANDROID_OS_VERSION(比如android-1.6、android-8、android-10等)。

我们重点关心的是(1)这个过程的输入是什么?(2)这个过程的输出是什么?(3)这个过程使用了什么工具?至于使用什么参数,可以自己去看对应命令的帮助文件,或者在网上搜索,这不是本文的重点。

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

名称        功能介绍        在操作系统中的路径
aapt        Android资源打包工具        ${ANDROID_SDK_HOME}/platform-tools/appt
aidl        Android接口描述语言转化为.java文件的工具        ${ANDROID_SDK_HOME}/platform-tools/aidl
javac        Java Compiler        ${JDK_HOME}/javac或/usr/bin/javac
dex        转化.class文件为Davik VM能识别的.dex文件        ${ANDROID_SDK_HOME}/platform-tools/dx
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文件
【输入】 .class文件(包括Aidl生成.class文件,R生成的.class文件,源文件生成的.class文件),库文件(.jar文件)
【输出】.dex文件
【工具】javac工具

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

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

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

知道了这些细节之后,我们就可以实现很多我们想实现东西了,比如:自动化,我们可以使用某种脚本,像Windows下的批处理,linux下的Bash,Java下的Ant,Python、Perl这样的脚本语言,甚至直接用Java、.net这们的强类型语言也是可以的。如果你真正弄懂了上面的步骤,了解了编译打包过程的本质,你完全可以以你想要的任何方式实现它的自动化,这才是真正的“举一反三,以不变应万变”。再比如,对Android SDK的精简,大家知道,现在Android SDK动辙几百兆,我们完全可以应用上面的知识,只保留必要的工具,把SDK精简到10M以下。当然,还可以做很多事情,前提是你真正弄懂了它。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 8217
活跃值: (2726)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
挺好的,能提供相关软件的链接地址吗?
2013-3-6 13:22
0
雪    币: 86
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这些都是平台工具
aapt Android资源打包工具 ${ANDROID_SDK_HOME}/platform-tools/appt
aidl Android接口描述语言转化为.java文件的工具 ${ANDROID_SDK_HOME}/platform-tools/aidl
javac Java Compiler ${JDK_HOME}/javac或/usr/bin/javac
dex 转化.class文件为Davik VM能识别的.dex文件 ${ANDROID_SDK_HOME}/platform-tools/dx
apkbuilder 生成apk包 ${ANDROID_SDK_HOME}/tools/opkbuilder
jarsigner .jar文件的签名工具 ${JDK_HOME}/jarsigner或/usr/bin/jarsigner
zipalign 字节码对齐工具 ${ANDROID_SDK_HOME}/tools/zipalign

{ANDROID_SDK_HOME} 这个就是你得Android SDK的安装目录,对应的就可以找到这些工具了
2013-3-6 13:24
0
雪    币: 86
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
补充一下,对于AndroidManifest.xml文件的解析可以使用apktool.jar(http://code.google.com/p/android-apktool/)、APKParser.jar(http://code.google.com/p/xml-apk-parser/)以及工具AXMLPrinter2.jar ,但是,请问大家改完AndroidManifest.xml后 把它再编译进apk里面是用的哪些方法
2013-3-6 13:28
0
雪    币: 202
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
外行,只想学点去广告的知识,谢谢~~~
2013-3-6 15:33
0
雪    币: 652
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这帖子 分析的andriod 编译解释过程比较细致
2013-3-6 16:20
0
雪    币: 82
活跃值: (316)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
可以加精了,支持lz
2013-3-6 19:09
0
雪    币: 1413
活跃值: (401)
能力值: (RANK:270 )
在线值:
发帖
回帖
粉丝
8
apktool即可。看一下它的帮助文档或者wiki吧,关于apktool b的用法。
2013-3-7 06:04
0
雪    币: 1413
活跃值: (401)
能力值: (RANK:270 )
在线值:
发帖
回帖
粉丝
9
考虑到是单纯的转帖,不打算加精或mark。

其实关于这个主题,后来Google写了一份文档:
http://developer.android.com/tools/building/index.html#detailed-build

在此之前,oschina上也有人发过完整的手工编译流程(可能与现在的SDK有些不兼容了):

http://my.oschina.net/xuwa/blog/12368

这两份文档都值得读一下。
2013-3-7 06:09
0
雪    币: 86
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
呵呵 是的用apktool .jar http://code.google.com/p/android-apktool/这个工具完成的,apktool的源码中集成了smali的功能,而且还能自动的跳过没有改动的文件,以及自动加上一些在反编译时需要的文件,所以基本上反编译成功率很高的的.我也是看见后觉得这个编译过程很清晰,而且可以在windows中做成简单批处理,一直很羡慕Linux下做开发的上传后就自动编译的方式,别人的帖子,重在分享,哈哈
2013-3-7 09:54
0
雪    币: 82
活跃值: (316)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
谢谢版主推荐的文章
2013-3-19 09:06
0
游客
登录 | 注册 方可回帖
返回
//