3.4 管理項(xiàng)目 - 創(chuàng)建Android庫

文章來源:Google

本文內(nèi)容

  • 創(chuàng)建庫模塊
  • 以依賴項(xiàng)形式添加您的庫
  • 選擇要設(shè)為公開的資源
  • 開發(fā)注意事項(xiàng)
  • AAR 文件詳解

Android 庫在結(jié)構(gòu)上與 Android 應(yīng)用模塊相同。它可以提供構(gòu)建應(yīng)用所需的一切內(nèi)容孝偎,包括源代碼、資源文件和 Android 清單。不過,Android 庫將編譯到您可以用作 Android 應(yīng)用模塊依賴項(xiàng)的 Android 歸檔 (AAR) 文件饱搏,而不是在設(shè)備上運(yùn)行的 APK祖秒。與 JAR 文件不同,AAR 文件可以包含 Android 資源和一個(gè)清單文件寻定,這樣,除了 Java 類與方法外精耐,您還可以捆綁布局和可繪制對(duì)象等共享資源狼速。

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

  • 構(gòu)建使用某些相同組件(例如 Activity、服務(wù)或 UI 布局)的多個(gè)應(yīng)用卦停。
  • 構(gòu)建存在多個(gè) APK 變體(例如免費(fèi)版本和付費(fèi)版本)的應(yīng)用并且需要在兩種版本中使用相同的核心組件向胡。

在任何一種情況下恼蓬,只需要將您希望重用的文件移動(dòng)到庫模塊中,然后以依賴項(xiàng)的形式為每個(gè)應(yīng)用模塊添加庫僵芹。本頁面將說明如何執(zhí)行這兩個(gè)操作处硬。

創(chuàng)建庫模塊


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

  1. 點(diǎn)擊 File > New > New Module拇派。

  2. 在出現(xiàn)的 Create New Module 窗口中荷辕,依次點(diǎn)擊 Android LibraryNext

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

  3. 為您的庫命名惫谤,并為庫中代碼選擇一個(gè)最低的 SDK 版本,然后點(diǎn)擊 Finish珠洗。

在 Gradle 項(xiàng)目同步完成后溜歪,庫模塊將顯示左側(cè)的 Project 面板中。如果您未看到新模塊文件夾险污,請(qǐng)確保將視圖切換為 Android 視圖痹愚。

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

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

  1. 打開現(xiàn)有應(yīng)用模塊的 build.gradle 文件蛔糯。您應(yīng)在頂部看到以下內(nèi)容:

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

    apply plugin: 'com.android.library'
    
  3. 點(diǎn)擊 Sync Project with Gradle Files

就這么簡單窖式。模塊的整個(gè)結(jié)構(gòu)仍然相同蚁飒,但是現(xiàn)在它將作為 Android 庫運(yùn)行,構(gòu)建也將創(chuàng)建一個(gè) AAR 文件萝喘,而不是 APK淮逻。

以依賴項(xiàng)形式添加您的庫


要在另一個(gè)應(yīng)用模塊中使用您的 Android 庫的代碼,請(qǐng)按以下步驟操作:

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

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

      1. 點(diǎn)擊 File > New Module
      2. 依次點(diǎn)擊 Import .JAR/.AAR PackageNext启妹。
      3. 輸入 AAR 或 JAR 文件的位置筛严,然后點(diǎn)擊 Finish
    • 將庫模塊導(dǎo)入到您的項(xiàng)目中:

      1. 點(diǎn)擊 File > New > Import Module饶米。
      2. 輸入庫模塊目錄的位置桨啃,然后點(diǎn)擊 Finish车胡。

      庫模塊將復(fù)制到您的項(xiàng)目中,因此您可以盡管編輯庫代碼照瘾。如果您希望維護(hù)一個(gè)版本的庫代碼匈棘,則此方法可能不是您想要的,您應(yīng)按照上文所述導(dǎo)入編譯的 AAR 文件析命。

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

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

    dependencies {
       compile project(":my-library-module")
    }
    
  4. 點(diǎn)擊 Sync Project with Gradle Files队秩。

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

您的應(yīng)用模塊現(xiàn)在可以訪問 Android 庫中的任何代碼和資源馍资,庫 AAR 文件在構(gòu)建時(shí)已捆綁到您的 APK 中。

不過关噪,如果希望單獨(dú)共享 AAR 文件鸟蟹,則可以在 項(xiàng)目名稱/模塊名稱/build/outputs/aar/ 中找到它,也可以通過點(diǎn)擊 Build > Make Project 的方式重新生成此文件使兔。

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


