Android项目构建过程:平常开发中使用ide可以很方便构建打包编译成一个Apk包安装到手机,那么整个流程到底是啥样的呢?
我们可以根据Google官方提供的流程图来具体了解构建的过程, 构建工具放在Android sdk目录下面的build-tools文件夹下:
下面是具体描述:
1.AAPT(Android Asset Packaging Tool)工具会打包应用中的资源文件,如AndroidManifest.xml、layout布局中的xml等,并将xml文件编译为二进制形式,当然assets文件夹中的文件不会被编译,图片及raw文件夹中的资源也会保持原来的形态,需要注意的是raw文件夹中的资源也会生成资源id。AAPT编译完成之后会生成R.Java文件。
详细命令参考: aapt 命令可应用于查看apk包名、主activity、版本等很多信息
1. aapt l[ist] [-v] [-a] file.{zip,jar,apk} 列出压缩文件目录
2. aapt d[ump] [--values] WHAT file.{apk} [asset [asset ...]]
3.查看apk包的packageName、versionCode、applicationLabel、launcherActivity、permission等各种详细信息
aapt dump badging <file_path.apk>
...
2.AIDL工具会将所有的aidl接口转化为java接口。
1.AIDL是什么?
///AIDL是一个缩写,全称是Android Interface Definition Language,也就是Android接口定义语言。
2.AIDL是如何工作的?
///一类是用来定义方法接口,以供系统使用来完成跨进程通信的
///一类是用来定义parcelable对象,以供其他AIDL文件使用AIDL中非默认支持的数据类型
使用:
第一块是 初始化 。在 onCreate() 方法里面我进行了一些数据的初始化操作。第二块是 重写 BookManager.Stub 中的方法 。在这里面提供AIDL里面定义的方法接口的具体实现逻辑。第三块是 重写 onBind() 方法 。在里面返回写好的 BookManager.Stub 。
3.为什么设计AIDL?
///AIDL目的是为了实现 进程间通信 。
客户端:调用AIDL-->客户端与服务端交互-->IBinder 的一个代理类Proxy-->transact()方法-->将客户端的数据和请求发送到服务端去。
服务端:onTransact()方法
1,获取客户端传过来的数据,根据方法 ID 执行相应操作。
2,将传过来的数据取出来,调用本地写好的对应方法。
3,将需要回传的数据写入 reply 流,传回客户端。
3.所有的java代码,包括R.java与aidl文件都会被Java编译器编译成.class文件。
4.Dex工具会将上述产生的.class文件及第三库及其他.class文件编译成.dex文件(dex文件是Dalvik虚拟机可以执行的格式),dex文件最终会被打包进APK文件。
5.ApkBuilder工具会将编译过的资源及未编译过的资源(如图片等)以及.dex文件打包成APK文件。
6.生成APK文件后,需要对其签名才可安装到设备,平时测试时会使用debug keystore,当正式发布应用时必须使用release版的keystore对应用进行签名。
7.如果对APK正式签名,还需要使用zipalign工具对APK进行对齐操作,这样做的好处是当应用运行时会提高速度,但是相应的会增加内存的开销。
zipalign使用了4字节的边界对齐方式来映射内存,通过空间换时间的方式提高执行效率。
//zipalign优化的最根本目的是帮助操作系统更高效率的根据请求索引资源,将resource-handling code统一将Data structure alignment(数据结构对齐标准:DSA)限定为4-byte boundaries。如果第一次接触有关Data structurealignment的内容,强烈建议搜索更多与其相关的内容来充分理解这样做的最终目的,这也是理解zipalign工作原理的关键。 如果不采取对齐的标准,处理器无法准确和快速的在内存地址中定位相关资源。
zipalign位于android sdk的tools文件夹下面所以cmd进入命令行模式进入到tools目录:执行
//zipalign -v 4 source.apk destination.apk(目标apk)
其中这里-v代表详细输出, 4代表对齐为4个字节
//zipalign -c -v 4 destination.apk
来查看是否成功的优化了你的apk文件,这里-c参数代表检查对齐,可以看作是只读执行,最后提示大家这步可能会造成文件签名问题,注意和apk签名执行的顺序。
数据的字节对齐(data structure alignment)
1. 为什么需要字节对齐
1、处理器的差异
2、出于CPU读取内存数据效率的考虑。
2.结构对齐的基本原则:
1、结构体对齐的字节数是此结构体所有成员对齐的字节数中的最大值。
2、结构体每一个成员自身要保持字节对齐。
3、如果结构体中包含嵌套子结构体,那么子结构体自身必须对齐。
4、对于整个结构体,要根据规则1中“结构体对齐的字节数”满足字节对齐,对于没有对齐的情况,需要在最后增加pading。
C语言中,基本数据类型默认的对齐方式:
类型 | 长度(字节) | 对齐方式 |
---|---|---|
Cha | 1 | 1字节对齐 |
short | 2 | 2字节对齐 |
int | 4 | 4字节对齐 |
long | 4 | 4字节对齐 |
Float | 4 | 4字节对齐 |
double | 8 | 8字节对齐(windows);4字节对齐(Linux) |
指针 | 4 | 4字节对齐 |
从上面的结构体规则以及表格的基本数据类型对其字节数了解为什么android zipAlign采用4字节为边界对齐。
如何用提问方式促进深度思考?
最后看到一篇文章:用提问来促进思维——谈 WHAT HOW WHY 三部曲
WHAT HOW WHY 的步骤:
1. WHAT(相当于初级工程师–攻克初级使用层次~)
当我们开始了解某个事物的时候,总是先从 WHAT 类型的问题开始入手。而所谓的【WHAT】也就是“What is it?”
从 WHAT 类型的问题得到的答案,通常只反映出事情的表面现象。而表象跟本质,往往是不同的,甚至是相反的。如果你仅仅停留在 WHAT 层面,很可能会被表象所误导。
2.HOW(相当于中级工程师–攻克原理性层次~)
所谓的【HOW】就是“How to do?”。
和 WHAT 层次不同的是,HOW 层次光靠记忆力是远远不够滴。你还需要具备一定的分析推理能力,还需要懂得查阅相关资料,才能搞明白上述 HOW 类型的问题。
3.WHY(相当于高级工程师–攻克系统层次~)
当你能够比较透彻地厘清 HOW 层面的各类问题,就可以开始思考 WHY 类型的问题了。
WHY 类型的问题比 HOW 类型的问题更难回答——在回答 WHY 类型问题的过程中,你不但需要动用分析、推理、归纳、总结等各种思维能力,可能还要运用到跨领域、跨学科的知识。但是收获也是很大的。一旦把这些 WHY 类型的问题想明白,你就对整个事件有一个既宏观又深刻的认识。能达到这个境界,看问题通常会比较深刻。可惜这样的人比例太低了。