創(chuàng)建 Android 庫

此文章復制于:https://developer.android.com/studio/projects/android-library.html#AddDependency

Android 庫在結(jié)構(gòu)上與 Android 應用模塊相同。它可以提供構(gòu)建應用所需的一切內(nèi)容恋昼,包括源代碼脉幢、資源文件和 Android 清單。不過屡江,Android 庫將編譯到您可以用作 Android 應用模塊依賴項的 Android 歸檔 (AAR) 文件剪芍,而不是在設(shè)備上運行的 APK沪羔。與 JAR 文件不同,AAR 文件可以包含 Android 資源和一個清單文件葵姥,這樣荷鼠,除了 Java 類與方法外,您還可以捆綁布局和可繪制對象等共享資源榔幸。

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

構(gòu)建使用某些相同組件(例如 Activity允乐、服務或 UI 布局)的多個應用。

構(gòu)建存在多個 APK 變體(例如免費版本和付費版本)的應用并且需要在兩種版本中使用相同的核心組件削咆。

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

創(chuàng)建庫模塊

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

點擊?File > New > New Module瞻惋。

在出現(xiàn)的?Create New Module?窗口中厦滤,依次點擊?Android Library?和?Next援岩。?

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

為您的庫命名值纱,并為庫中代碼選擇一個最低的 SDK 版本鳞贷,然后點擊?Finish

在 Gradle 項目同步完成后虐唠,庫模塊將顯示左側(cè)的?Project?面板中搀愧。如果您未看到新模塊文件夾,請確保將視圖切換為?Android 視圖凿滤。

將應用模塊轉(zhuǎn)換為庫模塊

如果您現(xiàn)有的應用模塊包含您希望重用的所有代碼妈橄,則可以按照以下步驟將其轉(zhuǎn)換為庫模塊:

打開現(xiàn)有應用模塊的?build.gradle?文件庶近。您應在頂部看到以下內(nèi)容:?

apply plugin: 'com.android.application'

按照下面所示更改插件分配:

apply plugin: 'com.android.library'

點擊?Sync Project with Gradle Files翁脆。

就這么簡單。模塊的整個結(jié)構(gòu)仍然相同鼻种,但是現(xiàn)在它將作為 Android 庫運行反番,構(gòu)建也將創(chuàng)建一個 AAR 文件,而不是 APK叉钥。

以依賴項形式添加您的庫

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

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

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

點擊?File > New Module枫疆。

依次點擊?Import .JAR/.AAR Package?和?Next

輸入 AAR 或 JAR 文件的位置敷鸦,然后點擊?Finish息楔。

將庫模塊導入到您的項目中:?

點擊?File > New > Import Module

輸入庫模塊目錄的位置扒披,然后點擊?Finish值依。

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

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

include ':app', ':my-library-module'

打開應用模塊的?build.gradle?文件风秤,并向?dependencies?塊中添加一行新代碼,如下面的片段所示:?

dependencies {

compile project

(":my-library-module")}

點擊?Sync Project with Gradle Files褒链。

在上面的示例中唁情,名為?my-library- module?的 Android 庫模塊成為?build.gradle?文件所在模塊的構(gòu)建依賴項。

您的應用模塊現(xiàn)在可以訪問 Android 庫中的任何代碼和資源甫匹,庫 AAR 文件在構(gòu)建時已捆綁到您的 APK 中甸鸟。

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

選擇要設(shè)為公開的資源

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

要刪除某個公開資源骑科,請將一個?聲明添加到您的庫的?public.xml?文件中。如果您之前尚未添加公開資源构拳,則需要在您的庫的?res/values/?目錄中創(chuàng)建?public.xml?文件咆爽。?

下面的示例代碼可以創(chuàng)建兩個名稱分別為?mylib_app_name?和?mylib_public_string?的公開字符串資源:

如果希望任何資源保持對使用您的庫的開發(fā)者可見,您應當將其設(shè)為公開置森。例如斗埂,盡管?v7 appcompat 庫中的大多數(shù)資源都是私有資源,但是為了支持?Material Design凫海,控制工具欄小部件的屬性應當公開呛凶。

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

開發(fā)注意事項

在開發(fā)您的庫模塊和相關(guān)應用時县好,請注意以下行為和限制。

將庫模塊引用添加至您的 Android 應用模塊后暖混,您可以設(shè)置它們的相對優(yōu)先級缕贡。構(gòu)建時,庫會按照一次一個的方式與應用合并,并按照從低到高的優(yōu)先級順序晾咪。

資源合并沖突

構(gòu)建工具會將庫模塊中的資源與相關(guān)應用模塊的資源合并收擦。如果在兩個模塊中均定義了給定資源 ID,將使用應用中的資源谍倦。

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

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

庫模塊可以包含 JAR 庫

