Android多模塊構(gòu)建合并aar解決方案

前言

前段時(shí)間,我在實(shí)現(xiàn)gradle多模塊構(gòu)建遇到一個(gè)問題,以前我們基本上是以jar包形式讓開發(fā)者集成到工程中使用,但自從Android Studio中有了多module的概念,而我們的SDK也是分了多個(gè)模塊進(jìn)行構(gòu)建的,但我們這里有個(gè)問題就是模塊之間是相互關(guān)聯(lián)的,不能針對(duì)每個(gè)模塊單獨(dú)打包,而每個(gè)module都會(huì)生成對(duì)應(yīng)的aar,但并不會(huì)把依賴的module代碼打進(jìn)去,別問我為什么知道,你將aar后綴改為zip,然后反編譯classes.jar就可以看到。所以我們這邊就有了合并aar這樣的一個(gè)需求,下面就告訴大家怎么來(lái)實(shí)現(xiàn)。

android-fat-aar

當(dāng)時(shí)我遇到這個(gè)問題,就去github搜了一下,已經(jīng)有人將合并aar的腳本開源出來(lái)了,開源地址如下:

https://github.com/adwiv/android-fat-aar

什么是aar?

什么是aar?它跟jar包有什么區(qū)別?它該怎么樣使用?相信大家一定會(huì)有這些疑問。首先aar是針對(duì)Android Library而言的,你可以理解為IDE針對(duì)Android Library的打包,一個(gè)aar包含什么東西?
它的文件后綴名是.aar,它本身是一個(gè)zip文件,強(qiáng)制包含以下文件:

  • /AndroidManifest.xml
  • /classes.jar
  • /res/
  • /R.txt

另外,AAR文件可以包括以下可選條目中的一個(gè)或多個(gè):

  • /assets/
  • /libs/name.jar
  • /jni/abi_name/name.so (where abi_name is one of the Android supported ABIs)
  • /proguard.txt
  • /lint.jar

具體看到這里看如何創(chuàng)建一個(gè)Android Library:
https://developer.android.com/studio/projects/android-library.html#aar-contents

jar包跟aar包有什么區(qū)別?
jar:只包含了class文件與清單文件,不包含資源文件,如圖片等所有res中的文件。
aar:包含所有資源,class以及res資源文件全部包含。

如果你只是簡(jiǎn)單實(shí)用一些類庫(kù),你可以直接使用*.jar文件,而如果你想既想使用類庫(kù),又想實(shí)用資源,那么你就可以創(chuàng)建一個(gè)Android Library,使用它生成的*.aar文件。

jar文件的使用方式我們應(yīng)該比較熟悉了,將它復(fù)制到工程的libs目錄下,然后在gradle中添加以下腳本:

dependencies {
    compile fileTree(include: ['*.jar'], dir:'libs')
}

aar文件使用同樣需要復(fù)制到libs目錄下,并按照以下方式集成:

repositories {
    flatDir {
        dirs'libs'
    }
}

dependencies {
    compile(name:'your aar', ext:'aar')
}

多模塊構(gòu)建合并aar

這個(gè)是本文的重點(diǎn),我們可以再每個(gè)module下的build/outputs/aar下找到編譯生成的*.aar文件。

步驟1
將gradle文件'fat-aar.gradle'到你的項(xiàng)目目錄,然后apply:

apply from: 'fat-aar.gradle'

步驟2:定義嵌入的依賴關(guān)系
你需要修改你以前依賴項(xiàng),并將compile更改為embedded,作為你想要合并的aar。使用例子如下:

apply from: 'fat-aar.gradle'

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    // Order of dependencies decide which will have precedence in case of duplicates
    // during manifest / resource merger
    embedded project(':librarytwo')
    embedded project(':libraryone')
    // We can embed android libraries from maven too
    embedded 'com.adwiv.internal:librarythree:1.0.0'

    compile 'com.android.support:appcompat-v7:22.2.0' //Non embedded dependency
}

通過以上的方式你可以將多個(gè)module生成的aar合成一個(gè),大家可以新建一個(gè)demo工程來(lái)測(cè)試下

fat-aar
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,351評(píng)論 25 708
  • 參考:Android導(dǎo)出aar時(shí)嵌套引用的那些坑Android多模塊構(gòu)建合并aar解決方案android stud...
    才兄說閱讀 4,883評(píng)論 0 3
  • afinalAfinal是一個(gè)android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,899評(píng)論 2 45
  • 昨夜讀《西廂》, 心旌搖蕩。 不為鶯鶯貌美, 不為嬌柔紅娘, 只為我心中的女神, 只為我心中的鳳凰。 因她整日心猿...
    庭上望月閱讀 694評(píng)論 15 35
  • 雨后的清晨,靜謐清涼,天還未亮,我和愛人在一同去機(jī)場(chǎng)的路上,在出小區(qū)大門的那一刻,我為即將回到我期待已久薩...
    風(fēng)信子ll閱讀 394評(píng)論 3 2

友情鏈接更多精彩內(nèi)容