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基础编译流程的主要内容,如果未能解决你的问题,请参考以下文章

Android make 基础

库在可执行文件内调用函数,而不是在库内

行云仓库管理系统的概述

Android APK编译流程

Android的编译打包流程详解

熟悉Android打包编译的流程