這是一個新的系列文章闸英,我們稱之為 "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ā)所森,請查閱: