Android SDK 組件化 AAR 打包集成

在 Android 開發過程中,有些功能是通用的,或者是多個業務方都需要使用的。爲了統一功能邏輯及避免重複開發,因此將該功能開發成一個 SDK 是相當有必要的。

那麼SDK呈現的方式,都有那些呢? 答:.so、.jar、*.aar、module。

其中,.so是C或C++語言的內容打包成的庫,由於本項目是java語言,所以本文不探究so。

一、JAR

JAR(Java Archive,Java 歸檔文件)是與平臺無關的文件格式,它允許將許多文件組合成一個壓縮文件。 只包含了class文件與清單文件 ,不包含資源文件,如圖片等所有res中的文件。

jar的優點:安全性、減少下載時間、傳輸平臺擴展、包密封、包版本控制、可移植性。

jar的缺點:打jar包時,項目裏的res文件是用不了的,若想用圖片文件,可以將圖片文件放進assets文件裏面打進jar包再進行調用,但必須注意jar裏面assets文件夾裏面的文件不能和調用項目裏面assets文件夾裏面的文件重名。

使用jar方式:拷貝到:libs目錄, 添加到build.gradle配置文件中,重新編譯一次項目既可完成加載。使用時注意混淆問題。

打包jar包的相關資料:《Android Studio 使用gradle導出jar包》

二、AAR

AAR是Android庫項目的二進制歸檔文件,包含所有資源,class以及res資源文件。將aar解壓(後綴改爲.zip,再解壓文件)打開後,可以看到每個aar解壓後的內容可能不完全一樣,但是都會包含AndroidManifest.xml,classes.jar,res,R.txt。

提供aar的sdk的方式的優缺點:

優點:只需引入一個文件,繼承簡單。

缺點:如果aar的包需要其他依賴庫的時候,如果沒依賴進去,會提示 java.lang.NoClassDefFoundError 錯誤。這是因爲在打arr包的時候,只是將module內部的代碼及資源打包進去了,並沒有將第三方依賴也打包進去。

打包aar文件的相關資料:
《Android Studio 打包 aar》:https://www.jianshu.com/p/baa7976cec09
《AndroidStudio封裝SDK的那些事》:https://www.cnblogs.com/endv/p/13823913.html

打aar包時,需要注意混淆問題及第三方庫依賴問題。

aar在build.gradle 配置方式爲:

repositories {
     flatDir {
           dirs'libs'
     }
}

dependencies {
     implementation(name:'genius', ext:'aar')
}

因爲aar不會傳遞第三方依賴,在依賴aark時,如果碰到第三方依賴庫問題,一般只需要將arr依賴的第三方庫再引入一遍,程序就不報錯了。如果在更新aar的時候,發現本地External Library的aar文件中還是之前版本的內容,這時候可以通過下面的命令強制刷新:

./gradlew build --refresh-dependencies

在本文的後面,我們會講解一下,如何將多個aar文件合併到一起,這樣能在一定程度上避免第三方依賴問題。

三、Module

module一般是模塊功能代碼,這種提供sdk的方式,一般是將核心的jar包、aar包進行更進一步的邏輯封裝,然後將整個Demo級別的功能代碼提供給別人。

提供moudule的sdk的方式的優缺點爲:

優點:集成非常簡單,只要測試沒問題,一般別人都能夠直接拿過來使用,並且能夠在Demo的基礎上,根據需求調整部分功能。

缺點:後續更新,可能需要代碼的全量替換。

這種提供方式,應該是最簡單的集成方案,這裏就不過多對此進行說明了。

四、Fat—AAR

Fat—AAR出現的核心需求就是:在打包AAR時,將其需要的AAR打入同一個AAR包。

解決這個需求,涉及到三點:

如何確認需要合併的module?
確定需要合併的module後,如何找到相應的文件路徑?
不同的文件在Gradle Tasks中的哪個位置插入?
這裏根據:https://github.com/kezong/fat-aar-android 開源項目來理解一下。

通過 embed 來確認需要add 的 dependency,這樣就能將需要合併的關聯起來了。

確認需要合併的module後,如何找到路徑?

答:build一個aar的適合會在各個module下生成一個build文件夾,和aar關聯的文件夾是exploded-aar,裏面的代碼結構和我們直接打開aar的時候基本一致。

這樣,路徑問題我們就解決了。

不同的文件在Gradle Tasks中的哪個位置插入? fat-aar是這樣做的,通過不同的task之間的dependsOn ,mustRunAfter 這種方式來插入自定義的task。

參考Demo:https://github.com/renhui/Fat-AAR-Demo (使用Fat-AAR SDK版本:1.3.5)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章