欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android?使用maven?publish插件發(fā)布產(chǎn)物(aar)流程實(shí)踐

 更新時(shí)間:2022年09月19日 08:52:27   作者:Avengong  
這篇文章主要介紹了Android?使用maven?publish插件發(fā)布產(chǎn)物(aar)流程實(shí)踐,Android?Gradle插件根據(jù)項(xiàng)目gradle中應(yīng)用不同的插件類(lèi)型在編譯組裝后會(huì)生成不同的產(chǎn)物,具體相關(guān)介紹,需要的小伙伴可以參考一下

背景

平時(shí)開(kāi)發(fā)中會(huì)把一些獨(dú)立的功能模塊抽取出來(lái)作為sdk,既方便業(yè)務(wù)接入,又能讓其他業(yè)務(wù)線快速?gòu)?fù)用。那么我們就需要將sdk打包上傳到maven倉(cāng)庫(kù),讓業(yè)務(wù)側(cè)依賴即可。

一、編譯后的產(chǎn)物

在上傳產(chǎn)物到maven倉(cāng)庫(kù)之前,我們的知道產(chǎn)物到底是什么。

Android Gradle插件根據(jù)項(xiàng)目gradle中應(yīng)用不同的插件類(lèi)型在編譯組裝后會(huì)生成不同的產(chǎn)物:

1.1 APK 構(gòu)件

Android項(xiàng)目的主工程app的gradle配置文件依賴:

apply plugin: 'com.android.application'

因此,在通過(guò)編譯命令./gradlew assembleDebug 或./gradlew assembleRelease后,就會(huì)在build/outputs/apk文件下生成產(chǎn)物:

如圖,apk就是產(chǎn)物(構(gòu)件)。

1.2 AAB(Android app bundle)構(gòu)件

如果是海外市場(chǎng),在Google Play上架的應(yīng)用必須要打aab包,而不是之前的apk格式。具體區(qū)別就暫不討論了~ 編譯命令為:./gradlew bundleDebug 或./gradlew bundleRelease。產(chǎn)物為:

1.3 AAR 構(gòu)件

一般的module在編譯打包后,會(huì)生成aar:

二、publish插件

有了產(chǎn)物,我們就需要把產(chǎn)物上傳到maven倉(cāng)庫(kù)(一般是私有倉(cāng)庫(kù)),方便公司項(xiàng)目直接依賴。而上傳就要用到publish插件。APG 3.6.0之前用的maven插件,之后都用maven-publish插件。

2.1 maven-publish插件使用

我們可以新建一個(gè)gradle文件,如:maven_publish.gradle。專(zhuān)門(mén)用來(lái)上傳aar。配置如下:

 //maven-publish 新方式
plugins {
    //todo 1 上傳插件
    id 'maven-publish'
}

afterEvaluate{
    publishing {
        publications {

            // Creates a Maven publication called "myPublication".
            myPublication(MavenPublication) {
                groupId 'com.sdk.aarpub'
                artifactId 'aar-test'
                version '1.2.2'             // Your package version
//                artifact publishArtifact    //Example: *./target/myJavaClasses.jar*
                artifact "build/outputs/aar/aar-test-release.aar"http://aar包的目錄

                //帶上依賴 ,否則會(huì)報(bào)錯(cuò)
                pom.withXml {
                    def dependenciesNode = asNode().appendNode('dependencies')

                    def scopes = [configurations.compile]
                    if (configurations.hasProperty("api")) {
                        scopes.add(configurations.api)
                    }
                    if (configurations.hasProperty("implementation")) {
                        scopes.add(configurations.implementation)
                    }
                    if (configurations.hasProperty("debugImplementation")) {
                        scopes.add(configurations.debugImplementation)
                    }
                    if (configurations.hasProperty("releaseImplementation")) {
                        scopes.add(configurations.releaseImplementation)
                    }

//                    if (project.ext.targetType != "jar") {
//                        scopes.add(configurations.provided)
//                    }

                    scopes.each { scope ->
                        scope.allDependencies.each {
                            if (it instanceof ModuleDependency) {
                                boolean isTransitive = ((ModuleDependency) it).transitive
                                if (!isTransitive) {
                                    println "<<<< not transitive dependency: [${it.group}, ${it.name}, ${it.version}]"
                                    return
                                }
                            }

                            if (it.group == "${project.rootProject.name}.libs" || it.version == 'unspecified') {
                                return
                            }

                            if (it.group && it.name && it.version) {
                                def dependencyNode = dependenciesNode.appendNode('dependency')
                                dependencyNode.appendNode('groupId', it.group)
                                dependencyNode.appendNode('artifactId', it.name)
                                dependencyNode.appendNode('version', it.version)
                                dependencyNode.appendNode('scope', scope.name)
                            }
                        }
                    }
                }
            }
        }

        // Repositories *to* which Gradle can publish artifacts
        repositories {
            maven {
            //上傳到項(xiàng)目本地倉(cāng)庫(kù)
                url uri('../local_mavenrepo')
//            credentials {
//                username "default"
//                password "default"
//            }
            }
        }
    }
}

