3.4 管理項目 - 創建Android庫

文章來源:Google

本文內容

  • 創建庫模塊
  • 以依賴項形式添加您的庫
  • 選擇要設為公開的資源
  • 開發注意事項
  • AAR 文件詳解

Android 庫在結構上與 Android 應用模塊相同。它可以提供構建應用所需的一切內容,包括源代碼、資源文件和 Android 清單。不過,Android 庫將編譯到您可以用作 Android 應用模塊依賴項的 Android 歸檔 (AAR) 文件,而不是在設備上運行的 APK。與 JAR 文件不同,AAR 文件可以包含 Android 資源和一個清單文件,這樣,除了 Java 類與方法外,您還可以捆綁布局和可繪制對象等共享資源。

庫模塊在以下情況下非常有用:

  • 構建使用某些相同組件(例如 Activity、服務或 UI 布局)的多個應用。
  • 構建存在多個 APK 變體(例如免費版本和付費版本)的應用并且需要在兩種版本中使用相同的核心組件。

在任何一種情況下,只需要將您希望重用的文件移動到庫模塊中,然后以依賴項的形式為每個應用模塊添加庫。本頁面將說明如何執行這兩個操作。

創建庫模塊


要在您的項目中創建一個新的庫模塊,請按以下步驟操作:

  1. 點擊 File > New > New Module

  2. 在出現的 Create New Module 窗口中,依次點擊 Android LibraryNext

    還存在一個用于創建 Java 庫的選項,可以構建傳統的 JAR 文件。盡管 JAR 文件在大多數項目中都非常實用(尤其在您希望與其他平臺共享代碼時),但這種文件不允許您包含 Android 資源或清單文件,而后者對于 Android 項目中的代碼重用非常有用。因此,本指南將側重論述創建 Android 庫。

  3. 為您的庫命名,并為庫中代碼選擇一個最低的 SDK 版本,然后點擊 Finish

在 Gradle 項目同步完成后,庫模塊將顯示左側的 Project 面板中。如果您未看到新模塊文件夾,請確保將視圖切換為 Android 視圖

將應用模塊轉換為庫模塊

如果您現有的應用模塊包含您希望重用的所有代碼,則可以按照以下步驟將其轉換為庫模塊:

  1. 打開現有應用模塊的 build.gradle 文件。您應在頂部看到以下內容:

    apply plugin: 'com.android.application'
    
  2. 按照下面所示更改插件分配:

    apply plugin: 'com.android.library'
    
  3. 點擊 Sync Project with Gradle Files

就這么簡單。模塊的整個結構仍然相同,但是現在它將作為 Android 庫運行,構建也將創建一個 AAR 文件,而不是 APK。

以依賴項形式添加您的庫


要在另一個應用模塊中使用您的 Android 庫的代碼,請按以下步驟操作:

  1. 通過兩種方式之一將庫添加到您的項目(如果您是在相同項目中創建的庫模塊,則該模塊已經存在,您可以跳過此步驟):

    • 添加已編譯的 AAR(或 JAR)文件:

      1. 點擊 File > New Module
      2. 依次點擊 Import .JAR/.AAR PackageNext
      3. 輸入 AAR 或 JAR 文件的位置,然后點擊 Finish
    • 將庫模塊導入到您的項目中:

      1. 點擊 File > New > Import Module
      2. 輸入庫模塊目錄的位置,然后點擊 Finish

      庫模塊將復制到您的項目中,因此您可以盡管編輯庫代碼。如果您希望維護一個版本的庫代碼,則此方法可能不是您想要的,您應按照上文所述導入編譯的 AAR 文件。

  2. 確保庫列在您 settings.gradle 文件的頂部,如下面名為“my-library-module”的庫所示:

    include ':app', ':my-library-module'
    
  3. 打開應用模塊的 build.gradle 文件,并向 dependencies 塊中添加一行新代碼,如下面的片段所示:

    dependencies {
       compile project(":my-library-module")
    }
    
  4. 點擊 Sync Project with Gradle Files

在上面的示例中,名為 my-library- module 的 Android 庫模塊成為 build.gradle 文件所在模塊的構建依賴項。

您的應用模塊現在可以訪問 Android 庫中的任何代碼和資源,庫 AAR 文件在構建時已捆綁到您的 APK 中。

不過,如果希望單獨共享 AAR 文件,則可以在 項目名稱/模塊名稱/build/outputs/aar/ 中找到它,也可以通過點擊 Build > Make Project 的方式重新生成此文件。

選擇要設為公開的資源


庫中的所有資源在默認情況下均處于公開狀態。要將所有資源隱式設為私有,您必須至少將一個特定的屬性定義為公開。資源包括您項目的 res/ 目錄中的所有文件,例如圖像。要阻止您的庫用戶訪問僅供內部使用的資源,您應通過聲明一個或多個公開資源的方式來使用這種自動私有標識機制。

要刪除某個公開資源,請將一個 聲明添加到您的庫的 public.xml 文件中。如果您之前尚未添加公開資源,則需要在您的庫的 res/values/ 目錄中創建 public.xml 文件。

下面的示例代碼可以創建兩個名稱分別為 mylib_app_namemylib_public_string 的公開字符串資源:

<resources>
   <public name="mylib_app_name" type="string"/>
   <public name="mylib_public_string" type="string"/>
</resources>

如果希望任何資源保持對使用您的庫的開發者可見,您應當將其設為公開。例如,盡管 v7 appcompat 庫中的大多數資源都是私有資源,但是為了支持 Material Design,控制工具欄小部件的屬性應當公開。

