詳解Android打包上傳使用AAR

最近在做基礎(chǔ)功能和架構(gòu)搭建,所以會(huì)將基礎(chǔ)功能進(jìn)行封裝,并提供一份遠(yuǎn)程依賴.在使用過(guò)程中踩了很多坑.特地進(jìn)行記錄

不想看分析和流程的可以直接點(diǎn)擊查看,重點(diǎn)關(guān)注工程的三個(gè)gradle文件和相關(guān)注釋,MainActivity有引用庫(kù)的類示例示例代碼

在Android中使用第三方的庫(kù)和自己的庫(kù),無(wú)論是遠(yuǎn)程依賴還是本地依賴,通常會(huì)選擇JAR和AAR的形式.而AAR相比JAR包可以包含資源文件.可以有AndroidManifest文件.所以都會(huì)建議使用AAR包的形式進(jìn)行打包.

  網(wǎng)上很多示例都只是封裝了自己的代碼,而涉及到第三方的SDK引用,就避而不談,或者是使用jar包的形式.但是使用jar包會(huì)有非常多的問(wèn)題,例如第三方SDK包含了SO庫(kù)(如高德地圖,極光推送),而且由于是基礎(chǔ)封裝的庫(kù),所以必須包含所有的so庫(kù)版本.就會(huì)導(dǎo)致aar包的非常龐大,這時(shí)就需要使用遠(yuǎn)程依賴和動(dòng)態(tài)設(shè)置so支持版本來(lái)解決這個(gè)問(wèn)題.而使用了遠(yuǎn)程依賴,又要解決依賴傳遞的問(wèn)題.
  默認(rèn)的AAR包只有代碼,沒(méi)有注釋和源碼.

需要解決的問(wèn)題

  • 1.aar包遠(yuǎn)程依賴第三方庫(kù)
  • 2.aar包依賴沖突
  • 3.aar添加源碼和代碼注釋
解決問(wèn)題前需要了解的兩個(gè)知識(shí)點(diǎn)
Android推薦gradle依賴方式.png

從這張圖中可以看到,從Android gradle plugin 3.0.0版本開(kāi)始,推薦使用implementation和api替換到以前使用的compile依賴方法.


gradle依賴傳遞.png

上面這張圖是在gradle官網(wǎng)關(guān)于gradle處理依賴的截圖.這里做個(gè)簡(jiǎn)單的整理

參數(shù) 意義
force true 發(fā)生沖突時(shí)強(qiáng)制使用該依賴,false不強(qiáng)制使用,默認(rèn)為false
exclude module : 'lib' 去掉名為lib的module依賴
exclude group:'org.xx' 去掉包名為org.xx依賴
transitive false 不傳遞依賴,true為傳遞,默認(rèn)為false

在使用過(guò)程中還是發(fā)現(xiàn)有一個(gè)問(wèn)題依舊不能解決.如果對(duì)aar包進(jìn)行了混淆,自己編寫的代碼都被去除了,不知道是什么原因,希望有高人相助.


新建Module并打包AAR流程

1.添加一個(gè)AndroidLibrary模塊
右鍵工程父目錄  -> NEW -> Module -> Android Library 
2.修改Library模塊的build.gradle
//在最上方加上maven依賴的插件
...
apply plugin: 'maven'

...//這里忽略了gradle文件原有的配置

//在gradle文件最下方新建一個(gè)打包任務(wù).
//maven上傳,示例代碼將aar輸出到了本地,如果公司有maven私服,可以將地址改為maven私服的地址
def MAVEN_LOCAL_PATH = 'file://localhost/' + rootProject.buildDir
//版本號(hào)
def VERSION = '0.0.1'
//公司名稱
def GROUP_ID = 'com.cicinnus.aartest'
//aar包名稱
def ARTIFACT_ID = 'aartest'
//Maven私服賬號(hào)
//def ACCOUNT = 'xxx'
//Maven私服密碼
//def PWD = 'xxx'
uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: MAVEN_LOCAL_PATH) {
                //如果使用的是maven私服,一般都需要賬號(hào)密碼
                //authentication(userName :ACCOUNT,password:PWD)
            }
            pom.groupId = GROUP_ID
            pom.artifactId = ARTIFACT_ID
            pom.version = VERSION
            pom.packaging = 'aar'

        }
    }
}
3.構(gòu)建aar,輸出到本地
在項(xiàng)目目錄,執(zhí)行命令行./gradlew uploadArchives
或者在AS右邊的gradle插件中
選擇library模塊 -> upload -> 雙擊uploadArchives .等待編譯結(jié)束
編譯結(jié)束后在Library模塊 -> outputs -> aar .就可以找到編譯好的aar包
4.引用本地aar(因?yàn)槿笔?duì)maven的依賴管理,所以本地引用會(huì)導(dǎo)致依賴無(wú)法正確傳遞,意思就是使用本地aar包的方式會(huì)導(dǎo)致遠(yuǎn)程依賴失效.解決方案請(qǐng)繼續(xù)往下)
在app模塊的gradle文件添加
...
repositories {
    flatDir {
        dirs 'libs'
    }
}
dependencies {
    ...
    api(name: 'aarlibrary-release', ext: 'aar')
}
5.使用遠(yuǎn)程依賴aar,推薦的解決方案

