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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/374222.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

『运维备忘录』之 Yum 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大…

【多模态大模型】视觉大模型SAM:如何使模型能够处理任意图像的分割任务?

SAM:如何使模型能够处理任意图像的分割任务? 核心思想起始问题: 如何使模型能够处理任意图像的分割任务?5why分析5so分析 总结子问题1: 如何编码输入图像以适应分割任务?子问题2: 如何处理各种形式的分割提示?子问题3:…

Redis服务

目录 介绍 特点 缓存 安装 安装单机版redis实例 1、创建工作目录 2、下载对应的redis包 3、解压到创建好的工作目录 4、安装编译工具 5、进入解压后的目录执行make编译 6、配置环境变量 7、备份配置文件 8、修改配置文件 9、创建存放数据的目录 配置redis为syste…

Django连接Mysql

修改setting.py配置文件 连接前,需要创建数据库 安装mysql客户端 因为连接需要一个客户端,而python没有客户端,所以就需要一个客户端来接收你填写的参数 pip install mysqlclient

【知识图谱+大模型的紧耦合新范式】Think-on-Graph:解决大模型在医疗、法律、金融等垂直领域的幻觉

Think-on-Graph:解决大模型在医疗、法律、金融等垂直领域的幻觉 Think-on-Graph 原理ToG 算法步骤:想想再查,查查再想实验结果 论文:https://arxiv.org/abs/2307.07697 代码:https://github.com/IDEA-FinAI/ToG Think…

JAVA面试汇总总结更新中ing

本人面试积累面试题 多线程微服务JVMKAFKAMYSQLRedisSpringBoot/Spring 1.面向对象的三个特征 封装,继承,多态,有时候也会加上抽象。 2.多态的好处 允许不同类对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种…

GPIO结构

GPIO简介 GPIO(General Purpose Input Output)通用输入输出口 可配置为8种输入输出模式 引脚电平:0V~3.3V,部分引脚可容忍5V 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等 输入模式下可读取端口的高低电平或电压&#x…

Linux实验记录:使用DHCP动态管理主机地址

前言: 本文是一篇关于Linux系统初学者的实验记录。 参考书籍:《Linux就该这么学》 实验环境: VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注: 动态主机配置协议(DHCP&…

MongoDB从入门到实战之Docker快速安装MongoDB

前言 在上一篇文章中带领带同学们快速入门MongoDB这个文档型的NoSQL数据库,让大家快速的了解了MongoDB的基本概念。这一章开始我们就开始实战篇教程,为了快速把MongoDB使用起来我将会把MongoDB在Docker容器中安装起来作为开发环境使用。然后我这边MongoD…

关于RabbitMQ面试题汇总

什么是消息队列?消息队列有什么用? 消息队列是一种在应用程序之间传递消息的通信机制。它是一种典型的生产者-消费者模型,其中生产者负责生成消息并将其发送到队列中,而消费者则从队列中获取消息并进行处理。消息队列的主要目的是…

【无标题】卫星数据链开发平台设计方案:522-基于AD9988的四通道1G带宽卫星数据链开发平台基于AD9988的四通道1G带宽卫星数据链开发平台

卫星数据链开发平台设计方案:522-基于AD9988的四通道1G带宽卫星数据链开发平台 基于AD9988的四通道1G带宽卫星数据链开发平台 一、卫星数据链综 卫星通信是卫星互联网的重要应用之一,主要指通过或借助卫星进行数据通信,可广泛应用于移…

紫光展锐摘得多项行业桂冠,综合实力获认可

近期,紫光展锐凭借在技术和产品创新领域的实力和成果,接连斩获多项行业重要荣誉。 紫光展锐首颗5G NTN-IoT卫星通信SoC芯片V8821荣获第11届手机设计大赛天鹅奖“2023年度最佳终端解决方案奖”、2023年度ICT产业龙虎“2023年度最佳5G技术创新”、2023年度…

【机器学习】基于集成学习的 Amazon 用户评论质量预测

实验六: 基于集成学习的 Amazon 用户评论质量预测 1 案例简介 ​ 随着电商平台的兴起,以及疫情的持续影响,线上购物在我们的日常生活中扮演着越来越重要的角色。在进行线上商品挑选时,评论往往是我们十分关注的一个方面。然而目前电商网站的…

论文阅读——MP-Former

MP-Former: Mask-Piloted Transformer for Image Segmentation https://arxiv.org/abs/2303.07336 mask2former问题是:相邻层得到的掩码不连续,差别很大 denoising training非常有效地稳定训练时期之间的二分匹配。去噪训练的关键思想是将带噪声的GT坐标…

对象存储minio

参考Linux搭建免费开源对象存储 wget https://dl.minio.io/server/minio/release/linux-amd64/minio yum install -y wget yum install -y wget wget https://dl.minio.io/server/minio/release/linux-amd64/minio chmod x minio sudo mv minio /usr/local/bin/ minio --vers…

编译DuiLib库遇到的变量定义位置问题

C89 规定,所有局部变量都必须定义在函数开头,在定义好变量之前不能有其他的执行语句; C99 标准取消这这条限制,但是 VC/VS 对 C99 的支持不是很积极; C99 是 C89 的升级版; 如图是修改之后的代码&#xff1…

海光--性能领先实干者

这是ren_dong的第26篇原创 1、概述 国产X86 CPU领航者 海光信息是一家从事高端处理器、加速器等计算芯片产品和系统研发的公司 ,是国产X86 CPU领航者海光处理器兼容市场主流的 X86 指令集,具有成熟而丰富的应用生态环境公司股权结构合理 ,聚集…

python复制别人的虚拟环境

虚拟环境的结构 一个项目的虚拟环境是由以下组成的,如下图: 其中Lib文件夹里存放的就是我们安装的一些第三方库,Scripts文件夹很重要,它里面的activate文件是用于激活虚拟环境的,还有pyvenv.cfg文件是这个虚拟环境的…

第8节、双电机多段直线运动【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】,查看本系列全部文章 摘要:前面章节主要介绍了bresenham直线插值运动,本节内容介绍让两个电机完成连续的直线运动,目标是画一个正五角星 一、五角星图介绍 五角星总共10条直线,10个顶点。设定左下角为原点…

seata分布式事务

文章目录 1、分布式事务1.1 事务的ACID原则原子性一致性隔离性持久性 1.2 分布式事务的问题示例代码准备环境1. seata_demo数据库2. 启动nacos seata-demo父工程pom.xml order-servicepom.xmlapplication.ymlOrderApplicationOrderControllerOrderServiceImplAccountClientStor…