老项目在Android Studio 3.6.1不能运行解决办法和大致原理

前一阵子,升级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里面的配置,你可以可以根据的项目配置)
    步骤1、2、3
  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

猜你喜欢

转载自blog.csdn.net/oHaiKuoTianKong1682/article/details/107783637