侧边栏壁纸
博主头像
Z同学博主等级

工作磨平激情前,坚持技术的热忱。 欢迎光临Z同学的技术小站。 分享最新的互联网知识。

  • 累计撰写 274 篇文章
  • 累计创建 55 个标签
  • 累计收到 74 条评论

Android Maven 打包不同的Flavors 的aar文件

Z同学
2021-10-24 / 0 评论 / 5 点赞 / 695 阅读 / 5,077 字
温馨提示:
本文最后更新于 2022-02-12,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Android Maven 打包不同的Flavors 的aar文件

本篇文章内容已经有点过时,已经有更简单方便的方法实现打包不同的Flavors版本的AAR 依赖库了。可以参考我最新的文章:Android Studio 使用 maven-publish 进行多渠道aar 打包 (zinyan.com)

但是当前文章内容还是进行保存吧。因为见证了我的进步吧。

前言

最近在负责维护一个aar库。结果该aar要针对不同的渠道包,引入不同的代码。

这种情况下,我们在build.gradle 中添加一个productFlavors 创建不同的flavos 就可以了。

这种情况下,我们手动打包一个aar并进行本地依赖。没有关系。

但是,我们如果使用maven 进行自动打包并生成pom文件时。总是出问题。

下面我记录一下这个的修改流程。

希望能够给有需要的小伙伴一个参考。

PS:我对于gradle的脚本理解的并不太理解。

打包maven

我们如果没有Flavors。那么我们可以很简单进行maven的生成

示例1:

apply plugin: 'maven-publish'

def GroupId = 'cn.zinyan.demo'
def ArtifactId = 'key'
def Version = '1.0.7'


afterEvaluate {
    publishing {
        publications {
            release(MavenPublication) {
                // Applies the component for the release build variant.
               from components.release
                // You can then customize attributes of the publication as shown below.
                groupId = GroupId
                artifactId = ArtifactId
                version = Version
            }
        }
        repositories {
            maven {
		// 如果有地址的换,这个地方就应该是你的url 路径
                def mavenDirPath = file('D:\\Zinyan\\maven')
                url = "file://${mavenDirPath.absolutePath}"
//                credentials {  //如果有账户就可以用账号密码
//                    username = userName
//                    password = passWord
//                }
            }
        }
    }
}

示例2:

apply plugin: 'maven'

uploadArchives {
    repositories.mavenDeployer {
        //def mavenDirPath = file('../maven') //  相对地址。 编译后的代码将会存在父目录的maven文件夹下。
        def mavenDirPath =  file('D:\\appmaven')  //绝对路径,编译后的代码将会存在 D盘的appmaven文件夹下。
        repository(url: "file://${mavenDirPath.absolutePath}")
        pom.project {
            groupId "cn.zinyan.demo" // 包名
            artifactId "Key" // module的名字
            version '1.1.1'// 版本号
            //配置完毕后,包名决定地址中的 第一项,artifactId 决定了第二项,version 决定了第三项版本号
            //implementation 'cn.zinyan.demo:Key:1.1.1'
        }
    }
}

具体的可以参考我的这篇文章:https://zinyan.com/?p=99

上面的两种打包方式。不管是我们使用maven插件还是maven-publish。如果打包带productFlavors的项目。都不成功。

如果是使用maven进行打包。

结果显示成功:BUILD SUCCESSFUL in 0s 但是我们发现aar文件没有正常的生成。

而我们如果是使用maven-publish进行打包。

结果是错误:

groovy.lang.MissingPropertyException: Could not get unknown property 'release' for SoftwareComponentInternal set of type org.gradle.api.internal.component.DefaultSoftwareComponentContainer.

效果图image.png

会告诉我们 release 不存在。

解决方法

通过谷歌官网的介绍:https://developer.android.google.cn/studio/build/maven-publish-plugin?hl=zh-tw 结果并没有相关介绍。

没有能够解决我的问题。

方案1

然后搜索stackoverflow。 得到下面的:https://stackoverflow.com/questions/27160087/how-to-upload-multiple-android-archives-one-for-each-flavor

但是我编译失败了。不知道其他小伙伴能不能成功。

方案2

