从 AGP 4.1.2 升级到 7.5.1——动态添加仓库

在这里插入图片描述

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 也应该保留一些基本仓库 ~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值