gradle

Android Studio点击Run背后发生了什么?

2020-03-04  本文已影响0人  Hengtao24

系列文章

  1. Android Gradle原理解释
  2. Android Studio点击Run背后发生了什么?

前言

我们知道在Android Studio中点击运行按钮(下图中的Run)即可对编写的代码进行编译,打包(生成APK),安装APK到目标设备,运行APP。这一系列流程背后都是Gradle这个构建工具帮我们在做工作,有关Gradle的基本知识已经在Android Gradle原理解释一文中做了很多介绍。

Android Studio Run

本文我们换个角度,从点击按钮这一行为出发来研究背后的具体流程和原理。除了Run按钮外,还有build,Apply Changes, Debug等按钮也做了类似工作,但应用场景不同。

build按钮:对应的是Make Project,编译Project下所有Module,一般是自上次编译后Project下有更新的文件,不生成apk。

Apply Changes按钮:将代码和资源更改推送到正在运行的应用,而无需重启应用(在某些情况下,无需重启当前 Activity),是Instant Run功能的替代者。

Debug按钮:在调试模式下部署应用,在调试模式下运行应用可在代码中设置断点、在运行时检查变量和对表达式求值,以及运行调试工具

Run按钮背后流程

Run背后的Gradle tasks

Gradle生命周期分为三个阶段,分别是Initialization(初始化阶段),Configuration(配置阶段),和Execution(执行阶段),而执行阶段会执行一系列task,进行主要的构建工作

那么自然Run按钮背后的构建工作也是由一系列task组成的,那么我们有办法去查看这些task都有哪些么?Android Studio提供了强大的日志记录功能,主要需要进行以下3步工作:

  1. 点击View > Tool Windows > Build,将在Android Studio界面下方显示Build过程
  2. 点击右下角的EventLog按钮
  3. 点击Run按钮

完成上述点击后,等待APK安装并运行完成,可以在Android Studio界面下方见到如下日志:

run_log.png

Tasks名称

> Task :app:preBuild UP-TO-DATE
> Task :app:preDebugBuild UP-TO-DATE
> Task :app:generateDebugBuildConfig UP-TO-DATE
> Task :app:javaPreCompileDebug UP-TO-DATE
> Task :app:mainApkListPersistenceDebug UP-TO-DATE
> Task :app:compileDebugRenderscript NO-SOURCE
> Task :app:compileDebugAidl NO-SOURCE
> Task :app:generateDebugResValues UP-TO-DATE
> Task :app:generateDebugResources UP-TO-DATE
> Task :app:mergeDebugResources UP-TO-DATE
> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE
> Task :app:extractDeepLinksDebug UP-TO-DATE
> Task :app:processDebugManifest
> Task :app:processDebugResources
> Task :app:compileDebugJavaWithJavac UP-TO-DATE
> Task :app:compileDebugSources UP-TO-DATE
> Task :app:mergeDebugShaders UP-TO-DATE
> Task :app:compileDebugShaders UP-TO-DATE
> Task :app:generateDebugAssets UP-TO-DATE
> Task :app:mergeDebugAssets UP-TO-DATE
> Task :app:processDebugJavaRes NO-SOURCE
> Task :app:mergeDebugJavaResource UP-TO-DATE
> Task :app:dexBuilderDebug UP-TO-DATE
> Task :app:checkDebugDuplicateClasses UP-TO-DATE
> Task :app:mergeExtDexDebug UP-TO-DATE
> Task :app:mergeDexDebug UP-TO-DATE
> Task :app:mergeDebugJniLibFolders UP-TO-DATE
> Task :app:mergeDebugNativeLibs UP-TO-DATE
> Task :app:stripDebugDebugSymbols UP-TO-DATE
> Task :app:validateSigningDebug UP-TO-DATE
> Task :app:packageDebug
> Task :app:assembleDebug

上述tasks大概可分为五个阶段:

  1. 准备依赖包(Preparation of dependecies):在这个阶段gradle检测module依赖的所有library是否就绪。如果这个module依赖于另一个module,则另一个module也要被编译;
  2. 合并资源并处理清单(Merging resources and processing Manifest):打包资源和 Manifest 文件;
  3. 编译(Compiling):处理编译器的注解,源码被编译成字节码;
  4. 后期处理(Postprocessing): 所有带 “transform”前缀的task都是这个阶段进行处理的;
  5. 包装和出版(Packaging and publishing):library生成.aar文件,application生成.apk文件。

部分Tasks详细说明

  1. mergeDebugResources解压所有的 aar 包,并且把所有的资源文件合并相关目录里;
  2. processDebugManifest把所有 aar 包里的AndroidManifest.xml中的节点,合并到项目的AndroidManifest.xml中
  3. processDebugResources

a. 调用 aapt 生成项目和所有 aar 依赖的R.java
b. 生成资源索引文件
c. 输出符号表

  1. compileDebugJavaWithJavac用来把 java 文件编译成 class 文件

此过程可参考详解Android Gradle生成字节码流程

下图是详细版的Android 构建过程,可对应上述系列tasks中的某些工作:


apk_build.png
上一篇 下一篇

猜你喜欢

热点阅读