在 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)