為您的應(yīng)用配置 Play Feature Delivery

image

這是一個新的系列文章闸英,我們稱之為 "Modern Android Development 技巧"玷氏,簡稱為 "MAD Skills"滩援。本系列文章致力于幫助開發(fā)者們打造更好的現(xiàn)代 Android 開發(fā)體驗炉擅,敬請關(guān)注破衔。

今天為大家發(fā)布本系列文章中的第六篇: 為您的應(yīng)用配置 Play Feature Delivery清女。如果您想回顧過去發(fā)布的內(nèi)容,請參考下面鏈接查看:

在 "MAD Skills" 系列文章中晰筛,Android App Bundle 是 Android 應(yīng)用默認的發(fā)布格式嫡丙。

在用戶設(shè)備上,相比于通用 apk 文件读第,使用 Android App Bundle 的應(yīng)用文件大小平均縮減了 15%曙博。您只需簡單地切換到 Android App Bundle,就可以利用其節(jié)約文件大小和改進發(fā)布怜瞒,無需改變應(yīng)用的任何代碼羊瘩。在 2021 年下半年,Google Play 將要求 新的應(yīng)用和游戲以 Android App Bundle 的格式發(fā)布盼砍。

想要了解更多關(guān)于如何構(gòu)建您的第一個 Android App Bundle尘吗,請參閱這個系列 之前的文章

當(dāng)然您也可以利用 Play Feature Delivery 來進一步模塊化以及優(yōu)化安裝應(yīng)用浇坐。

為什么需要模塊化應(yīng)用和 Play Feature Delivery 呢睬捶?

模塊化應(yīng)用會在應(yīng)用的不同部分之間創(chuàng)建清晰的界限,這會帶來各種好處近刘。

大多數(shù)情況下擒贸,您只需要重新構(gòu)建應(yīng)用的一部分,這也可以幫助您縮短應(yīng)用的構(gòu)建時間觉渴。構(gòu)建時間的縮短以及清晰的模塊界限可能會提高工程開發(fā)速度介劫。

同時,從 Google Play Store 我們也可以發(fā)現(xiàn):

應(yīng)用的下載大小每降低 3 MB 可以增加 1% 的下載量

通過這篇文章您可以了解到 Android App Bundles 帶來的 Play Feature Delivery 的新特性案淋,這些特性可以幫助您更進一步地降低應(yīng)用的大小座韵。同時我還將會介紹一些 API (這些 API 可以用來實現(xiàn)按條件或按需進行功能分發(fā)) 以及各種不同的配置選項。

您可以使用 Android Studio 來體驗 "新建模塊 (New Module)" 的流程踢京,我們在這篇文章里還會介紹該流程背后的邏輯誉碴,以及之后您可以如何更改配置。

建立基本模塊

當(dāng)使用功能模塊開始模塊化一個應(yīng)用的時候瓣距,您的基本模塊是安裝時模塊 (install-time modules)黔帕,此時您已經(jīng)可以從諸如構(gòu)建速度以及工程開發(fā)速度的提升中獲益。

安裝時模塊的基礎(chǔ)配置如下所示:

/* Copyright 2020 Google LLC.  
   SPDX-License-Identifier: Apache-2.0 */

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:dist="http://schemas.android.com/apk/distribution"
    package="com.google.android.samples.playcore.picture">

    <uses-feature android:name="android.hardware.camera" android:required="true" />

    <dist:module dist:title="@string/module_feature_picture">
        <dist:fusing dist:include="true" />
        <dist:delivery>
            <dist:install-time />
        </dist:delivery>
    </dist:module>
</manifest>

最重要的部分是分發(fā)命名空間 (distribution namespace)蹈丸,xmlns:dist="http://schemas.android.com/apk/distribution" 以及分發(fā)配置屬性被設(shè)置為 install-time成黄。

當(dāng)首次安裝時呐芥,像這樣配置的模塊會被默認安裝。

每個安裝時模塊都會被融合進基本模塊奋岁,這也使他們變成不可移除的贩耐。如果您想以后可以移除安裝時模塊,您需要設(shè)置其 removable 的屬性值為 true厦取。

有些模塊很占存儲空間,且只有初始安裝應(yīng)用時有用管搪,一旦完成就不再需要虾攻,比如新手教程和注冊流程等。對于這些模塊來說更鲁,模塊卸載會非常有用霎箍。

我們還提供了 PlayCore API 來按需安裝和卸載某些模塊,我稍后會在本文中介紹它澡为。

對于 Android 5.0 以前的設(shè)備的提示

功能模塊的安裝機制需要運行在 Android 5.0 及以后的機型上漂坏。對于舊版本的 Android,功能模塊可以放到基礎(chǔ) apk 中媒至。如果想開啟這個功能顶别,您需要在 module 標簽中設(shè)置 fusing 的 include 屬性值為 true。

<dist:fusing dist:include=”true”>

設(shè)置按條件分發(fā)

除了安裝時分發(fā)拒啰,按條件分發(fā)是另外一個請求功能模塊的方法驯绎。安裝條件包括設(shè)備 API 版本、用戶所在國家和設(shè)備特性谋旦。

