有時候我們要把一個app的核心代碼作爲一個公共的庫,用在公司的各種不同的app中,最笨的方式可能就是把當前的代碼copy一份,然後在此基礎上做業務修改,但是爲了更好的拓展和保持原有業務不變,可以將application改造成library,library編譯後的產物.aar可以發佈到倉庫供多個項目使用,下面我們就說一下簡單的改造
一般我們改造分爲四個步驟
- 打開app目錄下 build.gradle 文件,注意不是項目全局的build.gradle,我發現好多人對這個區分不開,大概是沒有學習過gralde的項目管理基礎吧
- 找到
defaultConfig
刪除applicationId
。只有 Android 應用才能定義applicationId
,不然編譯會報錯的 - 在文件的頂部(一般都是第一行)將
apply plugin: 'com.android.application'
修改爲apply plugin: 'com.android.library'
- 保存文件,然後依次點擊
File > Sync Project with Gradle Files
。大功告成。模塊的整個結構仍然相同,但是現在它會作爲Android library
運行,編譯現在也會創建AAR
文件,而不是APK
。如果您想要編譯AAR
文件,請在Project
窗口中選擇要編譯的庫模塊,然後依次點擊Build >Make Module my-library-module
或者用gradle生成aar。
特殊注意事項
- 在將將application改成library後,如果涉及到
View
的onClick
事件多分支選擇的,不能使用switch (view.getId()){...}
作爲邏輯處理,必須使用if--else if---else
的形式,不然編譯會報錯
將庫添加爲依賴項
方法一、圖形界面操作
- 添加已編譯的 AAR(或 JAR)文件到項目(庫必須已編譯):
a. 依次點擊File > New > New Module
。
b. 點擊Import .JAR/.AAR Package
,然後點擊Next
。
c. 輸入已編譯的AAR 或 JAR
文件的路勁位置,然後點擊Finish
。 - 將
library Module
導入到您的項目(庫源代碼會成爲項目的一部分):
a. 依次點擊File > New > Import Module
。
b. 輸入庫模塊目錄的位置,然後點擊Finish
。
方法二、Gradle腳本導入(個人喜歡這個)
- 添加已編譯的 AAR(或 JAR)文件到項目(庫必須已編譯):
a、一般都是將生成的AAR(或 JAR)放到 libs目錄下 ,如:lib/my-library-module-release.aar
b、在gradle的dependencies{...}
節點下配置
dependencies { implementation(name: 'my-library-module-release', ext: 'aar')}
如果是jar包就直接 implementation fileTree(dir: 'libs', include: ['*.jar'])
,這行配置可以引入libs下所有的jar包,當然你也可以引入個別的jarimplementation file('libs/my-lib-module-release.jar');
- 將
library Module
導入到您的項目(庫源代碼會成爲項目的一部分):
a. 確保my-library-module和 app
在同一級目錄
b. 然後在 settings.gradle 中進行配置include ':app', ':my-library-module'
c. 打開app的 build.gradle 文件,然後添加dependencies
d.點擊Sync Project with Gradle Files
dependencies {implementation project(":my-library-module") }
以上爲基本用法,要是有定製化的變體,可以使用 buildVariantName
+Implementation的形式,而不是 implementation。例如,如果只想在“pro”產品中包含此庫,其他項目中用不到這個庫裏面的內容,避免影響打包的編譯速度
android{
...
productFlavors {
pro { ... }
other{...}
}
}
dependencies {
proImplementation project(":my-library-module")
}
我們也可以在app目錄下創建一個專門存放aar文件的目錄,如aars
- 這樣我們需要在gradle中通過以下腳本進行指定該目錄才能使用
repositories { flatDir { dirs 'aars' } }
將庫添加爲依賴項後在打包的時候經常會出現資源合併衝突
1、資源id經可能用該庫爲前綴或者後綴,有一定特色的命名,避免在values.xml合併的時候報錯
2、AndroidManifest.xml
合併的時候也會報錯,比如android:name,android:icon,android:label,android:theme
等屬性衝突,可以在應用的AndroidManifest.xml
的 application
節點加入以下代碼解決,多個屬性之間用逗號隔開
<application tools:replace="android:theme,android:label,android:allowBackup,android:icon">
查看AndroidManifest.xml
報錯日誌可以參考 Android studio各種gradle報錯解決方案彙總
學習更多的合併衝突請看官方文檔 合併多個清單文件
最後建議大家學習一下gralde 基礎語法,弄清楚project
和tast
的;不要只知道在 dependencies {...}
加入依賴,結果gradle一報錯自己就慌了