后来在CSDN中找到了一个小伙伴的 https://blog.csdn.net/LZK_Dreamer/article/details/108344644。 使用Maven-Publish发布多渠道aar包。 也比较复杂。

同时这个小伙伴的编译时。需要我们先主动触发assembleRelease。否则提示文件找不到。错误。

但是能够打包出来aar和pom文件。

问题可以解决,就是有点繁琐。

方案3

后面继续查询 https://blog.csdn.net/pxq10422/article/details/105127853 通过该博文,也能进行打包aar。 这个小伙伴的问题刚好也是我需要的。

小伙伴的介绍也比较详细。我一度以为问题得到了解决。

但是有小伙伴反馈pom文件里面的依赖不对。

我自己尝试后发现pom文件的确不正确。只有该aar本身。没有它需要依赖的其他jar库等。

惆怅,然后发现方案3小伙伴也查询到过方案1的资料。

最终方案

在集合方案3和方案2之后,我汇总了一下得到了解决。下面介绍一下我的解决

我的flavors 的命名:

productFlavors {
    all {
       ...
    }
    sdk {
       ...
    }
}

我的maven打包的完整代码:

apply plugin: 'maven'

import org.gradle.api.internal.artifacts.publish.DefaultPublishArtifact

//导入类
configurations {
    sdkArchives
    AllArchives
}

artifacts {
    AllArchives new DefaultPublishArtifact("all", "aar", "aar", null, new Date(),
            new File("build/outputs/aar", "Zinyan-all-release.aar"))
    sdkArchives new DefaultPublishArtifact("sdk", "aar", "aar", null, new Date(),
            new File("build/outputs/aar", "Zinyan-sdk-release.aar")) //这个aar文件的名称> 你需要根据你的本地文件进行修改
}

//全部SDK
task uploadAll(type: Upload, group: "upload", dependsOn: 'assembleAll') {  // assembleAll 就会帮我们生成相关的aar文件的task。  Gradle/XXX/Tasks/build/assembleXXXX  你自己的项目进行选择。 
    setConfiguration(project.configurations.getByName("AllArchives"))

    repositories.mavenDeployer {
        def mavenDirPath = file('D:\\Zinyan\\mavenLib') 
        repository(url: "file://${mavenDirPath.absolutePath}")

        pom.project {
            groupId "com.zinyan.dev" // 包名
            artifactId "all" // module的名字
            version '1.0.0'// 版本号
        }
        //如果不加下面的pom文件就不正确
        pom.withXml {
            def dependenciesNode = asNode().appendNode("dependencies")
            configurations.implementation.allDependencies.forEach() {
                Dependency dependency ->
                    if (dependency.version != "unspecified" && dependency.name != "unspecified") {
                        def dependencyNode = dependenciesNode.appendNode('dependency')
                        dependencyNode.appendNode('groupId', dependency.group)
                        dependencyNode.appendNode('artifactId', dependency.name)
                        dependencyNode.appendNode('version', dependency.version)
                    }
            }
        }
    }
}
//第二个SDK
task uploadSdk(type: Upload, group: "upload", dependsOn: 'assembleSdk') {
    setConfiguration(project.configurations.getByName("sdkArchives"))

    repositories.mavenDeployer {
         def mavenDirPath = file('D:\\Zinyan\\mavenLib') 
        repository(url: "file://${mavenDirPath.absolutePath}")

         pom.project {
            groupId "com.zinyan.dev" // 包名
            artifactId "sdk" // module的名字
            version '1.0.0'// 版本号
        }
        pom.withXml {
            def dependenciesNode = asNode().appendNode("dependencies")
            configurations.implementation.allDependencies.forEach() {
                Dependency dependency ->
                    if (dependency.version != "unspecified" && dependency.name != "unspecified") {
                        def dependencyNode = dependenciesNode.appendNode('dependency')
                        dependencyNode.appendNode('groupId', dependency.group)
                        dependencyNode.appendNode('artifactId', dependency.name)
                        dependencyNode.appendNode('version', dependency.version)
                    }
            }
        }
    }
}

然后我们就可以在 gradle 面板中看到我们定义的两个task了。就能够进行生成maven库代码了。
屏幕截图 20211024 202456.png

其他

关于多渠道sdk的maven方式打包。相关资料比较少。

希望能够给你们带来参考

5

评论区