Gradle报错:No matching variant of project

前言

在新建一个项目时buildTypes默认有releasedebug两种,我们可以选择其中一种进行编译。

但是如果我们在build.gradle中再新增一种类型,例如qa时,此时会报错如下:

预备知识

首先我们要知道buildTypes是干嘛的?

它能够为你提供多种编译选择,我们可以在buildTypes中定义变量、配置混淆文件、配置签名文件等。最后生成BuildConfig.java文件。 例如:

java 复制代码
buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
            buildConfigField "String", "VALUE", "\"XXXXXX\""
        }
}

其中buildConfigField 可以在最后生成的BuildConfig.java文件中生成一个静态变量。这是用处非常大的,就比如debug环境和release环境的请求地址可能不同,就可以通过这个进行定义,避免打包的时候忘记修改地址等问题。

在项目中每个moudle都有对应的build.gradle文件,所以每个moudle都可以生成一个BuildConfig.java

产生原因

当我们有多模块时,app模块选择了qa的type进行编译,此时依赖了moudle1,当它编译时,由于他没有声明qa这个buildTypes,编译器不知道如何生成对应的buildConfig文件。此时就会报错。

解决办法

方法一:

在moudel1的build.gradle文件下也加上qa的buildTypes,这样编译器就能找到如何生成文件了。但是当app依赖的模块过多的时候,就要一个模块一个模块的增加类型,这样比较麻烦。

方法二:

在app的build.gradle通过matchingFallbacks关键词,对该类型进行一个补充说明,意思是如果没有找到这个type,那么可以用配置的参数继续编译。举个例子就明白了

java 复制代码
 //app下的build.gradle
 buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        qa {
            matchingFallbacks = ['release']
            buildConfigField "String", "VALUE", "\"app buildTypes 类型为qa\""
        }
    }
    
//moudle1下的build.gradle
buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            buildConfigField "String", "VALUE", "\"虽然app用的是qa,但是我moudle找不到,所以用release\""
        }
    }

这里的qa通过matchingFallbacks 定义了一个release类型,所以当我们moudle1在编译时,如果找不到声明的qa type,就会使用release

最后app下的BuildConfig.java如下:

moudle1下的BuildConfig.java如下

相关推荐
敢敢のwings4 小时前
世界模型与FlashWorld:从“在梦中学习“到秒级3D场景生成
android·学习·3d
Dovis(誓平步青云)4 小时前
牛奶不能减成负数:冰箱库存的筛选、去重与不可变更新
android·java·开发语言
Awna5 小时前
MySQL 存储空间与索引运维实战:从空间排查到在线扩容
android·运维·mysql
智购科技无人售货机工厂5 小时前
2026自动售货机触摸屏驱动开发:从I2C协议到多点触控校准的工程实践~YH
android·驱动开发·python·单片机·云原生·django
又见情义5 小时前
RK3568 Android 13驱动适配-WiFi&BT模块(RTL8822CS)
android·arm开发·驱动开发
美狐美颜SDK开放平台5 小时前
直播APP源码如何实现美颜功能?视频美颜SDK开发方案详解
android·大数据·人工智能·计算机视觉·直播美颜sdk
pengyu6 小时前
【Kotlin 协程修仙录 · 化神境 · 后阶】 | 异常天劫:Flow 异常处理的终极奥义与重试之道
android·kotlin
又见情义6 小时前
RK3568 Android 13 LED指示灯适配实战
android·驱动开发
pengyu6 小时前
【Kotlin 协程修仙录 · 化神境 · 中阶】 | 多播奥义:SharedFlow 高级配置与 Channel 的抉择之道
android·kotlin
码云数智-园园6 小时前
PHP 性能优化实战:从 3s 到 300ms,我是怎么优化一个接口的?
android·adb