AGP 升级问题
Build was configured to prefer settings repositories over project repositories but repository ‘maven4’ was added by plugin ‘***’
添加仓库警告信息说:
依赖查找以你在 setting.gradle 文件配置的仓库为准(因为你配置了 PREFER_SETTINGS
),通过 project 配置的仓库不生效。
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
}
问题
gradle Plugin 内如何动态添加仓库,在 AGP4+ 中插件内部通过project.buildscript.repositories
动态添加仓库,根据本次打包所带的不同渠道SDK添加对应的仓库地址,可以在 AGP7 中似乎没有生效,再打包过程中出现了报错。
AGP4+
project.buildscript {
repositories {
//抖音
maven { url 'https://artifact.bytedance.com/repository/ttgamesdk/' }
//华为插件
maven { url 'https://developer.huawei.com/repo/' }
}
}
分析
仓库模式只有三种:
public enum RepositoriesMode {
//使用项目级别的
PREFER_PROJECT,
//使用 setting 配置的
PREFER_SETTINGS,
//如果使用项目级别的,直接抛出异常终止打包(默认配置)
FAIL_ON_PROJECT_REPOS;
}
前一篇文章中使用的是默认配置,打包直接报错,后来改成 PREFER_SETTINGS 虽然规避了直接终止打包,但仓库不生效,未达到效果(不是说 prefer 首选配置吗,正常理解不应该也会生效才对嘛)~
所以现在问题解决只能是这两个方向了吗
- 方式一:要么统一在 setting.gradle 中添加仓库
- 方式二:要么统一使用 project 添加仓库
解决
根据自身插件实际情况,我选择了方式一:统一使用 project 添加仓库
。
因为是在自定义插件内添加仓库,为了更加灵活动态添加,把仓库信息写成配置文件,通过读取外部配置可不修改插件动态添加,如下:
MavenConfig mMavenConfig
@Override
void apply(Project project) {
loadMavenConfig()
addMavenFromConfig(project)
}
//加载仓库配置
private void loadMavenConfig() {
String content = PluginFileUtils.realFile(this.mProject.getProjectDir(), CommonConstant.FILE_NAME_REPOSITORIES_CONFIG_FILE)
if (CommUtils.isEmptyOrNoExists(content)) {
mRuntimeException.onRuntimeException(ErrorMsg.MSG_MAVEN_REPOSITORIES_NOT_FOUND)
}
mMavenConfig = new Gson().fromJson(content, MavenConfig.class)
if (mMavenConfig == null || !mMavenConfig.configIsOk()) {
mRuntimeException.onRuntimeException(ErrorMsg.MSG_MAVEN_REPOSITORIES_ERROR)
}
}
//添加仓库
void addMavenFromConfig(Project project) {
if (project == null) {
return
}
project.parent.allprojects {
repositories {
//基础公共仓库
mavenCentral()
jcenter()
google()
//根据外部配置文件动态添加的仓库
for (MavenList config in mMavenConfig.getMavenList()) {
PluginLog.d('动态添加配置:' + config.toString())
if (config.enableHttp && config.credentials != null) {
maven {
allowInsecureProtocol true
url config.url
credentials {
username config.credentials.username
password config.credentials.password
}
}
} else if (config.enableHttp) {
maven {
allowInsecureProtocol true
url config.url
}
} else {
maven {
url config.url
}
}
}
}
}
}
MavenConfig
就是一个 json 转 bean 的类,json 格式如下:
- enableHttp:是否允许 http,对应的是
allowInsecureProtocol true
- url:仓库地址
- credentials:仓库账密,可以为 null
- username:账户名
- password:密码
{
"mavenList": [
{
"enableHttp": false,
"url": "https://repo1.maven.org/maven2/",
"credentials": null
},
{
"enableHttp": false,
"url": "https://artifact.bytedance.com/repository/byteX/",
"credentials": null
},
{
"enableHttp": false,
"url": "https://developer.huawei.com/repo/",
"credentials": null
},
{
"enableHttp": false,
"url": "https://artifact.bytedance.com/repository/ttgamesdk/",
"credentials": null
},
{
"enableHttp": true,
"url": "http://bbbbb/",
"credentials": null
},
{
"enableHttp": false,
"url": "https://jitpack.io",
"credentials": null
},
{
"enableHttp": false,
"url": "https://dl-maven-android.mintegral.com/repository/mbridge_android_sdk_china",
"credentials": null
},
{
"enableHttp": true,
"url": "http://aaaaaa",
"credentials": {
"username": "primer",
"password": "123456"
}
}
]
}
注:setting.gradle pluginManagement 中的 repositories 也应该保留一些基本仓库 ~