庫中的所有資源在默認(rèn)情況下均處于公開狀態(tài)建钥。要將所有資源隱式設(shè)為私有,您必須至少將一個(gè)特定的屬性定義為公開虐沥。資源包括您項(xiàng)目的 res/ 目錄中的所有文件熊经,例如圖像。要阻止您的庫用戶訪問僅供內(nèi)部使用的資源欲险,您應(yīng)通過聲明一個(gè)或多個(gè)公開資源的方式來使用這種自動(dòng)私有標(biāo)識(shí)機(jī)制镐依。

要?jiǎng)h除某個(gè)公開資源,請(qǐng)將一個(gè) 聲明添加到您的庫的 public.xml 文件中天试。如果您之前尚未添加公開資源槐壳,則需要在您的庫的 res/values/ 目錄中創(chuàng)建 public.xml 文件。

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

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

如果希望任何資源保持對(duì)使用您的庫的開發(fā)者可見喜每,您應(yīng)當(dāng)將其設(shè)為公開务唐。例如,盡管 v7 appcompat 庫中的大多數(shù)資源都是私有資源带兜,但是為了支持 Material Design枫笛,控制工具欄小部件的屬性應(yīng)當(dāng)公開。

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

開發(fā)注意事項(xiàng)


在開發(fā)您的庫模塊和相關(guān)應(yīng)用時(shí)繁莹,請(qǐng)注意以下行為和限制。

將庫模塊引用添加至您的 Android 應(yīng)用模塊后特幔,您可以設(shè)置它們的相對(duì)優(yōu)先級(jí)咨演。構(gòu)建時(shí),庫會(huì)按照一次一個(gè)的方式與應(yīng)用合并蚯斯,并按照從低到高的優(yōu)先級(jí)順序薄风。

  • 資源合并沖突

    構(gòu)建工具會(huì)將庫模塊中的資源與相關(guān)應(yīng)用模塊的資源合并。如果在兩個(gè)模塊中均定義了給定資源 ID拍嵌,將使用應(yīng)用中的資源遭赂。

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

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

  • 庫模塊可以包含 JAR 庫

    您可以開發(fā)一個(gè)自身包含 JAR 庫的庫模塊狈蚤;不過困肩,您需要手動(dòng)編輯相關(guān)應(yīng)用模塊的構(gòu)建路徑,并添加 JAR 文件的路徑脆侮。

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

    您可以開發(fā)一個(gè)依賴于外部庫(例如 Maps 外部庫)的庫模塊锌畸。在這種情況下,相關(guān)應(yīng)用必須針對(duì)包含外部庫(例如 Google API 插件)的目標(biāo)構(gòu)建靖避。另外也要注意潭枣,庫模塊和相關(guān)應(yīng)用都必須在其清單文件的 <uses- library> 元素中聲明外部庫。

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

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

  • 應(yīng)用模塊的 minSdkVersion 必須大于或等于庫定義的版本

    庫作為相關(guān)應(yīng)用模塊的一部分編譯,因此粘咖,庫模塊中使用的 API 必須與應(yīng)用模塊支持的平臺(tái)版本兼容蚣抗。

  • 每個(gè)庫模塊都會(huì)創(chuàng)建自己的 R 類

    在您構(gòu)建相關(guān)應(yīng)用模塊時(shí)侈百,庫模塊將先編譯到 AAR 文件中瓮下,然后再添加到應(yīng)用模塊中。因此钝域,每個(gè)庫都有其自己的 R 類讽坏,并根據(jù)庫的軟件包名稱命名。從主模塊和庫模塊生成的 R 類會(huì)在所需的所有軟件包(包括主模塊的軟件包和庫的軟件包)中創(chuàng)建例证。

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

    通過將 ProGuard 配置文件添加到包含其 ProGuard 指令的庫路呜,您可以在自己的庫上啟用代碼壓縮。構(gòu)建工具會(huì)為庫模塊將此文件嵌入到生成的 AAR 文件中。在您將庫添加到應(yīng)用模塊時(shí)胀葱,庫的 ProGuard 文件將附加至應(yīng)用模塊的 ProGuard 配置文件 (proguard.txt)漠秋。

    通過將 ProGuard 文件嵌入到您的庫模塊中,您可以確保依賴于此庫的應(yīng)用模塊不必手動(dòng)更新其 ProGuard 文件即可使用庫抵屿。當(dāng) ProGuard 在 Android 應(yīng)用模塊上運(yùn)行時(shí)庆锦,它會(huì)同時(shí)使用來自應(yīng)用模塊和庫的指令,因此您不應(yīng)當(dāng)只在庫上運(yùn)行 ProGuard轧葛。

    要指定您的庫的配置文件名稱搂抒,請(qǐng)將其添加到 consumerProguardFiles 方法中,此方法位于您的庫的 build.gradle 文件的 defaultConfig 塊內(nèi)尿扯。例如求晶,以下片段會(huì)將 lib-proguard-rules.txt 設(shè)置為庫的 ProGuard 配置文件:

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