使用遠(yuǎn)程依賴的方式:

1.maven構(gòu)建的地址填寫maven私服地址
def MAVEN_LOCAL_PATH = 'maven私服地址'
uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: MAVEN_LOCAL_PATH) {
            }   
       ...省略部分代碼
     }
  }
}   

2.在工程父目錄的gradle文件添加maven倉(cāng)庫(kù)地址

allprojects {
    repositories {
        maven {
            url 'maven私服地址,與上傳的地址一致'
        }
        google()
        jcenter()
    }

}
3.app模塊的gradle使用遠(yuǎn)程依賴,并傳遞依賴,注意最后的transitive
    api group: 'com.cicinnus.aartest', name: 'aartest', version: '0.0.1', transitive: true


6.為構(gòu)建的aar添加文檔和源碼包(可選).方便調(diào)用者查看注釋和源碼實(shí)現(xiàn)

在library的module中添加gradle task,以下代碼無(wú)需修改照抄即可,如果只需要文檔可以刪掉archives androidSourcesJar這一行代碼.
在生成aar的同時(shí),在build目錄會(huì)有一個(gè)libs目錄,里面放著源碼和文檔的jar包,如果上傳到maven私服,會(huì)自動(dòng)同時(shí)提交.如果使用本地aar,需要單獨(dú)引入.

//生成文檔注釋
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) {
    classifier = 'javadoc'
    from androidJavadocs.destinationDir
}
//將源碼打包
task androidSourcesJar(type: Jar) {
    classifier = 'sources'
    from android.sourceSets.main.java.srcDirs
}
//包含文檔和源碼的aar
artifacts {
    archives androidSourcesJar
    archives androidJavadocsJar
}
總結(jié)最佳方案

使用遠(yuǎn)程aar,最大優(yōu)勢(shì):

  • .方便處理依賴沖突,依賴傳遞

不建議使用本地aar的兩個(gè)原因:

  • 1.aar中的第三個(gè)庫(kù)無(wú)法使用遠(yuǎn)程依賴
  • 2.如果使用本地maven,需要每個(gè)參與開(kāi)發(fā)的人員都配置一個(gè)本地的maven倉(cāng)庫(kù),不現(xiàn)實(shí)

aar最佳使用流程和推薦用法

  • 1.配置gradle task,上傳aar包到maven倉(cāng)庫(kù)
  • 2.配置遠(yuǎn)程依賴,將依賴的版本號(hào)設(shè)為'+'.意為動(dòng)態(tài)使用最新版本,可以解決aar更新后無(wú)法及時(shí)知道的問(wèn)題

implementation group: 'com.cicinnus.aartest', name: 'aartest', version: '+',transitive:true

  • 3.有A,B,C三個(gè)模塊,A為app主模塊,A依賴B和C,B依賴C的部分功能.這時(shí)候可以考慮將B的依賴關(guān)鍵字使用compileOnly,就可以解決最終的依賴沖突問(wèn)題.卻又能在編譯期正常使用C模塊的功能.

compileOnly group: 'com.cicinnus.aartest', name: 'aartest', version: '0.0.1'

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子敬特,更是在濱河造成了極大的恐慌蚯舱,老刑警劉巖重绷,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)航邢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)骄蝇,“玉大人膳殷,你說(shuō)我怎么就攤上這事【呕穑” “怎么了赚窃?”我有些...
    開(kāi)封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)岔激。 經(jīng)常有香客問(wèn)我勒极,道長(zhǎng),這世上最難降的妖魔是什么虑鼎? 我笑而不...
    開(kāi)封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任辱匿,我火速辦了婚禮,結(jié)果婚禮上震叙,老公的妹妹穿的比我還像新娘掀鹅。我一直安慰自己,他們只是感情好媒楼,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著戚丸,像睡著了一般划址。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上限府,一...
    開(kāi)封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天夺颤,我揣著相機(jī)與錄音,去河邊找鬼胁勺。 笑死世澜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的署穗。 我是一名探鬼主播寥裂,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起添寺,我...
    開(kāi)封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤胚想,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后械馆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體央渣,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涩惑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年低飒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了许昨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡褥赊,死狀恐怖车要,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情崭倘,我是刑警寧澤翼岁,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站司光,受9級(jí)特大地震影響琅坡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜残家,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一榆俺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坞淮,春花似錦茴晋、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至啡直,卻和暖如春烁涌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酒觅。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工撮执, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人舷丹。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓抒钱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親颜凯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谋币,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)装获,斷路器瑞信,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評(píng)論 6 342
  • 說(shuō)明 本文主要介紹和Gradle關(guān)系密切、相對(duì)不容易理解的配置穴豫,偏重概念介紹凡简。部分內(nèi)容是Android特有的(例如...
    jzj1993閱讀 15,576評(píng)論 1 62
  • info 添加 Privacy - Location Always and When In Use Usage D...
    J_HX閱讀 697評(píng)論 0 0
  • 是夜逼友。一個(gè)十幾歲小姑娘坐在桌前準(zhǔn)備寫作業(yè),打開(kāi)臺(tái)燈秤涩,翻開(kāi)作業(yè)本帜乞,上面被人歪歪扭扭的寫著“尿黃黃”三個(gè)字。小姑娘看到...
    什么丸子閱讀 259評(píng)論 0 1