將屬性隱式設為私有不僅可以阻止您的庫用戶從內部庫資源獲得代碼自動完成建議,還讓您能夠在不中斷您的庫客戶端的情況下重命名或移除私有資源。私有資源不在代碼自動完成和 Theme Editor 的作用范圍內,并且如果您嘗試引用私有資源,Lint 將顯示警告。

開發注意事項


在開發您的庫模塊和相關應用時,請注意以下行為和限制。

將庫模塊引用添加至您的 Android 應用模塊后,您可以設置它們的相對優先級。構建時,庫會按照一次一個的方式與應用合并,并按照從低到高的優先級順序。

  • 資源合并沖突

    構建工具會將庫模塊中的資源與相關應用模塊的資源合并。如果在兩個模塊中均定義了給定資源 ID,將使用應用中的資源。

    如果多個 AAR 庫之間發生沖突,將使用依賴項列表首先列出(位于 dependencies 塊頂部)的庫中的資源。

    為了避免常用資源 ID 的資源沖突,請使用在模塊(或在所有項目模塊)中具有唯一性的前綴或其他一致的命名方案。

  • 庫模塊可以包含 JAR 庫

    您可以開發一個自身包含 JAR 庫的庫模塊;不過,您需要手動編輯相關應用模塊的構建路徑,并添加 JAR 文件的路徑。

  • 庫模塊可以依賴外部 JAR 庫

    您可以開發一個依賴于外部庫(例如 Maps 外部庫)的庫模塊。在這種情況下,相關應用必須針對包含外部庫(例如 Google API 插件)的目標構建。另外也要注意,庫模塊和相關應用都必須在其清單文件的 <uses- library> 元素中聲明外部庫。

  • 庫模塊不得包含原始資源

    工具不支持在庫模塊中使用原始資源文件(保存在 assets/ 目錄中)。應用使用的任何原始資源都必須存儲在應用模塊自身的 assets/ 目錄中。

  • 應用模塊的 minSdkVersion 必須大于或等于庫定義的版本

    庫作為相關應用模塊的一部分編譯,因此,庫模塊中使用的 API 必須與應用模塊支持的平臺版本兼容。

  • 每個庫模塊都會創建自己的 R 類

    在您構建相關應用模塊時,庫模塊將先編譯到 AAR 文件中,然后再添加到應用模塊中。因此,每個庫都有其自己的 R 類,并根據庫的軟件包名稱命名。從主模塊和庫模塊生成的 R 類會在所需的所有軟件包(包括主模塊的軟件包和庫的軟件包)中創建。

  • 庫模塊可能包含自己的 ProGuard 配置文件

    通過將 ProGuard 配置文件添加到包含其 ProGuard 指令的庫,您可以在自己的庫上啟用代碼壓縮。構建工具會為庫模塊將此文件嵌入到生成的 AAR 文件中。在您將庫添加到應用模塊時,庫的 ProGuard 文件將附加至應用模塊的 ProGuard 配置文件 (proguard.txt)。

    通過將 ProGuard 文件嵌入到您的庫模塊中,您可以確保依賴于此庫的應用模塊不必手動更新其 ProGuard 文件即可使用庫。當 ProGuard 在 Android 應用模塊上運行時,它會同時使用來自應用模塊和庫的指令,因此您不應當只在庫上運行 ProGuard。

    要指定您的庫的配置文件名稱,請將其添加到 consumerProguardFiles 方法中,此方法位于您的庫的 build.gradle 文件的 defaultConfig 塊內。例如,以下片段會將 lib-proguard-rules.txt 設置為庫的 ProGuard 配置文件:

android {
    defaultConfig {
        consumerProguardFiles 'lib-proguard-rules.txt'
    }
    ...
}

默認情況下,應用模塊會使用庫的發布構建,即使在使用應用模塊的調試構建類型時亦是如此。要使用庫中不同的構建類型,您必須將依賴項添加到應用的 build.gradle 文件的 dependencies 塊中,并在庫的 build.gradle 文件中將 publishNonDefault 設置為 true。例如,您應用的 build.gradle文件中的以下代碼段會使應用在應用模塊于調試模式下構建時使用庫的調試構建類型,以及在應用模塊于發布模式下構建時使用庫的發布構建類型:

dependencies {
    debugCompile project(path: ':library', configuration: 'debug')
    releaseCompile project(path: ':library', configuration: 'release')
}

您還必須在自己庫的 build.gradle 文件的 android 塊內添加以下代碼行,以便將此庫的非發布配置展示給使用它的項目:

android {
    ...
    publishNonDefault true
}

不過請注意,設置 publishNonDefault 會增加構建時間。

為了確保您的庫的 ProGuard 規則不會將意外的壓縮副作用施加到應用模塊,請僅包含適當規則,停用不適用于此庫的 ProGuard 功能。嘗試協助開發者的規則可能會與應用模塊或它的其他庫中的現有代碼沖突,因此不應包含這些規則。例如,您的庫的 ProGuard 文件可以指定在應用模塊的壓縮期間需要保留的代碼

Jack 工具鏈僅支持 ProGuard 的部分壓縮和模糊選項。

AAR 文件詳解


AAR 文件的文件擴展名為 .aar,Maven 工件類型也應當是 aar。文件本身是一個包含以下強制性條目的 zip 文件:

  • /AndroidManifest.xml
  • /classes.jar
  • /res/
  • /R.txt

此外,AAR 文件可能包含以下可選條目中的一個或多個:

  • /assets/
  • /libs/名稱.jar
  • /jni/abi 名稱/名稱.so(abi 名稱是 Android 支持的 ABI 之一)
  • /proguard.txt
  • /lint.jar
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373