默認(rèn)情況下,應(yīng)用模塊會(huì)使用庫的發(fā)布構(gòu)建衷笋,即使在使用應(yīng)用模塊的調(diào)試構(gòu)建類型時(shí)亦是如此芳杏。要使用庫中不同的構(gòu)建類型,您必須將依賴項(xiàng)添加到應(yīng)用的 build.gradle 文件的 dependencies 塊中辟宗,并在庫的 build.gradle 文件中將 publishNonDefault 設(shè)置為 true蚜锨。例如,您應(yīng)用的 build.gradle文件中的以下代碼段會(huì)使應(yīng)用在應(yīng)用模塊于調(diào)試模式下構(gòu)建時(shí)使用庫的調(diào)試構(gòu)建類型慢蜓,以及在應(yīng)用模塊于發(fā)布模式下構(gòu)建時(shí)使用庫的發(fā)布構(gòu)建類型:

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

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

android {
    ...
    publishNonDefault true
}

不過請(qǐng)注意,設(shè)置 publishNonDefault 會(huì)增加構(gòu)建時(shí)間晨抡。

為了確保您的庫的 ProGuard 規(guī)則不會(huì)將意外的壓縮副作用施加到應(yīng)用模塊氛悬,請(qǐng)僅包含適當(dāng)規(guī)則,停用不適用于此庫的 ProGuard 功能耘柱。嘗試協(xié)助開發(fā)者的規(guī)則可能會(huì)與應(yīng)用模塊或它的其他庫中的現(xiàn)有代碼沖突如捅,因此不應(yīng)包含這些規(guī)則。例如调煎,您的庫的 ProGuard 文件可以指定在應(yīng)用模塊的壓縮期間需要保留的代碼镜遣。

Jack 工具鏈僅支持 ProGuard 的部分壓縮和模糊選項(xiàng)。

AAR 文件詳解


AAR 文件的文件擴(kuò)展名為 .aar士袄,Maven 工件類型也應(yīng)當(dāng)是 aar悲关。文件本身是一個(gè)包含以下強(qiáng)制性條目的 zip 文件:

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

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

  • /assets/
  • /libs/名稱.jar
  • /jni/abi 名稱/名稱.so(abi 名稱是 Android 支持的 ABI 之一)
  • /proguard.txt
  • /lint.jar
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末娄柳,一起剝皮案震驚了整個(gè)濱河市寓辱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赤拒,老刑警劉巖秫筏,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诱鞠,死亡現(xiàn)場離奇詭異,居然都是意外死亡这敬,警方通過查閱死者的電腦和手機(jī)航夺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來崔涂,“玉大人敷存,你說我怎么就攤上這事】拔椋” “怎么了锚烦?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長帝雇。 經(jīng)常有香客問我涮俄,道長,這世上最難降的妖魔是什么尸闸? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任彻亲,我火速辦了婚禮,結(jié)果婚禮上吮廉,老公的妹妹穿的比我還像新娘苞尝。我一直安慰自己,他們只是感情好宦芦,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布宙址。 她就那樣靜靜地躺著,像睡著了一般调卑。 火紅的嫁衣襯著肌膚如雪抡砂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天恬涧,我揣著相機(jī)與錄音注益,去河邊找鬼。 笑死溯捆,一個(gè)胖子當(dāng)著我的面吹牛丑搔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播提揍,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼啤月,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了碳锈?” 一聲冷哼從身側(cè)響起顽冶,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎售碳,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贸人,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年间景,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艺智。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡倘要,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出十拣,到底是詐尸還是另有隱情封拧,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布夭问,位于F島的核電站泽西,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏缰趋。R本人自食惡果不足惜捧杉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秘血。 院中可真熱鬧味抖,春花似錦、人聲如沸灰粮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粘舟。三九已至红柱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蓖乘,已是汗流浹背锤悄。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嘉抒,地道東北人零聚。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像些侍,于是被迫代替她去往敵國和親隶症。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359