Android工程的编译过程

现在很多人想对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)这个过程使用了什么工具?至于使用什么参数,可以自己去看对应命令的帮助文件,或者在网上搜索,这不是本文的重点。

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

名称功能介绍在操作系统中的路径
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/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以下。当然,还可以做很多事情,前提是你真正弄懂了它。

转载于:https://www.cnblogs.com/wd-one/p/4724774.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

activiti 工作流设置并行审批_activity、jbpm5、snakerflow常用工作流审批流对比

# 审批流调研背景由于目前产品研发组支持的产品项目越来越多, 同时几乎每个项目都会有导出审批,流程流转等需求,本着提高开发效率和组件化的目的,调研和开发通用的工作流组件,为后面的项目和新的需求提供快速支持。主要…

java 后台开发关键词解释

bean类:是一些实体类,包括viewbean,databean等等。action类:可作为接收显示层的数据,连接显示层和业务逻辑实现层的控制层。model类:MVC中model层就是到层。在java中无特殊含义就是模块。util类:工具类dao:…

docker mysql关掉后启动_Docker启动mysql的坑2

正确启动mysql:docker run -p 3306:3306 --name mysql02 -e MYSQL_ROOT_PASSWORD123456 -d mysql此时虽然启动成功。但是用客户端链接的时候报错连接Docker启动的mysql出现:ERROR 2059 (HY000): Authentication plugin caching_sha2_password cannot be …

Servlet基础知识(二)——web.xml文件的作用

http://www.cnblogs.com/yqskj/articles/2233061.html 转载于:https://www.cnblogs.com/wangerxiansheng/p/4113607.html

Spring web应用最大的败笔

第一篇 介绍下IOC DI Spring主要是业务层框架,现在已经发展成为一个完整JavaEE开发框架,它的主要特点是IoC DI和AOP等概念的融合,强项在面向切面AOP。推出之初因为Ioc/AOP等新设计理念值得框架设计者学习,现在已经成为Java世界主流…

mysql备份的后缀名_mysql备份数据库后缀名

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户…

如何专注

专注,据说是在这个时代能成功的基础。 看看自己这些分类、专注得了么? 转载于:https://www.cnblogs.com/x3d/p/4117443.html

mysql多主单向环形_mysql多主单向--gt;环形同步_MySQL

bitsCN.com原理:MySQL的Replication是一种多个MySQL的数据库做主从同步的方案,特点是异步,广泛用在各种对MySQL有更高性能,更高可靠性要求的场合。与之对应的另一个技术是同步的MySQL Cluster,但因为比较复杂&#xff…

***PHP 去除换行符

PHP在不同的系统中,换行是不同的 Linux:\n Windows:\r\n mac:\r 所以去除回车换行的方法: 1.使用php定义好的变量(比较好的方法,推荐) $str str_replace(PHP_EOL, , $str); 2.使用str_replace …

个人代码归档

http://pan.baidu.com/s/1D7Qii 密码:52n3转载于:https://www.cnblogs.com/vvonline/p/4121141.html

mysql current_timestamp 不自动更新_MySQL ON UPDATE CURRENT_TIMESTAMP不更新

我有一张桌子,看起来像这样:CREATE TABLE IF NOT EXISTS Hosts (id int(128) NOT NULL AUTO_INCREMENT,IP varchar(15) NOT NULL DEFAULT ,Port varchar(5) NOT NULL DEFAULT ,Password varchar(32) NOT NULL DEFAULT ,Username varchar(32) NOT NULL DE…

序列for循环语句

序列for循环语句 序列for循环语句允许重复遍历一组序列,而这组序列可以是任何可以重复遍历的序列,如由begin()和end()函数定义的STL序列。所有的标准容器都可用作这种序列,同时它也同样可以是std::string,初始化列表(l…

mysql批量用trim限定_如何使用trim()并更新mysql中的所有行[复制]

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户…

C#中用WMI实现对驱动的查询

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Management; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace WMI_驱动…

01C语言的概述

一、计算机常识在学习C语言之前,先要了解一些计算机常识1.计算机只能识别0和1大家都知道,计算机要通电才能工作,说白了,它跟电视、洗衣机一样,都是电器。电器都有个共同的能力:懂得判断通电还是断电&#x…

mysql5.7物理备份_Mysql5.7—运维常用备份方式

一、 Mysqldump备份结合binlog日志恢复使用mysqldump进行全库备份,并使用binlog日志备份,还原时,可以使用binlog日志恢复到备份前的任意位置或时间1. Binlog简介主要用于主从复制和恢复数据库,使用mysqlbinlog命令查看binlog二进制…

XAMPP on Mac 组态 Virual Host

首先,在hosts文件中添加virtual host域名。方向127.0.0.1 我一般使用的命名约定dev-domainname.comsudo nano /private/etc/hosts # VirtualHosts Mapping 127.0.0.1 dev-domainname.com接下来配置Apache。打开Apache的配置文件 /Applications/XAMPP/etc/httpd.conf…

二叉查找树之二

BST树的经典问题 首先构造如下一棵二元查找树(BST树): C代码实现: typedef struct _BSTreeNode {int value;struct _BSTreeNode *left;struct _BSTreeNode *right;} BSTreeNode;static BSTreeNode* insert(BSTreeNode* q, int x) …

mysql 停止服务内存_服务器莫名的内存高占用 导致 MySQL 停止运行问题

这问题是年后开始出现的,服务器内存占用越来越高,一度达到90%,最后 MySQL 都停止运行了。贴吧签到的数据库用户 ID 这一项也丢失了,导致无法签到,断签了好些天,被提醒才发现,要挨打的。幸好设置…

LeetCode - Convert Sorted Array to Binary Search Tree

给出一个已排序的数组,将其转化为二叉查找树(BST)。 思路:取数组中间元素为根结点的value,则数组左侧、右侧分别为BST的左子树、右子树。递归可求解。代码如下: 1 /**2 * Definition for binary tree3 * …