利用Gradle创建BOM,解决Android minCompileSdk 的编译问题

一、需求背景

因为在有维护比较多的Android项目,在最近升级的过程总是出现最低版本编译(minCompileSdk)错误,所以决定创建相关BOM帮助自己的对一些老项目进行升级,这些项目有些准备升级到33,有些升级31,新的项目直接34

Dependency 'androidx.xxxxx.xxx' requires libraries and applications that
        depend on it to compile against version 34 or later of the Android APIs.

启发来自 Compose Bom,刚好学习一下相关知识,然后做一点记录。

二、BOM介绍

BOM (Bill Of Material) 是 Maven 仓库中的一个概念,它本质也是一个可被引用的包,但不包含代码,只是声明了一系列其它包。

  1. 方便使用者在声明依赖的客户端时不需要指定版本号外,
  2. 最主要的原因是可以解决依赖冲突

Bom 通常是项目中单独的一个模块,即只有单个pom.xml文件的module,并配合 dependencyManagement 等标签实现项目的全局依赖统一管理

三、利用Gradle创建BOM

首先我们都知道BOM本质上是一个普通的POM文件,区别是对于使用方而言,生效的只有 <dependencyManagement>这一个部分。

示例:

 <dependencyManagement>
        <dependencies>
            <!-- 统一依赖管理 -->
            <dependency>
                <groupId>xxxx.xxx</groupId>
                <artifactId>xxx</artifactId>
                <version>1.0</version>
            </dependency>
             <dependency>
                <groupId>xxxx.xxx</groupId>
                <artifactId>xxx</artifactId>
                <version>1.0</version>
            </dependency>
		</dependencies>
 </dependencyManagement>

所以我们只需要在publishing 添加给pom.xml添加<dependencyManagement>这一个部分内容就好了。

3.1 操作步骤

首先直接上代码,然后再解释相关步骤,我是基于Android Stuido进行开发的,使用的是kts.

plugins {
    alias(libs.plugins.androidLibrary)
    alias(libs.plugins.jetbrainsKotlinAndroid)
    id("maven-publish") //1. 发布插件
}

android {
    namespace = "com.androidx.bom"
    compileSdk = 34
     /**代码省略,可以忽视**/
     
}

class MavenDep(val group: String, val name: String, val version: String)
// 这里是管理相关依赖版本
val depList = mutableListOf<MavenDep>().apply {
    add(MavenDep("androidx.core", "core-ktx", libs.versions.androidx.core.get()))
    add(MavenDep("androidx.appcompat", "appcompat", libs.versions.androidx.appcompat.get()))
     /**其他依赖内容**/
}

//核心实现部分
publishing {
    publications {
		    //2. 创建发布的内容
        create<MavenPublication>("release") {
            groupId = "com.github.SheTieJun"
            artifactId = "androidx-bom"
            version = "34.1.0.0"
            pom.withXml {
		            //3.修改pom,将相关依赖添加dependencyManagement中
                asNode().appendNode("dependencyManagement")
                    .appendNode("dependencies")
                    .also { dependencies ->
                        depList.forEach { mavenDep ->
                            val depNode = dependencies.appendNode("dependency")
                            depNode.appendNode("groupId", mavenDep.group)
                            depNode.appendNode("artifactId", mavenDep.name)
                            depNode.appendNode("version", mavenDep.version)
                        }
                    }
            }
        }
    }
}

相关创建步骤:

  1. 创建一个模块,我这里*androidLibrary*,(也可以是java lib,然后在build.gradle.kts`中添加发布插件
 id("maven-publish") //1. 发布插件
  1. 创建发布内容
publishing {
    publications {
        create<MavenPublication>("release") {
            groupId = "com.github.SheTieJun"
            artifactId = "androidx-bom"
            version = "34.1.0.0"
        }
    }
}
  1. 修改POM,添加dependencyManagement,以及相关依赖
pom.withXml {
                asNode().appendNode("dependencyManagement")
                    .appendNode("dependencies")
                    .also { dependencies ->
                        //depList 是上面写到的相关依赖版本
                        depList.forEach { mavenDep ->
                            val depNode = dependencies.appendNode("dependency")
                            depNode.appendNode("groupId", mavenDep.group)
                            depNode.appendNode("artifactId", mavenDep.name)
                            depNode.appendNode("version", mavenDep.version)
                    }
            }
}
 
  1. 生成BOM,可以直接点击 publishToMavenLocal发布到本地,也可以利用jitpack进行发布,甚至mavenCentral

    发布到本地和jitpack,都很简单,我就不细讲了。可以看androidx-bom

  2. 使用BOM,

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenLocal() //如果发布在本地
        mavenCentral()
        maven("https://jitpack.io") //如果发布到jitpack
    }
}
    api(platform("com.github.SheTieJun:androidx-bom:34.1.0.0"))
    api 'androidx.activity:activity-ktx'
    api 'androidx.fragment:fragment-ktx'
    api("androidx.appcompat:appcompat")
    //省略

四、Androidx-bom:BOM to JetPack Androidx library version mapping for minCompileSdk.

Github :androidx-bom

项目是基于Androidx Jetpack ,主要方便自己维护的项目的Androidx相关的依赖进行升级,我希望尽量的新Lib, 同时又不用每次都去查找对应的版本。
目前初步完成,但是不是含有所有的Jetpack项目,只是一些常用的项目。
如果你有需要其他,还是需要你自己去查找对应的版本,也可以对当前项目进行升级 ,你也可以fork下来,进行自定义添加相关自己的依赖,如果涉及一些私有库,你可以发布的话到本地、gitlab的package等等`

  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TieJun~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值