天天看點

為您的應用配置 Play Feature Delivery

這是一個新的系列文章,我們稱之為 "Modern Android Development 技巧",簡稱為 "MAD Skills"。本系列文章緻力于幫助開發者們打造更好的現代 Android 開發體驗,敬請關注。

今天為大家釋出本系列文章中的第六篇: 為您的應用配置 Play Feature Delivery。如果您想回顧過去釋出的内容,請參考下面連結檢視:

  • 導航元件概覽
  • 導航到對話框
  • 在應用中導航時使用 SafeArgs
  • 使用深層連結導航
  • 打造您的首個 app bundle

在 "MAD Skills" 系列文章中,Android App Bundle 是 Android 應用預設的釋出格式。

在使用者裝置上,相比于通用 apk 檔案,使用 Android App Bundle 的應用檔案大小平均**縮減了 15%**。您隻需簡單地切換到 Android App Bundle,就可以利用其節約檔案大小和改進釋出,無需改變應用的任何代碼。在 2021 年下半年,Google Play 将要求 新的應用和遊戲以 Android App Bundle 的格式釋出。

想要了解更多關于如何建構您的第一個 Android App Bundle,請參閱這個系列 之前的文章。

當然您也可以利用 Play Feature Delivery 來進一步子產品化以及優化安裝應用。

為什麼需要子產品化應用和 Play Feature Delivery 呢?

子產品化應用會在應用的不同部分之間建立清晰的界限,這會帶來各種好處。

大多數情況下,您隻需要重新建構應用的一部分,這也可以幫助您縮短應用的建構時間。建構時間的縮短以及清晰的子產品界限可能會提高工程開發速度。

同時,從 Google Play Store 我們也可以發現:

應用的下載下傳大小每降低 3 MB 可以增加 1% 的下載下傳量

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

您可以使用 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 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 中的按需分發,請查閱:

  • Github 上 PlayCoreKtx 的示例工程
  • 視訊: 為您的應用配置 Play Feature Delivery - MAD Skills