原文地址:https://developer.android.com/studio/projects/android-library.html
一個Android Library 與一個Android App模塊的結構相同.它可以包含創建一個App所需要的一切,包括源代碼,資源文件,和一個Android manifest.然而不同的是,一個app編譯成一個運行在設備上的APK, 一個Android Library編譯成一個Android Archive (AAR),作為Android App模塊依賴.
一個Library模塊在下面情況下有用:
1. 當你創建多個APP時,用到一些相同的組件,如activities, sevices或者UI layouts.
2. 當你創建的一個APP存在多個APK版本,例如一個免費的和付費的版本,都需要相同的核心組件.
在這些情況下,簡單地移動你想再利用的文件到一個Library模塊,然后添加這個library作為App模塊的依賴.這篇文章教你怎樣做:
創建一個Library模塊
1. 點擊File > New > New Module.
2.在Create New Module窗口中,點擊Android Library,然后點擊Next.
創建一個Java Library, 它構建了一個傳統的JAR文件. 一個JAR文件對許多工程有用,特別當你想在不同的平臺分享代碼,它不讓你劊子手Android資源和manifest文件,這個對Android工程中的代碼復用非常有用.所以這個引導注重創建Android Libraries.
3. 給你的Library命名并選擇一個最小的SDK版本, 然后點擊Finish.
一旦Gradle 工程同步完成, library模塊將出現在左邊的工程面板中.如果你不想看到新的模塊文件,確保它在顯示Android view.
將App模塊轉換成Library模塊
1.打開一個存在的App模塊的build.gradle文件,在文件的上面,你可以看到:
apply plugin:'com.android.application'
2. 改變如下:
apply plugin:'com.android.library'
3. 點擊Sync Project with Gradle Files.
這樣就好了.這個模塊的整個結構保持相同, 但它現在作為一個Android library, 編譯將會創建一個AAR文件而不是一個APK文件.
添加你的Library作為一個依賴
將你的Android Library代碼用到另外一個App模塊,過程如下:
1. 將Library添加到工程有2種方法(如果Library模塊在同一個工程中,你可以跳過這步)
方法1: 添加編譯的AAR(或者JAR)文件:
點擊File > New Module.
點擊Import .JAR/.AAR Package, 然后點擊Next.
寫入AAR或者JAR文件的位置,然后點擊Finish.
方法2: 工程中導入Library模塊
點擊File > New > Import Module.
寫入Library模塊文件的位置,然后點擊Finish.
Library模塊已經挎入到你的工程, 你能夠編輯Library的代碼.如果你相保持Library代碼一個版本,那么這個可能不是你想要的,你應該導入編譯好的AAR文件.
2. 確保你的Library列在settings.gradle文件的上面.如這兒如示,一個Library名字為?"my-library-module":
include':app',':my-library-module'
3. 打開app模塊的build.gradle文件, 在dependencies中添加:
dependencies{
compile project(":my-library-module")
}
4. 點擊Sync Project with Gradle Files.
在上面的這個例子中,Android library模塊命名為my-library-module,成為了build.gradle文件所在模塊的依賴.
現在可以在你的App模塊中獲得任何Android library的代碼和資源, 在編譯的時候AAR文件綁定到你的APK.
然而,如果你想單獨地分享你的AAR文件,你能在project-name/module-name/build/outputs/aar/找到它, 你可以重新產生它通過點擊Build > Make Project.
開發考慮
當你開發你的library模塊和依賴的App,你應該意識到下面這些行為和限制:
一旦你將library模塊引用到你的Android app模塊,你能設置它們相關的優先權.在創建的時候,library同時與App的內容合并,開始從最低優先級到最高.
1. 資源合并沖突
構建工具從一個library模塊和這些依賴的app模塊中合并資源.如果給定的資源ID在這兩個模塊中定義, app的資源將會被利用.
如果沖突發生在多個AAR library中,則使用從依賴列表中先列出的library的資源.
為了避免相同ID資源的沖突,考慮用一個前綴或者其它一致的命名方案,該方案是唯一的模塊(或者在所有項目中是唯一的)
2.一個library模塊可以包含一個JAR library
你可以開發一個library模塊它自身包含一個JAR library; 然而,你需要手動編輯相關的應用模塊的構建路徑,并添加到JAR文件的路徑。
3. 一個library模塊可以依賴一個外部的JAR library
你可以開發一個library模塊依賴一個外部library.(例如, Maps外部library).這種情況下,依賴應用程序必須建立針對外部library的目標(例如,Google APIs Add-On). library模塊和依賴的app必須在它們的manifest文件中聲明外部library, 在<uses-library>元素中.
4. library模塊不能包括原始的assets
這些工具在library模塊中不支持原始的asset文件的用法(保存在assets/文件夾中).任何asset資源都被一個app存儲在自己模塊的assets/文件夾中.
5. app模塊的最小sdk版本必須等于或者大于library中定義的版本.
一個library作為依賴的app模塊的一部分被編譯, 所以library模塊所用的APIs必須和app模塊所支持的平臺版本相匹配.
6.每個library模塊創建它自己的R類
當你創建一個依賴的app模塊, library模塊被編譯成一個AAR文件然后添加到app模塊.因此,每個library有它自己的R類,通過library的包名來命名.從主模塊生成R類和需要包括主模塊包和libraries包的所有包所創建的library模塊.