天天看點

AndroidStudio中打包嵌套第三方aar的aar

之前寫過一個如何打包嵌套第三方jar包的jar包,現在又搞了一把aar,齊活了。。。

一、需求說明

開發過程中需要将自己開發的項目Screen(包含資源檔案)以aar的形式提供給同僚,但是打包的時候會發現,Screen項目中依賴的Weather.aar中的代碼并沒有一塊打包進來。。。

解決這個問題,我使用的是fat-aar工具,參考部落格圖解使用fat-aar方式在AndroidStudio中打包嵌套第三方aar的aar,部落格很詳細。主要步驟如下:

1、Screen代碼庫app下的build.gradle中加入:

apply plugin: 'com.android.library'
apply plugin: 'com.kezong.fat-aar'//添加fat-aar
           

2、Screen代碼庫app下的build.gradle中,将下面的dependencies中aar導入代碼修改下:

//implementation files ('Weather-release.aar')
embed (name:'Weather-release',ext:'aar')
           

3、Screen整個項目下的build.gradle檔案中,添加fat-aar classpath和flatDir:

buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.3'
        // 配置fat包依賴
        classpath 'com.github.kezong:fat-aar:1.3.6' 
    }
}

allprojects {
    repositories {
        //配置fat包依賴
        flatDir{
            dirs 'libs'
        }
        google()
        jcenter()        
    }
} 
           

4、R檔案合并問題:

此時Weather-release.aar代碼在Screen項目打包的時候都會包含在内,但是此時如果調用到的Weather包中的資源檔案會報錯,提示找不到,這個問題是參考Android 多 Module 合并打包 AAR這個文章提到的R檔案合并問題。

問題原因:

R 檔案合并問題:如果打包子產品和依賴的子產品中都存在資源檔案,也就是存在 R 檔案的引用,這是需要注意 R 檔案合并的問題。因為一個 ARR 包隻會存在一個 R 檔案,使用 fat-aar 打包時會把依賴子產品中的 R 檔案進行合并,但是因為原先子產品中導入的 R 檔案包名還是之前的子產品的,是以會存在找不到 R 檔案的錯誤。

問題解決方案:

R 檔案是根據 AndroidManifest.xml 檔案的 package 字段内容來生成的對應包名的,比如 module 中 AndroidManifest.xml 的 package 指定為 com.xx.xxx 時,那麼該 module 内的 R 檔案導包就是:import com.xx.xxx.R 了。我們可以利用這一點,把所有需要打包的 module 的 package name 改成統一的名稱,這樣的話,所有 R 檔案導包就變成一緻的了,就算合并後的 AAR 中隻存在一個 R 檔案也不會存在找不到的問題。

為了避免不同子產品使用相同包名導緻的編譯失敗的問題,我們可以使用 enforceUniquePackageName = false 配置各個 module 的 build.gradle 檔案,這樣可以不強制各 module 使用唯一包名。

我的做法是引用R檔案的地方改了下包名。改成了Weather項目中的包名解決這個問題。

5、打包aar時把依賴的jar打包進aar中

如果打包aar項目時,還想把項目中引入的jar包一塊打包,需要在app下的build.gradle中使用如下方式導入,參考打包aar時把依賴的jar打包進aar中這篇文章。

//C方法
dependencies {
    ……
    implementation files ('libs/fastjson-1.1.71.android.jar')
}
           

6、aar修改後,例如新加了代碼和包,但是aar複制替換後測試,找不到新加的類:

原因:緩存中還是原來aar的代碼,新的沒有替換進去。

解決方法1:

File->Sync Project with Gradle Files重新加載下

解決方法2:

app/gradle中配置引用libs下sdk的時候,按如下方式:

implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'])
           

下次再更新aar包的時候,改個名稱替換進去,最好每次aar包都能帶個版本号,這樣每次替換都是新的版本,名字不會重複。

如果看完這篇你還是沒明白或者打包過程中出現其他問題,可以去參考下如下幾篇文章,可能會有所啟發。

參考文章:

【填坑往事】圖解使用fat-aar方式在AndroidStudio中打包嵌套第三方aar的aar

Android 多 Module 合并打包 AAR

打包aar時把依賴的jar打包進aar中

ANDROID STUDIO 生成AAR和引用AAR

問題解決:Android Studio aar 導入後找不到類