Android library ****結(jié)構(gòu)上和****Android app ****的****module****是一樣的。他可以包含所有的可以在****app****中構(gòu)建的東西允乐,包括**** ****資源代碼**** ****資源文件**** ****或者****Android manifest ****清單文件篓吁。不同的是茫因,****app****會編譯成****ask****運(yùn)行在一個設(shè)備上蚪拦,****Android library ****會編譯成**** Android archive ****(****AAR****)文件杖剪,你可以作為****app module ****的一個依賴**** ****(****dependency****)
一個library module 可能被用在如下情況:
· 當(dāng)你在構(gòu)建一個多個部分組成的app ,在app中 會有相同的組件驰贷,例如activity service 或者 ui布局
· 當(dāng)你要構(gòu)建一個app的但是要求有一些差異的apk包時(shí)盛嘿,例如免費(fèi)版 和收費(fèi)版,你需要在兩個包中包含相同的核心組件
這兩種情況下括袒,只需要簡單的包你要重用的部分移動到一個library然后添加這個library作為每個app module的依賴即可次兆。本文將講解如何創(chuàng)建Android library。
創(chuàng)建 library module
創(chuàng)建一個library module 步驟如下
1.點(diǎn)擊File > New > New Module.
2.出現(xiàn) Create New Module 界面锹锰,點(diǎn)擊Android Library ,然后點(diǎn)擊Next 芥炭。另外 還有 Java Library的選項(xiàng),用來建立傳統(tǒng)jar包文件恃慧,jar文件可用于很多項(xiàng)目园蝠,尤其是當(dāng)你想把代碼分享在不同的平臺,jar文件不允許你包含Android 資源文件和manifest文件痢士。那么此文首先關(guān)注如何創(chuàng)建 Android Library
3.設(shè)置你的library的名稱 并選擇兼容的最低SDK版本彪薛,然后點(diǎn)擊Finish
一旦Gradle 項(xiàng)目同步完成,library module 會在左側(cè)的Project 面板出現(xiàn),如果你沒發(fā)現(xiàn)新的module文件夾善延,檢查一下是否在Android 視圖
把一個****app module ****轉(zhuǎn)換成****library module**
如果已存在一個app module 少态,你想重用這里面所有的代碼,你也可以按照如下步驟把他轉(zhuǎn)換成library module
1.打開這個app 的 build.grale 文件易遣,在頂部彼妻,你可以看到一行腳本
apply plugin: 'com.android.application'
'com.android.library'把這行代碼 改成
apply plugin: 'com.android.library'
點(diǎn)擊 Sync Project with Gradle Files. 同步代碼 即可完成轉(zhuǎn)換
簡單吧,此時(shí)整個module結(jié)構(gòu)和之前還是一樣的训挡,但是現(xiàn)在作為一個Android libray運(yùn)行澳骤,在構(gòu)建的時(shí)候回構(gòu)建成AAR文件而不是apk文件了。
添加你的 library 作為 dependency
在另一個app module 中使用你的Android library 的代碼 方法如下
添加library 到你的項(xiàng)目中 的兩種方式(如果你是在你項(xiàng)目內(nèi)新建的library 可以跳過此步驟)
添加AAR或者jar文件
點(diǎn)擊 File > New Module. 2.點(diǎn)擊Import .JAR/.AAR Package ****然后****Next 3****澜薄。找到****arr****或者****jar****文件點(diǎn)擊****finish
導(dǎo)入library module 到你項(xiàng)目中
點(diǎn)擊 File > New > Import Module. 2 進(jìn)入到到導(dǎo)入的目錄 找到相應(yīng)的文件 點(diǎn)擊finish为肮。接下來 你的library module 會被拷貝到你的項(xiàng)目目錄,所以你可以直接的編輯你的library代碼肤京。如果要保持一個單一版本的library 代碼颊艳,這種方式可能不是你想要的。應(yīng)該通過導(dǎo)入arr文件如上文描述忘分。
確保library module 在settings.gradle 文件中被列出棋枕,類似如下
Open the app module's build.gradle file and add a new line to the dependencies block as shown in the following snippet:dependencies {
compile project(":my-library-module")
}打開app的build.gradle 文件,然后在dependencies 語句塊添加一行代碼如下
dependencies { compile project(":my-library-module") }
點(diǎn)擊Sync Project with Gradle Files. 同步
在這個例子中妒峦,名稱為my-library- module 的Android library 被構(gòu)建成了主module的依賴文件重斑,在你的項(xiàng)目中可以任意引用library的資源和代碼,同時(shí)ARR文件也被打包到apk文件了肯骇。
然后 如果你想單獨(dú)的分享你的arr文件 窥浪,你可以在 project-name/module-name/build/outputs/aar/文件夾中找打arr文件,當(dāng)然 你也可以點(diǎn)擊Build > Make Project ****重新構(gòu)建
選擇性公開資源
默認(rèn)library中的所有資源都是public 的笛丙,讓所有的資源變成私有的漾脂,你必須定義至少一個具體屬性作為public ,在res文件中的都為資源胚鸯,例如圖像骨稿。要防止用戶在外部引用你打算只在內(nèi)部引用的資源,你可以聲明幾個你想設(shè)置為public的資源的方式 去私有化其余的資源姜钳。
聲明public 資源文件坦冠,需要在你的library的 public.xml文件中聲明。如果你之前還沒有添加public資源哥桥,你需要在res/values/中先創(chuàng)建public.xml文件辙浑;下面是創(chuàng)建連個資源為public 的例子
<resources> <public name="mylib_app_name" type="string"/> <public name="mylib_public_string" type="string"/> </resources>
你應(yīng)該公開所有你項(xiàng)目開放給使用你的 library的開發(fā)者,例如泰讽,即v7包中大部分的資源都是私有的例衍,但控制Toolbar控件的屬性都是public 的
使你的資源屬性私有化昔期,不僅可以防止library使用者從外部獲得完整的代碼資源,而且允許你重命名或者刪除私有資源佛玄,而不會使你的用戶端崩潰硼一,私有的資源會被編輯提示器過濾掉,如果你試圖引用私有資源lint會報(bào)出警告梦抢。
開發(fā)注意事項(xiàng)
當(dāng)你準(zhǔn)備開發(fā)你的library依賴到你app時(shí)般贼,要了解以下的限制和行為
當(dāng)你添加library里的引用到你的app module ,你可以設(shè)置他們的優(yōu)先級奥吩,當(dāng)構(gòu)建時(shí)哼蛆,library和app會從優(yōu)先級低到高的進(jìn)行一次合并,
*資源合并沖突
構(gòu)建工具在合并library 和app的資源時(shí)霞赫,如果一個資源ID在兩者中都有定義相同的資源id腮介。如果沖突出現(xiàn)在多個aar庫中,則 按照在build.gradle中 dependencies 語句塊中的列出次序端衰,在首位的library 資源將會被使用叠洗。 要避免這種資源沖突,可以考慮用加前綴或者其他方式命名的方式旅东,來確保資源名稱的唯一性灭抑。
library module ****還可以包含一個****jar library
library module可以引用external library.(比如, Maps external library).依賴者app module也必須構(gòu)建引用相同的external library.注意:library module和依賴者app module都必須在它們的manifest文件中使用uses- library來聲明引用external library.
library module不能包含assets資源
編譯工具不支持在library modules中使用asset資源(存放在assets/ 文件下)。所有使用到的asset資源都必須存放在app module的assets/ 文件夾下抵代。
app module的minSdkVersion必須大于等于library module的
library module最后被編譯成app module的一部分腾节,所以app module使用的SDK版本必須包含library module使用的SDK版本中的所有API。
每個library module都會創(chuàng)建它們自己的R類
當(dāng)你編譯app module時(shí)荤牍,library module都會被編譯進(jìn)一個AAR文件案腺,然后將這個文件加入app module.因此,每個library都有它們自己的R類参淫,按各自的包名命名救湖。
你也可以通過添加PROGUARD 配置文件給你的library混淆壓縮你的 library愧杯,構(gòu)建工具會把這個文件嵌入到當(dāng)你的AAR文件中涎才,當(dāng)你把此library添加到app module中,library的PROGUARD配置文件被添加到app module的program.txt文件了
By embedding a ProGuard file in your library module, you ensure that app modules that depend on your library do not have to manually update their ProGuard files to use your library. When ProGuard runs on the Android app module, it uses the directives from both the app module and the library so you should not run ProGuard on the library alone.To specify the name of your library's configuration file, add it to the consumerProguardFiles method, inside the defaultConfig block of your library's build.gradle file. For example, the following snippet sets lib-proguard-rules.txt as the library's ProGuard configuration file:android {
**** defaultConfig {
**** consumerProguardFiles 'lib-proguard-rules.txt'
**** }
**** ...
****}
****By default, the app module uses the library's release build, even when using the app module's debug build type. To use a different build type from the library, you must add dependencies to the dependencies block of the app's build.gradle file and set publishNonDefault to true in the library'sbuild.gradle file. For example, the following code snippet in your app's build.gradle file causes the app to use the library's debug build type when the app module builds in debug mode and to use the library's release build type when the app module builds in release mode:dependencies {
**** debugCompile project(path: ':library', configuration: 'debug')
**** releaseCompile project(path: ':library', configuration: 'release')
****}You must also add the following line inside the android block of your library's build.gradle file to expose your library's non-release configurations to projects that use it:android {
**** ...
**** publishNonDefault true
****}Note, however, that setting publishNonDefault can increase build times.To ensure that your library's ProGuard rules do not apply unwanted shrinking side effects to app modules, only include rules that disable ProGuard features that do not work with your library. Rules that attempt to aid developers can conflict with the existing code in an app module or its other libraries and therefore should not be included. For example, your library's ProGuard file can specify what code needs to be kept during an app module's minification.Note: The Jack toolchain provides support for only some shrinking and obfuscation options with ProGuard.