A. 排除aar/jar中冗餘或者沖突包、類
引入aar的沖突無所不在,通過遠程依賴maven的包可以通過 exclude 關鍵字搭配 mole 和 group 去除某個組,沒辦法去除具體的類。
那麼如果是單獨的aar包,想要排除aar下classes.jar包里的某個單獨的包或者類怎麼辦?
需要接入的jar包已經帶了騰訊X5核心,當前依賴的已經包含X5核心,沖突又該如何解決呢?
當前的gradle腳本(項鍵慧目鏈接: https://github.com/luohongxfb/ExcludeAar )可以解決。
如excludelib/libs/exampleAAR.aar,左邊是未去除的包結構,右邊是去除 com. 之後的:
如excludelib/libs/exampleJAR.jar:
(1)將需要排除的aar或者jar包放在excludelib/libs下。
(2)更改excludelib/build.gradle
(3)設置排除規則 如果您需要排除aar,那麼請更改excludelib/excludeAar.gradle;如果您需要排除jar,那麼請更改excludelib/excludeJar.gradle
(4)運行排橡頌除任務
排除後生成的aar在excludelib/build/excludeaar下,排除後生成的jar位於excludelib/build/excludejar。
然後就可以愉快的使用啦~
aar排除步驟:
1、獲取到需要排除的原始AAR包
2、解壓AAR包(zipTree配合Task Copy)
3、解壓AAR包中的class.jar(zipTree配合Task Copy)
4、按照排除規則對解壓的class.jar重新打包(Task Jar)
5、重新打包成AAR包(Task Zip)
jar排除步驟
1、獲取到需要排除的原始jar包
2、解壓jar包(zipTree配合Task Copy)
3、按照排除規則對解壓的jar重新打包(Task Jar)
主要原理:zipTree配合Copy,實現解壓。
Copy Task官方講解: https://docs.gradle.org/current/dsl/org.gradle.api.tasks.Copy.html
ziptree源碼主要解析:創建一個新的file tree包含原來zip的內容,可以配合Copy實現梁亮鄭解壓。
這個步驟就是把之前解壓的classes.jar文件,按照排除規則用Task Jar重新打包成jar文件。
Task Jar官方講解: https://docs.gradle.org/current/dsl/org.gradle.jvm.tasks.Jar.html
對classes.jar處理完成的aar重打包,主要用到Task Zip。
Task Zip官方講解: https://docs.gradle.org/current/dsl/org.gradle.api.tasks.bundling.Zip.html
原文鏈接
感謝Siy: https://blog.csdn.net/_34012226/article/details/80104771
B. android studio 怎麼打aar包
1.aar包是android studio下打包android工程中src、res、lib後生成的aar文件,aar包導入其他android studio 工程後,其他工程可以方便引用源碼和資源文件
2.生成aar包步驟:
①.用android studio打開一個工程,然後新建一個Mole,新建Mole時候選擇Android Library,後面按新建普通工程操作
3.其他androidstudio工程引用aar包
①.將aar包復制到lib目錄下
②.配置build.gradle文件:
加入
repositories {
flatDir {
dirs 'libs'
}
compile(name:'camerascan-1.0', ext:'aar')
完整的配置文件:
詳細教程詳細教程
C. 打包成aar的工程有第三方jar包,生成aar後,裡面的jar無法引用,怎麼解決
首先說明我使用的android studio
版本是0.4.因為現在android studio的bug還不較多,所以你的版本能不能正常使用我就不敢說了。
如果你只是單純的想使用actionbarsherlock的話,引用是十分簡單的dependencies {
// compile fileTree(dir: 'libs', include: '*.aar')
compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'
compile 'com.android.support:support-v4:18.0.+'
}
不過官方也出了一個兼容包,也非常的不錯。so 沒必要非得要使用actionbarsherlock。
然後重新編譯一下項目就行了。(ps
引用第三方jar包,請看我的第一行注釋,你只要新建一個libs的文件夾,然後把想要jar包復制到文件夾下,接著把注釋那句復制到build文件中,修改一下(*.aar
-> *.jar)就可以了)。
但是我們要是使用本地的自定義的aar文件,請看我的實現過程,如果你有更好的請轉告小弟共同進步
第一步 :生成aar文件
我的方法是通過maven-android-plugin來生成的,如果你使用過actionbarsherlock以前的版本的話,這個工具應該不陌生,如果你連maven
都不知道的話,建議好好學習一下maven,雖然現在gradle很火 ,但是我還是最喜歡maven。
關於具體生成步驟不久不詳細說了,文章最後貼出幾個網址供大家學習使用,放心我按順序給你們,只要一步一步的來絕對能成功
1 把你的maven版本提升到3.1.1
2 去github上clone下來
maven-android-sdk-deployer 這個項目
3 通過maven-android-plugin生成一個android項目
mvn archetype:generate \
-DarchetypeArtifactId=android-quickstart \
-DarchetypeGroupId=de.akquinet.android.archetypes \
-DarchetypeVersion=1.0.11 \
-DgroupId=your.company \
-DartifactId=my-android-application
D. 將aar打包進so
前段時間有個項目,需要用c++開發我們自己的sdk,另外,我們的sdk又依賴於另一個aar包,當時想當然的以為生成so的時候會一起把aar打包進去,結果發現調用so的時候,aar裡面的類根本找不到,說明aar 並沒有一培鋒困起打包進so
後來想了下,既然將aar打包進so沒法實現,不如把我自己的so庫,還有第三方的aar再重新打一次,最終打成aar包,這樣就方便多了。步驟如下:
先在原來測試我們自己so庫的測試工程上新建一個moudle:配念
下面將上圖中的classes.jar還有lib下面的jar包拷貝到新建的mole下的libs目錄,並將剩餘的jni,AndroidManifest.xml等文件分別拷貝合並到對應的目錄內
5.下面就是要把我們aar拆出來的零件以及我們自己的so庫基橘重新打包成aar:
工程右側,找到Gradle,點開後找到我們上面新建的mole,點擊Tasks->build->assemble
等構建完成後,aar就生成了,生成目錄在我們的moudle目錄下面的:
build->outputs->aar下面
okay
E. 升級androidx 報錯bug
1、在項目的 gradle.properties 文件中配置如下
2、引入
https://blog.csdn.net/qq_24382363/article/details/87285438
這時候會提示上述錯誤,宏罩含因為sdk採用了更加嚴格的aapt編譯,正確的用法如下
如果字元串含有%,而不需要格式化可以有三種蔽笑方法解決
這個錯誤是引悶族用的兩個包中的屬性名稱沖突導致
忽略已存在的框架
jar 包
aar
那 直接 去aar 中刪除itemIconTint
解壓aar文件到tmpDir目錄下
修改後 將tmpDir重新打包成一個新的aar
https://www.jianshu.com/p/f0a267551493
F. Android:多aar打包
我使用的是網上這個 https://github.com/kezong/fat-aar-android
這個github庫。
具體配置是再跟gradle中添加:
classpath 'com.kezong:fat-aar:1.2.7'
在需要打包的地方添加:
apply plugin: 'com.kezong.fat-aar'
然後添加需要合並的包,可以是遠程包,本地aar,本地project。可以說很完整了。
例如:
怎麼看遠程依賴呢?下面這里就可以看
最後生成的aar包如下,jni和jar包都有了
反編譯看看classes.jar看看,本地項目的類都在這裡面了。
後面得看看是怎麼打包起來的了,不然後續作者不維護了就蛋疼了。
G. 終極方案:快速解決Android項目依賴沖突
沖突類型無非是類、jar包重復,比如:
在此不多做介紹了,直接上解決方案
1、配置顯示沖突依賴詳細信息
2、編譯,查看控制台詳細輸出
1、project依賴排除示例
2、遠程依賴排除示例
參考鏈接:如何exclude aar包中的某個jar包
核心:
① 解壓aar文件到tmpDir目錄下
② 找到classes.jar包,用壓縮工具打開,刪除目標文件
③ 將tmpDir重新打包成一個新的aar
H. AndroidStudio 打包 Android項目 成 aar
· 打包 Android項目成 aar,有兩種方式:
接下來分別列舉說明
1.1 點擊 File —> New —> New Mole... ,選擇 「Android Library」 , 最後點擊 「Finish」 創建 mole Library。
1.2 編寫需要打包成 aar 的庫亂碧文件,例如:我測試寫團態的 TestUtils 類
1.4 點擊 assemble 之後編譯完成,bulid->outputs->aar文件夾下會生成「正式」和「測試」aar包。
2.1 修改需要打包的mole項目下的 build.gradle 文件,然後點擊 「Sync Now」同步下
2.2 修改需要打包的mole項目下的 AndroidManifest.xml 清單文件
2.4 點擊 assemble 之後編譯完成,bulid->outputs->aar文件夾下會生成「正式」和「測試」aar包塌陪源
I. 如何將android studio 打包aar
將 Mole 配置為 library 後,構建輸出一個 aar 文件,根據渠道和 BuildType 的不同,在相應的目錄下可以找到。比如對 BuildType 為 debug 的配置,輸出為:[MoleName]/build/outputs/aar/[MoleName]-debug.aar。一份 aar 文件其實就是一份 zip 包,和 jar 不同橡祥的是,它將一些資源文件、第三方庫文件、so 文件等等都打包在內,而代碼文件編譯後壓縮在在 classes.jar 中。比如:
3、導入 aar 的方式引用
這種方式比較簡單,打開 Project Structure,添加一個新 Mole,然後選擇 Import *.JAR or *.AAR Package 的方式導入:
導入後,在你的工程下面,會生成一個文件夾,裡面是 aar 文件以及 Android Studio 的配置文梁物搏件。
接著可以螞衫在 gradle 中配置依賴了,其他 Mole 可以引用這個 Mole 了,依賴方式使用compile project 的方式即可。
缺點:被依賴的 aar 無法 F3 跟進去,無法看到資源文件內容以及目錄層級等等缺陷。
4、使用配置依賴的方式引用
gradle 其實還有另一種依賴可以引用 aar:
compile(name: 'xxx', ext: 'aar')。
首先需要將 aar 文件放入引用 Mole 的 libs 目錄下,和一般的 jar 文件類似。然後在 gradle 配置文件中把 libs 目錄加入依賴:
repositories {
flatDir {
dirs 'libs'
}
}
接著在 gradle 的依賴配置中加入 compile(name: 'xxx', ext: 'aar') 這一句,依賴即可關聯完畢。構建一下工程,在 Mole 的 build/intermediates/exploded-aar 目錄下,可以看到有一些臨時文件生成:
看起來完全是引用 aar 的解壓版本。Android Studio 安裝反編譯插件後,可以通過 F3 跟進到 class 文件裡面,如果你有被依賴 Mole 的源代碼的話,還可以 Attach Source 關聯源代碼查看。另外,可以很方便的查看 aar 中的資源文件。
另外,這種依賴方式更新 aar 後,生成的臨時文件也會隨之變動,不用擔心改動不同步的問題。
5、總結
綜上,介紹了 aar 文件的生成方式,以及兩種 aar 依賴的方式,經過實戰檢驗,第二種通過配置 gradle 依賴的方式簡單易用,只需一行代碼即可搞定。