前一阵子,升级AS到3.6.1后,老项目Run或Debug都报错,具体报错没有记录,报错大致应该是如下所示

报错:
ApkProvisionException: No outputs for the main artifact of variant: debug

网上也有其他解决办法,我这里就不重复了
下面是我的解决办法和大致原理

解决办法

  1. 打开Run/Debug Configurations
  2. 修改Deploy为Nothing
  3. 修改Gradle-aware Make的Task为::installArmv7Debug(armv7是我这里在productFlavors里面的配置,你可以可以根据的项目配置)
    老项目在Android Studio 3.6.1不能运行解决办法和大致原理
  4. 打开Build Variants
  5. 修改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

相关文章:

  • 2021-06-09
  • 2021-04-09
  • 2021-11-20
  • 2022-12-23
  • 2022-01-02
  • 2021-06-14
  • 2021-11-04
  • 2021-09-14
猜你喜欢
  • 2021-12-17
  • 2022-12-23
  • 2021-04-29
  • 2022-12-23
  • 2021-12-29
  • 2021-07-07
  • 2021-12-08
相关资源
相似解决方案