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

前言

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

d23b4fbe86e2

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步工作:

点击View > Tool Windows > Build,将在Android Studio界面下方显示Build过程;

点击右下角的EventLog按钮

点击Run按钮

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

d23b4fbe86e2

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大概可分为五个阶段:

准备依赖包(Preparation of dependecies):在这个阶段gradle检测module依赖的所有library是否就绪。如果这个module依赖于另一个module,则另一个module也要被编译;

合并资源并处理清单(Merging resources and processing Manifest):打包资源和 Manifest 文件;

编译(Compiling):处理编译器的注解,源码被编译成字节码;

后期处理(Postprocessing): 所有带 “transform”前缀的task都是这个阶段进行处理的;

包装和出版(Packaging and publishing):library生成.aar文件,application生成.apk文件。

部分Tasks详细说明

mergeDebugResources:解压所有的 aar 包,并且把所有的资源文件合并相关目录里;

processDebugManifest:把所有 aar 包里的AndroidManifest.xml中的节点,合并到项目的AndroidManifest.xml中

processDebugResources:

a. 调用 aapt 生成项目和所有 aar 依赖的R.java

b. 生成资源索引文件

c. 输出符号表

compileDebugJavaWithJavac:用来把 java 文件编译成 class 文件

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

d23b4fbe86e2

apk_build.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值