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 trueurl config.urlcredentials {username config.credentials.usernamepassword config.credentials.password}}} else if (config.enableHttp) {maven {allowInsecureProtocol trueurl 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 也应该保留一些基本仓库 ~