在assemble命令后,執(zhí)行publish命令:

./gradlew publish

2.2 maven插件使用

舊方式:

plugins {
    //todo 1 上傳插件
    id 'maven'
}


uploadArchives{
    // 方式一
    repositories {
        mavenDeployer{
            repository(url: uri('../local_mavenrepo'))
            //todo 2 配置版本信息 方式二
            pom.groupId = 'com.sdk.aarpub'
            pom.artifactId = 'aar-test'
            pom.version = '1.1.0'
        }
        //mavenLocal 這個(gè)是本機(jī)上的maven本地緩存?zhèn)}庫(kù)
//        mavenLocal()
    }

}

在assemble命令后,執(zhí)行uploadArchives命令:

./gradlew uploadArchives

2.3 業(yè)務(wù)側(cè)使用

在項(xiàng)目的根gradle文件中,配置倉(cāng)庫(kù):

maven { url '../local_mavenrepo/'}

在對(duì)應(yīng)的模塊中引入依賴:

implementation 'com.sdk.aarpub:aar-test:1.2.2'

三、問(wèn)題總結(jié)

3.1 報(bào)錯(cuò)

項(xiàng)目中依賴本地aar的時(shí)候打包報(bào)錯(cuò)Direct local .aar file dependencies are not supported when building an AAR.....

原因:當(dāng)打包aar時(shí)候直接依賴本地的aar是不被允許的。 解決方案:通過(guò)把依賴的aar放到單獨(dú)的模塊中,讓直接依賴本地aar變成依賴模塊。

  • 新建一個(gè)文件夾aar-lib
  • 新建一個(gè)libs文件夾,把oaid_sdk_1.0.30.aar放入到libs目錄中 

新建build.gradle文件,寫(xiě)入如下內(nèi)容:

configurations.maybeCreate("default")
def publishArtifact = artifacts.add("default", file('libs/oaid_sdk_1.0.30.aar'))

在項(xiàng)目的settings文件中引入該模塊:

include ':aar-lib'

刪除報(bào)錯(cuò)模塊中的aar文件,替換原來(lái)依賴方式:

//    implementation files('libs/oaid_sdk_1.0.30.aar') 舊的方式
    implementation project(path:":aar-lib")

3.2 module打包aar時(shí)依賴aar導(dǎo)致的類(lèi)引用不到的問(wèn)題

3.1 只是解決了在項(xiàng)目打包過(guò)程中依賴本地aar的問(wèn)題。 當(dāng)module作為sdk同時(shí)又依賴aar時(shí),此時(shí)接入sdk會(huì)報(bào)錯(cuò),提示引用不到aar中的類(lèi)。當(dāng)然我們可以直接把a(bǔ)ar給到業(yè)務(wù)測(cè),直接引入即可,但這樣增加了接入成本。因此,我們的解決方案跟原理跟3.1一樣,但是會(huì)把a(bǔ)ar上傳到遠(yuǎn)程庫(kù),作為遠(yuǎn)程來(lái)依賴。

比如 A模塊依賴了oaid_sdk_1.0.30.aar,同時(shí)A模塊作為sdk是要提供給業(yè)務(wù)側(cè)app使用的。

按照3.1的方式創(chuàng)建一個(gè)aar-lib,build.gradle內(nèi)容有所不同:

plugins {
    id 'maven-publish'
}

//生成文檔注釋
task androidJavadocs(type: Javadoc) {
    failOnError = false
    source = android.sourceSets.main.java.srcDirs
    ext.androidJar = "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
    classpath += files(ext.androidJar)
}
//將文檔打包成jar
task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
    archiveClassifier.set('javadoc')
    from androidJavadocs.destinationDir
}
//將源碼打包,這一點(diǎn)對(duì)kotlin來(lái)說(shuō)很重要,否則業(yè)務(wù)側(cè)無(wú)法看到源碼
task androidSourcesJar(type: Jar) {
    archiveClassifier.set('sources')
    from android.sourceSets.main.java.srcDirs
}
configurations.maybeCreate("default")
def publishArtifact = artifacts.add("default", file('libs/oaid_sdk_1.0.30.aar'))

afterEvaluate{
    publishing {
        publications {

            myPublication(MavenPublication) {
                groupId 'com.sdk.aarpub'
                artifactId 'aar-lib'
                version '1.0.0'             // Your package version
                artifact(androidSourcesJar)//將源碼打包進(jìn)aar,如果不需要可以去掉
                artifact(androidJavadocsJar)//將注釋打包進(jìn)aar,如果不需要可以去掉
                // 將aar推送到遠(yuǎn)程倉(cāng)庫(kù)
                artifact publishArtifact    //Example: *./target/myJavaClasses.jar*
            }
        }

        // Repositories *to* which Gradle can publish artifacts
        repositories {
            maven {
                url uri('../local_maverepo')
//            credentials {
//                username "default"
//                password "default"
//            }
            }
        }
    }
}

執(zhí)行發(fā)布命令:

./gradlew :aar-lib:publish

讓A模塊依賴第二步中推送到遠(yuǎn)程的aar庫(kù):

implementation 'com.sdk.aarpub:aar-lib:1.0.0'
  • 重新打包A模塊,當(dāng)app依賴A模塊時(shí)候,A模塊中的aar就會(huì)被引用到了 當(dāng)然在A模塊發(fā)布的時(shí)候記得要帶上依賴:
 //帶上依賴 ,否則會(huì)報(bào)錯(cuò)
                pom.withXml {
                    def dependenciesNode = asNode().appendNode('dependencies')

                    def scopes = [configurations.compile]
                    if (configurations.hasProperty("api")) {
                        scopes.add(configurations.api)
                    }
                    if (configurations.hasProperty("implementation")) {
                        scopes.add(configurations.implementation)
                    }
                    if (configurations.hasProperty("debugImplementation")) {
                        scopes.add(configurations.debugImplementation)
                    }
                    if (configurations.hasProperty("releaseImplementation")) {
                        scopes.add(configurations.releaseImplementation)
                    }

//                    if (project.ext.targetType != "jar") {
//                        scopes.add(configurations.provided)
//                    }

                    scopes.each { scope ->
                        scope.allDependencies.each {
                            if (it instanceof ModuleDependency) {
                                boolean isTransitive = ((ModuleDependency) it).transitive
                                if (!isTransitive) {
                                    println "<<<< not transitive dependency: [${it.group}, ${it.name}, ${it.version}]"
                                    return
                                }
                            }

                            if (it.group == "${project.rootProject.name}.libs" || it.version == 'unspecified') {
                                return
                            }

                            if (it.group && it.name && it.version) {
                                def dependencyNode = dependenciesNode.appendNode('dependency')
                                dependencyNode.appendNode('groupId', it.group)
                                dependencyNode.appendNode('artifactId', it.name)
                                dependencyNode.appendNode('version', it.version)
                                dependencyNode.appendNode('scope', scope.name)
                            }
                        }
                    }
                }

到此這篇關(guān)于Android 使用maven publish插件發(fā)布產(chǎn)物(aar)流程實(shí)踐的文章就介紹到這了,更多相關(guān)Android  發(fā)布產(chǎn)物內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論