Android基础编译流程
Posted 胖子爱你520
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android基础编译流程相关的知识,希望对你有一定的参考价值。
前言:该文章为学习笔记,记录android知识点,大家一起学习。
Android工程的构建打包是一个非常复杂的流程,涉及工程源代码、资源文件、AIDL文件,以及工程所依赖的库文件的编译转换。编译流程非常灵活,因此了解它的一些底层工作原理会很有帮助。
从谷歌官网上找到一张典型的构建流程图:
https://developer.android.com/studio/build/index.html?hl=zh-cn
介绍一下编译构建的四个步骤:
代码编译 --> 代码合成 --> 资源打包 --> 签名和对齐
(1)Java编译器对工程对代码资源进行编译,代码资源包括App的源代码、apt编译生成的R文件和AIDL文件生成的Java接口文件。通过Java编译器生成xxx.class文件。
(2)通过dex工具,将xxx.class文件和工程依赖的第三方库文件生成虚拟机可执行的dex文件,如果使用了MultiDex,会产生多个dex文件,包含编译后的所有class文件,也包括自身的.class文件和依赖库的.class文件。
(3)apkbuilder工具将.dex文件、apt编译后的资源文件、依赖中的第三方库内的资源文件打包生成签名对齐的apk文件。
(4)使用Jarsigner和Zipalign对文件进行签名和对齐操作,最终生成apk文件。
通过Gradle工具可以看到每个运行的Task的情况,还可以看到Gradle编译的流程,详细的显示出每个任务的Task耗时。
- Run init scripts:初始化描述
- Configure settings:检查settings.gradle的模块配置
- Configure build:检查build.gradle中引入的classpath
- Calculate task graph:计算出每个模块的依赖
- Run tasks:开始构建任务
如果想要查看Task的依赖树,这里推荐使用一个Gradle框架gradle-task-tree,需要配置根目录的build.gradle:
配置完成后,在Terminal中使用Gradle命令:
gradlew assembledebug taskTree --no-repeat
这个命令在Terminal中打印出Task的依赖树:
可以很清晰的看出来咱们的编译流程是怎么样的。
需要注意以下几点:
(1)一定要使用–no-repeat,不然会一直重复打印
(2)Gradle配置需要使用3.3版本以上
(3)工程中全部引用的module都需要配置apply plugin:"com.dorongold.task-tree“。
这里提供另外一个可视化工具gradle-visteg,在根目录的build.gradle中配置如下代码:
同步Gradle后,运行gradle build命令,等待片刻后,编译完成后会产生visteg.dot文件:
dot是一种描述文件,可以通过WPS等工具浏览,下面是示例:
可以逐行的看出编译流程。
以上是关于Android基础编译流程的主要内容,如果未能解决你的问题,请参考以下文章