前一阵子,升级AS到3.6.1后,老项目Run或Debug都报错,具体报错没有记录,报错大致应该是如下所示
报错:
ApkProvisionException: No outputs for the main artifact of variant: debug
网上也有其他解决办法,我这里就不重复了
下面是我的解决办法和大致原理
解决办法
- 打开Run/Debug Configurations
- 修改Deploy为Nothing
- 修改Gradle-aware Make的Task为::installArmv7Debug(armv7是我这里在productFlavors里面的配置,你可以可以根据的项目配置)
- 打开Build Variants
- 修改app的Active Build Variant为armv7Debug(armv7是我这里在productFlavors里面的配置,你可以可以根据的项目配置)
大致原理
Android Studio 本质上其实还是 Intellij IDEA ,如果你想知道具体原理,可以去查阅AS的代码:https://github.com/JetBrains/android
首先我们要知道点击Run后AS执行了什么操作?
大致分为如下三个部分依次执行
1. 检查项目和读取基本配置
2. Gradle Build
3. Apk Install & LaunchActivity
知道这些原理,我们可以做很多事,比如加快Build速度、使用命令行构建等
检查项目和读取基本配置
那么上面三个步骤的肯定是从一个配置中去取配置,按照配置执行
而这个配置对应【Run/Debug Configuration】这个界面中的配置
一个Configuration的执行包括俩个过程:RunState 的创建 和 执行。
RunState的创建的过程包括对项目的检查,InstantRun相关配置,包括选择目的机器等
Gradle Build
Gradle Build会执行Before launch的配置
Android Studio默认Before launch配置为Gradle-aware Make
这一块的代码位于MakeBeforeRunTaskProvider.java
本质上去执行了Gradle Tasks,在Debug环境下默认是assembleDebug, 如果用户更改了Build Variants也会相应变化。
这里顺便说下Build Variants吧
Build Variants
BuildVariant = ProductFlavor + BuildType
如果你配置了productFlavors,Build Variants就能决定Gradle Build哪个Flavor
- Android Studio 1.5好像是默认使用productFlavors从上到下的第一个
- Android Studio 2.1好像是按照productFlavors中字母排序的第一个
- 从某个版本开始就可以通过Build Variants配置了
Apk Install & LaunchActivity
在Build完成之后,会回到RunState的执行阶段,这一阶段应该叫做Deploy
会执行如下一系列操作:
- InstantRun相关逻辑
- 版本判断
- 设备判断
- 输出日志
- 调用pm命令安装APK
- 唤起首屏等等
相应代码在 AndroidRunState.java。