這是一個完整的 AndroidManifest 配置文件剩失。

/* Copyright 2020 Google LLC.  
   SPDX-License-Identifier: Apache-2.0 */

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:dist="http://schemas.android.com/apk/distribution"
    package="com.google.android.samples.playcore.picture">

    <uses-feature android:name="android.hardware.camera" android:required="true" />

    <dist:module dist:title="@string/module_feature_picture" >
        <dist:fusing dist:include="true" />
        <dist:delivery>
            <dist:install-time>
                <dist:conditions>
                    <dist:min-api dist:value="21"/>
                    <dist:max-api dist:value="29"/>
                    <dist:device-feature dist:name="android.hardware.camera"/>
                    <dist:user-countries dist:exclude="false">
                        <dist:country dist:code="DE"/>
                        <dist:country dist:code="GB"/>
                    </dist:user-countries>
                </dist:conditions>
            </dist:install-time>
            <dist:removable value="true" />
        </dist:delivery>
    </dist:module>
</manifest>

并不是所有的這些條件都需要設(shè)置,而且您也不大可能需要在單個模塊中使用所有這些條件册着。我們來一步步解釋它們拴孤。

如果要設(shè)置按條件分發(fā),我們需要添加 dist:conditions 標簽甲捏。

然后演熟,通過使用 min-api 和 max-api,您可以聲明所支持的最低以及最高的 API 版本司顿。

如果您需要為一個特定模塊指定 API 版本绽媒,這些會非常有用。

此外免猾,AndroidManifest 文件中的每一個 uses-feature 元素 都可以被用來作為安裝條件是辕。通過使用 device-feature 屬性,您可以確保功能模塊只會被分發(fā)到有相關(guān)配置的設(shè)備上猎提。

默認情況下获三,每個用戶都可以從應(yīng)用所發(fā)布的地區(qū)下載到其所有功能模塊旁蔼。您可以選擇某些特定的功能模塊只在特定的國家可用。這將是一個實現(xiàn)本地化應(yīng)用非常好的方式疙教。為了實現(xiàn)這個功能棺聊,您需要添加 user-countries 標簽并設(shè)置兩個字母的國家代碼。

當(dāng)您想設(shè)置某個功能在某些特定的國家不可用時贞谓,請確保設(shè)置 dist:exclude="false"限佩。如果您想讓一個功能只在某個國家可用,請設(shè)置該值為 true裸弦。

不含代碼的模塊

有時您只想分發(fā)給用戶一個類似 TensorFlow 模型的大型資源文件祟同,在這個功能模塊中,您并沒有任何代碼理疙,這時請確保該模塊的 AndroidManifest 文件中 hasCode 的值設(shè)置為 false晕城。

<application android:hasCode="false" />

這個設(shè)置會告訴編譯器不必生成 dex 文件

如果模塊中沒有代碼而且忘記設(shè)置 hasCode 為 false 則會導(dǎo)致運行時異常窖贤。

按需分發(fā)配置

如果想完全自己控制應(yīng)用的安裝時間砖顷,您可以使用按需安裝 (on-demand installation)。這意味著您可以在應(yīng)用被下載并安裝到用戶設(shè)備之后調(diào)用 API 來安裝模塊赃梧。

使用按需安裝節(jié)省了初始的下載時間和大小滤蝠。

在 AndroidManifest 文件中,您需要設(shè)置分發(fā)選項為 on-demand授嘀。隨后几睛,您可以在應(yīng)用的流程中使用 PlayCore API 來下載、安裝和卸載模塊粤攒。

如需更多資料詳細了解 Play Feature Delivery 中的按需分發(fā)所森,請查閱:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市夯接,隨后出現(xiàn)的幾起案子焕济,更是在濱河造成了極大的恐慌,老刑警劉巖盔几,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晴弃,死亡現(xiàn)場離奇詭異,居然都是意外死亡逊拍,警方通過查閱死者的電腦和手機上鞠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芯丧,“玉大人芍阎,你說我怎么就攤上這事∮Ш悖” “怎么了谴咸?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵轮听,是天一觀的道長。 經(jīng)常有香客問我岭佳,道長血巍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任珊随,我火速辦了婚禮述寡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘叶洞。我一直安慰自己鲫凶,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布京办。 她就那樣靜靜地躺著,像睡著了一般帆焕。 火紅的嫁衣襯著肌膚如雪惭婿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天叶雹,我揣著相機與錄音财饥,去河邊找鬼。 笑死折晦,一個胖子當(dāng)著我的面吹牛钥星,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播满着,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼谦炒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了风喇?” 一聲冷哼從身側(cè)響起宁改,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎魂莫,沒想到半個月后还蹲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡耙考,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年谜喊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倦始。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡斗遏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鞋邑,到底是詐尸還是另有隱情最易,我是刑警寧澤怒坯,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站藻懒,受9級特大地震影響剔猿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嬉荆,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一归敬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鄙早,春花似錦汪茧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至弥虐,卻和暖如春扩灯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背霜瘪。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工珠插, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人颖对。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓捻撑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親缤底。 傳聞我的和親對象是個殘疾皇子顾患,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

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