在客户端预置 Android 小程序

传统的小程序技术容易受到网络环境影响,当网络质量不佳时可能拉取不到小程序包。通过预置小程序即可规避该问题。本文介绍了预置小程序的原理和预置小程序的实现过程。

什么是预置小程序

预置小程序是指将小程序的渲染、逻辑、配置等静态资源打包在一个压缩包内,客户端预先下载小程序包到本地,并直接从本地加载资源的过程。预置小程序可以最大程度地摆脱网络环境对 mPaaS 小程序页面的影响。使用预置包可带来以下优势:

  • 提升用户体验 通过预置包的方式把页面内静态资源嵌入到应用中并随应用一起发布,可使用户第一次打开应用时无需依赖网络环境去下载资源,可直接开始使用。

  • 实现动态更新 在推出新版本或紧急发布时,可以在小程序 IDE 中进行迭代开发,通过 mPaaS 控制台发布,客户端中集成的小程序 SDK 会自动将小程序更新到最新的版本。这种发布无需通过应用商店审核,可以让用户及早接收到更新。

结构及使用

本文从以下方面介绍了预置小程序:

  • 小程序预置包的结构

  • 小程序预置包的使用过程

小程序预置包的结构

小程序预置包是一个 .amr 格式的压缩文件,将后缀 .amr 改为 .zip 并解压缩后,可以看到其中包含的 HTML 资源和 JavaScript 代码等。待小程序容器加载后,这些资源和代码能在 UC 内核渲染。

以 Android 系统为例,下面显示了一般资源包的目录结构:

  • 一级目录:一般为资源包的 ID,如 2020121620201216_1.0.1.0.zip

  • 二级目录及往后即为业务自定义的资源文件。并设定当前预置包默认打开的主入口文件,如 /index.html

小程序预置包的使用过程

使用小程序预置包的过程可以分为以下三个步骤:

  1. 请求包信息。 即从服务端请求小程序包,并将小程序包信息存储到本地数据库的过程。包信息包含了小程序包的下载地址、小程序包版本号等。

  2. 下载小程序包。 把小程序包从服务端下载到手机。

  3. 安装小程序包。 下载目录,拷贝到手机安装目录。

前提条件

操作步骤

  1. 预置小程序包。

    1. 在 mPaaS 控制台发布小程序包并下载 AMR 文件和配置文件。

    2. 将下载到的 AMR 文件和配置文件放置在 mPaaS 项目的 assets 目录下。

    3. 在工程中添加预置代码,以在应用启动时调用预置代码安装应用。预置代码示例如下:

      new Thread(new Runnable(){
      @Override
      public void run(){
       MPNebula.loadofflineNebula(jsonFileName: "h5_json.json",
                                 new MPNebulaOfflineInfo(offLineFileName:"2020121620201216_1.0.1.0.amr",
                                                        addId:"2020121620201216",
                                                        version:"1.0.1.0"));
      }
      }).start();
      说明

      • 此方法为阻塞调用,请勿在主线程上调用内置预置包方法。

      • 此方法仅能调用一次。若多次调用,仅第一次调用有效。所以需要一次性传入所有需预置包信息。

      • 如果内置多个 AMR 包,需要确保文件已存在;如不存在,会造成其他内置预置包失败。

  2. 启动小程序。启动小程序的示例代码如下。

     /**
     * 启动小程序
     *
     * @param appId 小程序id
     */
     public static void startApp(String appId);
  3. 更新小程序。 默认情况下,每次打开应用,小程序 SDK 都会尝试检查是否有可更新的版本。出于减少服务端压力的考虑,该检查有时间间隔限制,默认为 30 分钟。如果想立即检查最新可用版本,可调用下方的代码来请求更新。一般情况下,可以在应用启动或者用户登录后调用。

    MPNebula.updateAllApp(new MpaasNebulaUpdateCallback(){
     @Override
     public void onResult(final boolean success, final boolean isLimit) {
         super.onResult(success, isLimit);
         runOnUiThread(new Runnable() {
             @Override
             public void run() {
                 AUToast.makeToast(NebulaAppActivity.this,
                         success ? R.string.update_success : R.string.update_failure, 2000).show();
             }
         });
     }
    });
  4. 校验安全签名。 小程序具有签名校验机制,防止恶意程序篡改下载到设备的小程序包。通过调用 MPNebula 接口设置验签参数即可开启此机制。如果您使用的基线是 10.1.60 或以上版本,需要额外开启容器配置,详情参见 H5 容器配置

    说明

    • 请在第一次打开小程序包前调用 MPNebula 接口,否则将会导致公钥初始化失败。关于公钥与私钥,请参见 配置小程序包 > 密钥管理

    • 无论客户端是否开启签名校验,在被判断为 root 的手机上都会强制进行签名校验。

    /**
    * @param publicKey 验签公钥
    */
    public static void enableAppVerification(final String publicKey)
  5. 删除本地小程序。 Nebula 提供了删除本地应用信息的接口。当本地应用信息被删除后,再次打开应用时会重新请求服务端下载、更新本地小程序的信息。

    public class MPNebula {
     // appId 为小程序的应用 ID
     public static boolean deleteAppInfo(String appId);
    }
    说明

    此 API 在 10.1.68 系列和 10.1.60 系列支持的最低基线版本分别为 10.1.68.8 和 10.1.60.14 。