7 个回答
@singwhatiwanna 大神讲的很详细,我来从执行和代码角度分析一下:通过查看AS IDE插件的源码 解释具体过程。
先说结论:点击Run按钮其实依次执行了3部分内容
- 检查项目和读取基本配置
- Gradle Build
- Apk Install & LaunchActivity
-----------
Android Studio 本质上其实还是 Intellij IDEA ,AS对IDEA扩展的代码放在: JetBrains/android 。打包进AS之后,代码位于:ANDROID_STUDIO/plugins/android/lib/android.jar。解压并反编译就可以看到源码。
点击Run按钮对于IDEA来说,其实是执行一个事先配置好的 [ Run/Debug Configuration ],对于Android项目来说,往往是一个名为 [ Android App ] 的 Configuration。
按照IntellIJ SDK约定,一个Configuration的执行包括俩个过程:RunState 的创建 和 执行。
检查项目和读取基本配置
RunState的创建过程就对应开头所说的 过程1,完整代码请查看: AndroidRunConfigurationBase.java
如下图所示,基本上完成了对项目的检查,InstantRun相关配置,包括选择目的机器(没错,就是每次都会弹出来让你选择机器的模态对话框。。。)等过程。
Gradle Build
在RunState创建完成之后,IDEA允许你在执行之前,执行一些任务,比如一个Java项目在运行之前,你得编译。我们的Android项目也是类似,在安装和部署之前,你得编译打包。这个过程称之为:Before Launch。
Android Studio默认为我们提供 Gradle-aware Make 。这一块的代码在: MakeBeforeRunTaskProvider.java
如下图,本质上去执行了Gradle Tasks,在Debug环境下默认是assembleDebug, 如果用户更改了Build Variants也会相应变化。
(在Configuration页面你去修改Gradle-aware Make,改成任意Gradle任务,就可以去执行自己的Task啦...)
Apk Install & LaunchActivity
在构建完成之后,会回到RunState的执行阶段,这一阶段应该叫做部署 : InstantRun相关逻辑,版本判断,设备判断,输出日志,调用pm命令安装APK,唤起首屏等等。相应代码在 AndroidRunState.java 。
是不是比想象中要复杂?正如 @coxier 所说,通过命令行运行之所以有时候会快一点,是因为少了前后俩个步骤。另外,与这个问题相关的是点击同步Gradle Sync按钮实际上做了什么,其实只要去翻翻代码就瞬间明白了。
最后,官方的解释在这: