Android?使用maven?publish插件發(fā)布產(chǎn)物(aar)流程實(shí)踐
背景
平時(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)文章希望大家以后多多支持腳本之家!
- Android將項(xiàng)目導(dǎo)出為L(zhǎng)ibrary并在項(xiàng)目中使用教程
- Android Studio多工程引用同一個(gè)library項(xiàng)目配置的解決方法
- android studio library 模塊中正確引用aar的實(shí)例講解
- Android Data Binding 在 library module 中遇到錯(cuò)誤及解決辦法
- Android Support Library 標(biāo)題欄(Toolbar)滾動(dòng)效果實(shí)現(xiàn)方法
- Android 詳解Studio引用Library與導(dǎo)入jar
- android底部彈出iOS7風(fēng)格對(duì)話選項(xiàng)框(QQ對(duì)話框)--第三方開(kāi)源之IOS_Dialog_Library
- 解析ADT-20問(wèn)題 android support library
- Android打包上傳AAR文件到Maven倉(cāng)庫(kù)的示例
- 發(fā)布?Android?library?到?Maven?解析
相關(guān)文章
Android編程實(shí)現(xiàn)ActionBar的home圖標(biāo)動(dòng)畫(huà)切換效果
這篇文章主要介紹了Android編程實(shí)現(xiàn)ActionBar的home圖標(biāo)動(dòng)畫(huà)切換效果,涉及Android布局、樣式、Activity及菜單相關(guān)操作技巧,需要的朋友可以參考下2017-01-01Android獲取手機(jī)配置信息具體實(shí)現(xiàn)代碼
下面為大家介紹下使用android獲取手機(jī)配置信息的具體過(guò)程,感興趣的朋友可以參考下哈,希望對(duì)你有所幫助2013-06-06UIImage初始化的區(qū)別兩種方法介紹(面試常見(jiàn))
本文通過(guò)兩種方法給大家介紹UIImage初始化的區(qū)別,在面試過(guò)程中經(jīng)常遇到,對(duì)uiimage初始化相關(guān)知識(shí)感興趣的朋友一起了解下吧2016-05-05Android apk無(wú)法安裝及閃退問(wèn)題解決辦法
這篇文章主要介紹了Android apk無(wú)法安裝及閃退問(wèn)題的相關(guān)資料,這里對(duì)閃退問(wèn)題進(jìn)行詳解及解決步驟的詳細(xì)介紹,需要的朋友可以參考下2017-07-07Android自定義對(duì)話框的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Android自定義對(duì)話框的簡(jiǎn)單實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07Android 如何實(shí)現(xiàn)亮度自動(dòng)調(diào)節(jié)
這篇文章主要介紹了Android 如何實(shí)現(xiàn)亮度自動(dòng)調(diào)節(jié),幫助大家更好的理解和學(xué)習(xí)使用Android開(kāi)發(fā),感興趣的朋友可以了解下2021-04-04Android 實(shí)現(xiàn)電話來(lái)去自動(dòng)錄音的功能
本文主要介紹Android 電話自動(dòng)錄音功能的開(kāi)發(fā),這里提供實(shí)現(xiàn)代碼和實(shí)現(xiàn)效果圖,有需要的小伙伴可以參考下2016-08-08android 6.0下webview的定位權(quán)限設(shè)置方法
今天小編就為大家分享一篇android 6.0下webview的定位權(quán)限設(shè)置方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07