您可以開發(fā)一個自身包含 JAR 庫的庫模塊;不過叼旋,您需要手動編輯相關(guān)應用模塊的構(gòu)建路徑仇哆,并添加 JAR 文件的路徑。

庫模塊可以依賴外部 JAR 庫

您可以開發(fā)一個依賴于外部庫(例如 Maps 外部庫)的庫模塊夫植。在這種情況下讹剔,相關(guān)應用必須針對包含外部庫(例如 Google API 插件)的目標構(gòu)建。另外也要注意详民,庫模塊和相關(guān)應用都必須在其清單文件的??元素中聲明外部庫延欠。

庫模塊不得包含原始資源

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

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

庫作為相關(guān)應用模塊的一部分編譯由捎,因此,庫模塊中使用的 API 必須與應用模塊支持的平臺版本兼容谒出。

每個庫模塊都會創(chuàng)建自己的 R 類

在您構(gòu)建相關(guān)應用模塊時隅俘,庫模塊將先編譯到 AAR 文件中邻奠,然后再添加到應用模塊中笤喳。因此,每個庫都有其自己的?R?類碌宴,并根據(jù)庫的軟件包名稱命名杀狡。從主模塊和庫模塊生成的?R?類會在所需的所有軟件包(包括主模塊的軟件包和庫的軟件包)中創(chuàng)建。

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

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

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

要指定您的庫的配置文件名稱拴疤,請將其添加到?consumerProguardFiles?方法中永部,此方法位于您的庫的?build.gradle?文件的?defaultConfig?塊內(nèi)。例如呐矾,以下片段會將?lib-proguard-rules.txt?設(shè)置為庫的 ProGuard 配置文件:

android {

? ? defaultConfig {

? ? ? ? consumerProguardFiles 'lib-proguard-rules.txt'

? ? }

? ? ...

}

默認情況下苔埋,應用模塊會使用庫的發(fā)布構(gòu)建,即使在使用應用模塊的調(diào)試構(gòu)建類型時亦是如此蜒犯。要使用庫中不同的構(gòu)建類型组橄,您必須將依賴項添加到應用的?build.gradle?文件的?dependencies?塊中,并在庫的?build.gradle?文件中將?publishNonDefault?設(shè)置為?true罚随。例如晨炕,您應用的?build.gradle?文件中的以下代碼段會使應用在應用模塊于調(diào)試模式下構(gòu)建時使用庫的調(diào)試構(gòu)建類型,以及在應用模塊于發(fā)布模式下構(gòu)建時使用庫的發(fā)布構(gòu)建類型:

dependencies {

debugCompile project

(path: ':library', configuration: 'debug')

releaseCompile project

(path: ':library', configuration: 'release')}

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

android {...

publishNonDefault

true}

不過請注意瓮栗,設(shè)置?publishNonDefault?會增加構(gòu)建時間。

為了確保您的庫的 ProGuard 規(guī)則不會將意外的壓縮副作用施加到應用模塊瞄勾,請僅包含適當規(guī)則费奸,停用不適用于此庫的 ProGuard 功能。嘗試協(xié)助開發(fā)者的規(guī)則可能會與應用模塊或它的其他庫中的現(xiàn)有代碼沖突进陡,因此不應包含這些規(guī)則愿阐。例如,您的庫的 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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市赡磅,隨后出現(xiàn)的幾起案子魄缚,更是在濱河造成了極大的恐慌,老刑警劉巖焚廊,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冶匹,死亡現(xiàn)場離奇詭異,居然都是意外死亡咆瘟,警方通過查閱死者的電腦和手機嚼隘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來袒餐,“玉大人飞蛹,你說我怎么就攤上這事须肆。” “怎么了桩皿?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵豌汇,是天一觀的道長。 經(jīng)常有香客問我泄隔,道長拒贱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任佛嬉,我火速辦了婚禮逻澳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘暖呕。我一直安慰自己斜做,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布湾揽。 她就那樣靜靜地躺著瓤逼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪库物。 梳的紋絲不亂的頭發(fā)上霸旗,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音戚揭,去河邊找鬼诱告。 笑死,一個胖子當著我的面吹牛民晒,可吹牛的內(nèi)容都是我干的精居。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼潜必,長吁一口氣:“原來是場噩夢啊……” “哼靴姿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起刮便,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤空猜,失蹤者是張志新(化名)和其女友劉穎绽慈,沒想到半個月后恨旱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡坝疼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年搜贤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钝凶。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡仪芒,死狀恐怖唁影,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掂名,我是刑警寧澤据沈,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站饺蔑,受9級特大地震影響锌介,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜猾警,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一孔祸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧发皿,春花似錦崔慧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至玄货,卻和暖如春拇涤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背誉结。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工鹅士, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惩坑。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓掉盅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親以舒。 傳聞我的和親對象是個殘疾皇子趾痘,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

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