Android 工程构建的持续集成,需要搭建一套编译和打包自动化流程,比如建立每日构建系统、自动生成发布文件等等。这些都需要我们对Android工程的编译和打包有一个比较深入的理解,例如知道它的每一步都做了什么,需要什么环境和工具,输入和输出是什么,等等。

首先,假定你的系统(Windows、Linux、Mac OS都行,本文默认使用Linux系统来举例子,但在 Windows中几乎没有什么差别)已经安装了JDK和Android SDK, 如果没有安装,可以参考我先前的博客: Ubuntu搭建Eclipse+JDK+SDK的Android 和 Windows搭建Eclipse+JDK+SDK的Android

再假定你的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文件

【工具】dex工具





第五步:打包生成未签名的.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以下。当然,还可以做很多事情,前提是你真正弄懂了它。

最新文章

  1. vs 2015 连接不上tfs 错误代码:TF31002
  2. android 入门-android Studio 快捷输入
  3. OpenNMS界面图 .
  4. 【转】iOS开发UI篇—程序启动原理和UIApplication
  5. RecycleView 滑动到底部,加载更多
  6. 【贪心+中位数】【UVa 11300】 分金币
  7. 09_android入门_採用android-async-http开源项目的GET方式或POST方式实现登陆案例
  8. 懵懵懂懂初识J2EE
  9. java中获取所有的请求参数
  10. VB6工程在Win10系统打开提示MSCOMCTL.OCX无法加载
  11. 认识uWSGI、uwsgi、wsgi
  12. Java MultipartFile 使用记录
  13. odoo 数据库到期提醒
  14. Javascript高级编程学习笔记(43)—— 动态脚本
  15. Java 一些知识点总结
  16. Android中五大字符串总结(String、StringBuffer、StringBuilder、Spanna
  17. 离线安装.NET 3.5
  18. 20155228 2016-2017-2 《Java程序设计》第1周学习总结
  19. JS 中的布尔运算符 && 和 ||
  20. C# Console 运行之后最小化到状态栏

热门文章

  1. [AngularJS] Using an AngularJS directive to hide the keyboard on submit
  2. C語言 rand函数 进阶探讨与实现
  3. bc -l 对于 %取模计算出错
  4. 【45.65%】【codeforces 560B】Gerald is into Art
  5. ubuntu里面设置颜色
  6. [JS Compose] 6. Semigroup examples
  7. javaScript基本事件
  8. [Flow] More tips about Flow
  9. [Angular] Scrolling the Message List To the Bottom Automatically Using OnChanges
  10. ECharts.js 超简单入门(本质canvas)