Android构建流程分析

1,189 阅读3分钟

        当我们新建一个Android Project,Android Studio 同样为我们创建了构建用Gradle脚本。 当我们执行assembleDebug这个task的时候,就会为我们构建出一个用于debug的apk文件。 在我们构建的过程中,都执行了那些操作,他们的顺序是什么样子呢?

我们一步一步的分析整个过程

目的:

  1. 让我们对Android的整个构建过程更清楚
  2. 让我们对Android项目的结构更清楚
  3. 让我们对apk的生成过程更清楚
  4. 让我们可以在构建的过程总做一些工作,例如清理一些不必要的文件等等

关于Android的构建流程,官网给了我们一张非常清楚的构建流程图:

357738-20170811144825570-687368085.png

当我们执行assembleDebug这个gradle task的时候,我们可以看到在构建过程中依次执行如下任务:

image.png

这些任务是从上到下一个一个按顺序执行的

而且这些任务大部分我们都能见名知意。我们可以根据这些任务的意思来对应到上面官网给出的流程图,看一下每个任务都发生在上图的哪个过程中。

下面我们来一个一个简单分析这些任务都做了什么工作

我们如何查看他的源码

所有Task的源码

好在这个插件的代码都是用java或kotlin写的,看起来不会有语言层级的障碍。

各个Task简介

在本文,我们只是简单将每个Task的意思简单的介绍了下,稍后会对每一个人物进行分析,希望在分析的过程中,能让我们对Android应用有更深的理解。

  • preBuild

构建预处理

  • preDebugBuild

构建debug包的预处理(因为在本文是以构建 debug apk 为例)

  • compileDebugAidl

工程中如果有Aidl文件,则在这个任务中进行编译

  • compileDebugRenderscript

工程中如果有render script,则在这个任中进行编译

  • generateDebugBuildConfig

生成BuildConfig.java文件

  • checkDebugAarMetadata

检查aar依赖库的元数据

  • generateDebugResValues

生成资源文件值

  • generateDebugResources

生成debug的资源文件

  • mergeDebugResources

合并资源文件

  • createDebugCompatibleScreenManifests

创建兼容屏幕的Manifests文件

  • extractDeepLinksDebug

抽离出deep link(DeepLink即为深度链接技术,主要应用场景是通过Web页面直接调用Android原生app,并且把需要的参数通过Uri的形式,直接传递给app,节省用户的注册成本)

  • processDebugMainManifest

处理主模块的Manifest文件

  • processDebugManifest

处理总的Manifest文件

  • processDebugManifestForPackage

处理Manifest文件,为打包做准备

  • processDebugResources

处理资源文件

  • javaPreCompileDebug

java的预编译

  • mergeDebugNativeDebugMetadata

合并调试本地代码的元数据

  • mergeDebugShaders

和并所有的shader文件

  • compileDebugShaders

编译所有的shader文件

  • generateDebugAssets

生成Assets文件

  • mergeDebugAssets

合并assets文件

  • compressDebugAssets

压缩assets文件

  • processDebugJavaRes

处理java资源

  • checkDebugDuplicateClasses

检查是否有重复的类。我们经常在项目构建的时候遇到这个问题而导致构建失败。

  • mergeExtDexDebug

合并额外的dex文件

  • mergeLibDexDebug

合并依赖的aar中的dex文件

  • mergeDebugJniLibFolders

合并依赖的jni文件

  • mergeDebugNativeLibs

合并项目依赖的native库

  • stripDebugDebugSymbols

去掉用户debug的标记

  • validateSigningDebug

验证签名

  • compileDebugKotlin

编译kotlin文件

  • compileDebugJavaWithJavac

用javac命令编译java文件

  • compileDebugSources

编译源码

  • mergeDebugJavaResource

合并java资源

  • dexBuilderDebug

构建dex文件

  • mergeProjectDexDebug

合并工程中的dex

  • packageDebug

打包

  • assembleDebug