欢迎参加我们将于 6 月 3 日举行的 #Android11:Beta 版发布会

验证非 Google Play 应用安装

“旁加载”指的是在不使用 Google Play 等应用商店的情况下,在设备上手动安装应用。由于旁加载会绕过应用商店,因此在将应用下载到您的设备之前,您不会受益于 Google Play 执行的安全性检查、验证检查和兼容性检查。如果应用未正确安装,则可能会导致运行时崩溃。

例如,假设某个使用 Android App Bundle 的应用通过拆分 APK 来优化应用下载大小。当用户从 Google Play 商店下载该应用时,商店可确保设备下载并安装在此特定设备上运行该应用所需的全套拆分 APK。当您绕过 Google Play 来旁加载某个应用时,该平台没有足够的数据来验证应用安装,因此无法保证应用可正常工作。

本页面介绍了如何使用 Play 核心库 API 来妥善处理安装了应用基本 APK 但未安装其他所需的拆分 APK 的情况。在这种情况下,API 会向用户显示一个对话框以说明具体问题,并让用户通过 Google Play 商店正确安装应用,如图 1 所示。

图 1. Google Play 检测到应用安装不完整时出现的故障对话框

此 API 仅适用于搭载 Android 5.0(API 级别 21)或更高版本的设备,并且您还需要添加以下项目依赖项:

  • 在您的项目中添加 Play 核心库 1.6.0 或更高版本。
  • 下载 bundletool 0.9.0 或更高版本。或者,如果您使用 Android Gradle 插件构建 App Bundle,请将以下内容添加到应用项目的 build.gradle 文件中:

    buildscript {
            dependencies {
                ...
                // Use bundletool 0.9.0 or higher when building with the
                // Android Gradle plugin.
                classpath 'com.android.tools.build:bundletool:0.9.0'
            }
        }
        

    您需要使用支持的工具之一,将应用构建为 Android App Bundle,然后将其上传到 Google Play。

检查是否缺少应用组件

如果您认为用户可能会旁加载您的应用,则应检查设备是否安装了运行您的应用所需的所有拆分 APK。您可以使用 Play 核心库执行此项检查,该库会将设备上当前安装的拆分 APK 与 Google Play 在指定设备上预期的 APK 进行比较。

要运行检查,请使用下述方法:

通过清单注册检查

如果您的应用没有实现自定义 Application 类,则要让 Google Play 验证应用安装情况,最简单的方法是通过应用清单注册检查(检查缺少的拆分 APK),如下所示:

<?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.myapplication" >
        <application
            ...
            android:name="com.google.android.play.core.missingsplits.MissingSplitsDetectingApplication" >
        </application>
        ...
    </manifest>
    

在自定义 Application 类中进行检查

如果您有自定义 Application 类,则只需使用 MissingSplitsManager 在您应用的 onCreate() 方法中执行检查即可,如下所示。

Kotlin

    class MyCustomApplication : Application {
        override fun onCreate() {
            if (MissingSplitsManagerFactory.create(this).disableAppIfMissingRequiredSplits()) {
                // Skip app initialization.
                return
            }

            super.onCreate()
            ...
        }
    }
    

Java

    public class MyCustomApplication extends Application {
        @Override
        public void onCreate() {

            if (MissingSplitsManagerFactory.create(this).disableAppIfMissingRequiredSplits()) {
                // Skip app initialization.
                return;
            }

            super.onCreate();
            ...
        }
    }

    

在内容提供程序中进行检查

如果用户可以通过内容提供程序访问您的应用,则您还需要在自定义 ContentProvider 中执行检查,如下所示。这是因为 Android 框架会在调用您应用的 Application.onCreate() 方法之前初始化您的内容提供程序。

Kotlin

    class ExampleProvider : ContentProvider {
        override onCreate(): Boolean {
            if (MissingSplitsManagerFactory.create(context).isMissingRequiredSplits) {
                // Skip provider initialization.
                return false
            }

            super.onCreate();
            ...
        }
    }
    

Java

    public class ExampleProvider extends ContentProvider {
        @Override
        public boolean onCreate() {

            if (MissingSplitsManagerFactory.create(getContext()).isMissingRequiredSplits()) {
                // Skip provider initialization.
                return false;
            }

            super.onCreate();
            ...
        }
    }