標籤:測試 更改 and 針對 pen 指令碼 .com 1.0 guard
前言
前段時間,我在實現gradle多模組構建遇到一個問題,以前我們基本上是以jar包形式讓開發人員整合到工程中使用,但自從Android Studio中有了多module的概念,而我們的SDK也是分了多個模組進行構建的,但我們這裡有個問題就是模組之間是相互關聯的,不能針對每個模組單獨打包,而每個module都會產生對應的aar,但並不會把依賴的module代碼打進去,別問我為什麼知道,你將aar尾碼改為zip,然後反編譯classes.jar就可以看到。所以我們這邊就有了合并aar這樣的一個需求,下面就告訴大家怎麼來實現。
android-fat-aar
當時我遇到這個問題,就去github搜了一下,已經有人將合并aar的指令碼開源出來了,開源地址如下:
https://github.com/adwiv/android-fat-aar
什麼是aar?
什麼是aar?它跟jar包有什麼區別?它該怎麼樣使用?相信大家一定會有這些疑問。首先aar是針對Android Library而言的,你可以理解為IDE針對Android Library的打包,一個aar包含什麼東西?
它的檔案尾碼名是.aar,它本身是一個zip檔案,強制包含以下檔案:
- /AndroidManifest.xml
- /classes.jar
- /res/
- /R.txt
另外,AAR檔案可以包括以下可選條目中的一個或多個:
- /assets/
- /libs/name.jar
- /jni/abi_name/name.so (where abi_name is one of the Android supported ABIs)
- /proguard.txt
- /lint.jar
具體看到這裡看如何建立一個Android Library:
https://developer.android.com/studio/projects/android-library.html#aar-contents
jar包跟aar包有什麼區別?
jar:只包含了class檔案與資訊清單檔,不包含資源檔,片等所有res中的檔案。
aar:包含所有資源,class以及res資源檔全部包含。
如果你只是簡單實用一些類庫,你可以直接使用*.jar檔案,而如果你想既想使用類庫,又想實用資源,那麼你就可以建立一個Android Library,使用它產生的*.aar檔案。
jar檔案的使用方式我們應該比較熟悉了,將它複製到工程的libs目錄下,然後在gradle中添加以下指令碼:
dependencies { compile fileTree(include: [‘*.jar‘], dir:‘libs‘)}
aar檔案使用同樣需要複製到libs目錄下,並按照以下方式整合:
repositories { flatDir { dirs‘libs‘ }}dependencies { compile(name:‘your aar‘, ext:‘aar‘)}
多模組構建合并aar
這個是本文的重點,我們可以再每個module下的build/outputs/aar下找到編譯產生的*.aar檔案。
步驟1:
將gradle檔案’fat-aar.gradle’到你的項目目錄,然後apply:
apply from: ‘fat-aar.gradle‘
步驟2:定義嵌入的依賴關係
你需要修改你以前依賴項,並將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}
通過以上的方式你可以將多個module產生的aar合成一個,大家可以建立一個demo工程來測試下
Android多模組構建合并aar解決方案