這是一個新的系列文章,咱們稱之爲 "Modern Android Development 技巧",簡稱爲 "MAD Skills"。本系列文章致力於幫助開發者們打造更好的現代 Android 開發體驗,敬請關注。android
今天爲你們發佈本系列文章中的第六篇: 爲您的應用配置 Play Feature Delivery。若是您想回顧過去發佈的內容,請參考下面連接查看:git
在 "MAD Skills" 系列文章中,Android App Bundle 是 Android 應用默認的發佈格式。github
在用戶設備上,相比於通用 apk 文件,使用 Android App Bundle 的應用文件大小平均縮減了 15%。您只需簡單地切換到 Android App Bundle,就能夠利用其節約文件大小和改進發布,無需改變應用的任何代碼。在 2021 年下半年,Google Play 將要求 新的應用和遊戲以 Android App Bundle 的格式發佈。api
想要了解更多關於如何構建您的第一個 Android App Bundle,請參閱這個系列 以前的文章。
固然您也能夠利用 Play Feature Delivery 來進一步模塊化以及優化安裝應用。app
模塊化應用會在應用的不一樣部分之間建立清晰的界限,這會帶來各類好處。ide
大多數狀況下,您只須要從新構建應用的一部分,這也能夠幫助您縮短應用的構建時間。構建時間的縮短以及清晰的模塊界限可能會提升工程開發速度。模塊化
同時,從 Google Play Store 咱們也能夠發現:優化
應用的下載大小每下降 3 MB 能夠增長 1% 的下載量ui
經過這篇文章您能夠了解到 Android App Bundles 帶來的 Play Feature Delivery 的新特性,這些特性能夠幫助您更進一步地下降應用的大小。同時我還將會介紹一些 API (這些 API 能夠用來實現按條件或按需進行功能分發) 以及各類不一樣的配置選項。google
您可使用 Android Studio 來體驗 "新建模塊 (New Module)" 的流程,咱們在這篇文章裏還會介紹該流程背後的邏輯,以及以後您能夠如何更改配置。
當使用功能模塊開始模塊化一個應用的時候,您的基本模塊是安裝時模塊 (install-time modules),此時您已經能夠從諸如構建速度以及工程開發速度的提高中獲益。
安裝時模塊的基礎配置以下所示:
/* 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>
最重要的部分是分發命名空間 (distribution namespace),xmlns:dist="http://schemas.android.com/apk/distribution"
以及分發配置屬性被設置爲 install-time
。
當首次安裝時,像這樣配置的模塊會被默認安裝。
每一個安裝時模塊都會被融合進基本模塊,這也使他們變成不可移除的。若是您想之後能夠移除安裝時模塊,您須要設置其 removable
的屬性值爲 true
。
有些模塊很佔存儲空間,且只有初始安裝應用時有用,一旦完成就再也不須要,好比新手教程和註冊流程等。對於這些模塊來講,模塊卸載會很是有用。
咱們還提供了 PlayCore API 來按需安裝和卸載某些模塊,我稍後會在本文中介紹它。
功能模塊的安裝機制須要運行在 Android 5.0 及之後的機型上。對於舊版本的 Android,功能模塊能夠放到基礎 apk 中。若是想開啓這個功能,您須要在 module 標籤中設置 fusing 的 include 屬性值爲 true。
<dist:fusing dist:include=」true」>
除了安裝時分發,按條件分發是另一個請求功能模塊的方法。安裝條件包括設備 API 版本、用戶所在國家和設備特性。
這是一個完整的 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>
並非全部的這些條件都須要設置,並且您也不大可能須要在單個模塊中使用全部這些條件。咱們來一步步解釋它們。
若是要設置按條件分發,咱們須要添加 dist:conditions 標籤。
而後,經過使用 min-api 和 max-api,您能夠聲明所支持的最低以及最高的 API 版本。
若是您須要爲一個特定模塊指定 API 版本,這些會很是有用。
此外,AndroidManifest 文件中的每個 uses-feature 元素 均可以被用來做爲安裝條件。經過使用 device-feature 屬性,您能夠確保功能模塊只會被分發到有相關配置的設備上。
默認狀況下,每一個用戶均可以從應用所發佈的地區下載到其全部功能模塊。您能夠選擇某些特定的功能模塊只在特定的國家可用。這將是一個實現本地化應用很是好的方式。爲了實現這個功能,您須要添加 user-countries
標籤並設置兩個字母的國家代碼。
當您想設置某個功能在某些特定的國家不可用時,請確保設置 dist:exclude="false"。若是您想讓一個功能只在某個國家可用,請設置該值爲 true。
有時您只想分發給用戶一個相似 TensorFlow 模型的大型資源文件,在這個功能模塊中,您並無任何代碼,這時請確保該模塊的 AndroidManifest 文件中 hasCode 的值設置爲 false。
<application android:hasCode="false" />
這個設置會告訴編譯器沒必要生成 dex 文件。
若是模塊中沒有代碼並且忘記設置 hasCode 爲 false 則會致使運行時異常。
若是想徹底本身控制應用的安裝時間,您可使用按需安裝 (on-demand installation)。這意味着您能夠在應用被下載並安裝到用戶設備以後調用 API 來安裝模塊。
使用按需安裝節省了初始的下載時間和大小。
在 AndroidManifest 文件中,您須要設置分發選項爲 on-demand。隨後,您能夠在應用的流程中使用 PlayCore API 來下載、安裝和卸載模塊。
如需更多資料詳細瞭解 Play Feature Delivery 中的按需分發,請查閱: