android studio 官方用戶指南翻譯學(xué)習(xí)(四)創(chuàng)建 Android library

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 視圖

Paste_Image.png

把一個****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.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末力九,一起剝皮案震驚了整個濱河市耍铜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌跌前,老刑警劉巖棕兼,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異抵乓,居然都是意外死亡伴挚,警方通過查閱死者的電腦和手機(jī)靶衍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茎芋,“玉大人颅眶,你說我怎么就攤上這事√锩郑” “怎么了涛酗?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長偷厦。 經(jīng)常有香客問我商叹,道長,這世上最難降的妖魔是什么只泼? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任剖笙,我火速辦了婚禮,結(jié)果婚禮上请唱,老公的妹妹穿的比我還像新娘枯途。我一直安慰自己,他們只是感情好籍滴,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布酪夷。 她就那樣靜靜地躺著,像睡著了一般孽惰。 火紅的嫁衣襯著肌膚如雪晚岭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天勋功,我揣著相機(jī)與錄音坦报,去河邊找鬼。 笑死狂鞋,一個胖子當(dāng)著我的面吹牛片择,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播骚揍,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼字管,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了信不?” 一聲冷哼從身側(cè)響起嘲叔,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抽活,沒想到半個月后硫戈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡下硕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年丁逝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了汁胆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡霜幼,死狀恐怖沦泌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辛掠,我是刑警寧澤谢谦,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站萝衩,受9級特大地震影響回挽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜猩谊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一千劈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧牌捷,春花似錦墙牌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至撤防,卻和暖如春虽风,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背寄月。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工辜膝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人漾肮。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓厂抖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親克懊。 傳聞我的和親對象是個殘疾皇子忱辅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容