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

发布时间:2024年01月12日

背景📒

Android Studio 中经常点击“RUN”按钮,即可对编写的代码进行编译、打包,安装到目标设备,并运行APP,那么这一条龙服务具体是谁在帮我们做?当点击run之后会运行一系列task,这些task有什么关系又是怎么来的呢,今天就基于这些问题来聊聊一些本质问题。
在这里插入图片描述

真相 🐘

实际上 Android Studio 提供了Gradle这个工具,它可以为我们提供一条龙服务。这些按钮的底层实现都是通过Gradle task来完成的,当点击Run的时候我们看到控制台会有一系列的task在运行。如果针对Gradle不了解的可以参考这篇文章 Gradle系列之大锅菜汇总
在这里插入图片描述
实际上我们在点击 Run 的时候运行的是gradle assembleDebug 任务,会生成一个debug包,当我们连接手机的时候会自动帮我们安装到手机上,并打开main activity。

Projects 和 task

如果想知道task之间是怎么运行的,这就涉及到Gradle的调度顺序。在此之前需要了解的是Gradle中两个重要的概念:Projects和Tasks。

在Gradle中每个待编译的工程称为 Project,每个Project在构建时都包含一系列的Task,而每个task代表了构建过程中的一个原子性操作,比如编译、打包、发布等这些操作。一个Project到底包含了多少个Task,其实是由编译脚本指定的插件决定的。

Settings文件

主要用于指定项目中所有引入的模块。一个子工程只有在settings.gradle文件里配置了,Gradle才会识别,才会在构建的时候被包含进去。
在这里插入图片描述

build.gradle脚本

我们会发现根项目下有一个build.gradle,子项目中也有一个build.gradle。最外面的build.gradle,表示的是全局的配置文件,可以对所有的子模块进行配置;

buildscript {
    repositories {
        jcenter()
        maven {
            url 'https://maven.google.com/'
            name 'Google'
        }
    }
    dependencies {
        classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.8"
        classpath 'com.android.tools.build:gradle:3.2.1'
     }
}

而内部的build.gradle文件是针对当前子模块进行配置。
常见的子模块中的build.gradle配置如下:

android闭包:可以配置项目构建的各种属性
compileSdk 33 用于指定项目的编译版本,假如指定33表示使用Android12系统的SDK编译
defaultConfig闭包:主要对项目的更多细节进行配置

buildTypes闭包:用于指定生成安装文件的相关配置,通常包含有个闭包,release和debug,debug可省略,通过Android Studio直接运行项目生成的都是测试版安装文件

Gradle的执行流程

可以概括为三个阶段:

  • 初始化(Initialization)阶段:在初始化阶段Gradle将会确定哪些项目将参与构建,并为每个项目创建一个Project对象实例。在Android项目中会先执行setting.gradle文件,
  • 配置(Configureation)阶段:执行task闭包中的内容,并确定依赖关系;主要执行所有build.gradle脚本里面的内容,从根项目下的build.gradle开始执行,产出的结果是生成Task的有向无环图,即Task集合执行的流程图。
  • 执行(Execution)阶段:即按照配置阶段生成的task有向无环图,一个一个的执行具体Task中的Action。

总结就是先执行settings内容,再执行build.gradle中除了doLast闭包之外的内容,最后再执行doLast闭包。如果想验证的话,可以在三个文件中分别加入打印信息
在这里插入图片描述
??如果你想了解更多Gradle 的内容,可以参考这个专栏,一定有你想要的信息。 Gradle系列之大锅菜汇总??

文章来源:https://blog.csdn.net/weixin_42182599/article/details/135537364
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。