目录

1. 业务介绍

应用升级是指用户启动应用后应用后台主动检查新版本,或用户在应用的检查升级入口主动触发升级检查操作,HMS SDK从华为应用市场请求下载新版本应用并进行升级安装的过程。

具体交互细节如下:

  1. 用户启动应用或在应用内主动触发检查升级操作。

  2. 应用检查到更新后拉起升级确认页面。

  3. 用户确认升级后进入华为应用市场的应用升级页面,执行升级操作。

2. 开发准备

2.1 注册成为开发者

在开发应用前需要在华为开发者联盟网站上注册成为开发者并完成实名认证,具体方法可参考帐号注册认证。

2.2 创建应用

参见AppGallery Connect帮助中心的创建应用章节创建应用并上传一个临时APK包。

2.3 配置签名证书指纹

1、登录AppGallery Connect网站,选择“我的应用”。

2、点击需要配置的应用。

3、选择“开发”页签,在“项目设置”页面的“应用”区域,将“SHA256证书指纹”配置为应用的SHA256指纹。生成SHA256指纹的方法可参见生成签名证书指纹。

4、配置完成后点击。

2.4 集成HMS SDK

由于HMS SDK的升级能力集成在游戏服务中,在使用HMS SDK提供的应用升级能力前,需要先集成游戏服务SDK。如果应用已经集成游戏服务SDK,可跳过本章节。

2.4.1 在Android Studio项目中集成HMS SDK

针对AndroidStudio开发环境,华为提供了maven仓集成方式的HMS SDK包。在开始开发前,您需要将HMS SDK集成到您的AndroidStudio开发环境中。

1、在AndroidStudio开发环境中添加当前应用的AppGallery Connect配置文件。

    a. 登录AppGallery Connect 网站,选择“我的应用”。

    b. 点击需要配置的应用。

    c. 选择“开发”页签,在“项目设置”页面中,单击“应用”栏下的“agconnect-services.json”下载配置文件。

    d. 将“agconnect-services.json”文件拷贝到应用级根目录下。

2、配置HMS SDK的maven仓地址和AppGallery Connect插件地址。

    a. 打开AndroidStudio项目级build.gradle文件。

    b. 在allprojects ->repositories里面配置HMS SDK的maven仓地址。

  1. allprojects {
  2.      repositories {
  3.        google()
  4.        jcenter()
  5.        maven {url 'https://developer.huawei.com/repo/'}
  6.      }
  7.    }

    c. 在buildscript->repositories中配置HMS SDK的maven仓地址。

  1. buildscript {
  2.      repositories {
  3.        google()
  4.        jcenter()
  5.        maven {url 'https://developer.huawei.com/repo/'}
  6.      }
  7. }

    d. 在buildscript->dependencies中配置AppGallery Connect插件地址。

  1. buildscript {
  2.      dependencies {
  3.       classpath 'com.huawei.agconnect:agcp:1.2.1.301'
  4.      }
  5. }

3、添加编译依赖和AppGallery Connect插件地址。

    a.打开应用级的build.gradle文件。

    b. 在文件尾添加AppGallery Connect插件依赖。

  1. apply plugin: 'com.huawei.agconnect'

    c. 在“dependencies”中添加如下编译依赖。

  1. dependencies {  
  2.  implementation 'com.huawei.hms:base:4.0.4.301'
  3.  implementation 'com.huawei.hms:game:4.0.3.301'
  4. }

4、重新打开修改完的build.gradle文件,右上方出现“Sync Now”链接。点击“Sync Now”等待同步完成。

2.4.2 在Eclipse项目中集成HMS SDK

针对Eclipse开发环境,华为提供了下载HMS SDK包本地集成的方式。在开始开发前,您需要将HMS SDK集成到您的Eclipse开发环境中。

下载SDK

1. 下载HMS Base SDK和要集成的服务SDK,并解压zip包。具体如下表,其中HMS Base SDK包含11个Library工程。

HMS Base SDK下载地址:HMS Base SDK

HUAWEI Game Service SDK下载地址:HUAWEI Game Service SDK

SDK包

SDK工程名

提供的能力

需求场景

HMS Base SDK

HMSSdkBase

HMS SDK核心功能包

该包必须集成

Agconnect-core

HMS SDK依赖包

HMSSdkAvailableUpdate
HMSSdkDevice
HMSSdkLog
HMSSdkStats
HMSSdkUI

Network-common

Network-grs

Tasks

Update

Game Service

Hmssdk-game

提供升级功能

升级能力


2. 将所有SDK工程导入到您的工作空间。

    a. 选择菜单“File > Import”,再选择“Android > Existing Android Code Into Workspace”,单击“Next”。

    

    b. 单击“Browse”,选择工程所在的文件夹目录。在“Projects”下显示待导入的工程,默认全部勾选,单击“Finish”。

说明:待导入的工程必须和工作空间在相同的磁盘空间里,例如都在“D:\”。如果不在,您可以选择“Copy projects into workspace”,将工程文件复制到工作空间。

    

添加工程依赖关系

1. 右键单击您的工程,选择“Properties”。

2. 在左侧选择“Android”,单击“Add”,选择已导入空间的工程,单击“Apply and Close”。

3. 右键单击HMSSdkAvailableUpdate工程,选择“Properties”。

4. 在左侧选择“Android”,单击“Add”,选择HMSSdkUI工程,单击“Apply and Close”。

5. 由于Eclipse的xml文件不支持$符号,将HMSSdkAvaliableUpdate和Agconnect-core工程下AndroidManifest.xml文件中的“${applicationId}”替换成您的应用包名。

  1. <application>
  2.  <provider
  3.    android:name="com.huawei.agconnect.core.provider.AGConnectInitializeProvider"
  4.    android:authorities="${applicationId}.AGCInitializeProvider"
  5.    android:exported="false" />
  6.  <service
  7.    android:name="com.huawei.agconnect.core.ServiceDiscovery"
  8.    android:exported="false" />
  9. </application>

拷贝HMSSdkStats资源文件到您的工程目录

将HMSSdkStats工程中assets目录下的资源文件拷贝到您的工程中assets目录下。

说明:如果依赖其他的kit资源,还需要复制对应kit的资源文件到您的工程目录下。

配置工程project.properties文件

打开您的工程的project.properties文件,添加如下代码,用于合并子工程中的Manifest文件。

  1. manifestmerger.enabled=true
说明:

ADT必须是17以上版本。

添加当前应用的AppGallery Connect配置文件

1. 登录AppGallery Connect 网站,选择“我的应用”。

2. 点击需要配置的应用。

3. 选择“开发”页签,在“项目设置”页面中,单击“应用”栏下的“agconnect-services.json”下载配置文件。

4. 由于eclipse不支持agcp插件,您需要将agconnect-services.json文件放置到您的工程assets目录下,并且在工程的Application子类中添加如下代码。如果工程没有Application子类,则需要您新建一个从Application继承的子类,例如新建MyApplication类。

  1. public class MyApplication extends Application{
  2.  @Override
  3.  public void onCreate() {
  4.    super.onCreate();
  5.  }
  6.  // TODO: Add the following code:
  7.  @Override
  8.  protected void attachBaseContext(Context context) {
  9.    super.attachBaseContext(context);
  10.    AGConnectServicesConfig config = AGConnectServicesConfig.fromContext(context);
  11.    config.overlayWith(new LazyInputStream(context) {
  12.      public InputStream get(Context context) {
  13.        try {
  14.          return context.getAssets().open("agconnect-services.json");
  15.        } catch (IOException e) {
  16.          return null;
  17.        }
  18.      }
  19.    });
  20.  }
  21.  // TODO: End
  22. }

添加代码后需要导入以下类:

  1. import java.io.IOException;
  2. import java.io.InputStream;
  3. import com.huawei.agconnect.config.AGConnectServicesConfig;
  4. import com.huawei.agconnect.config.LazyInputStream;
  5. import android.app.Application;
  6. import android.content.Context;
  7. import android.util.Log;

6. 打开您的工程AndroidManifest.xml文件,在“application”模块中添加Application子类名称,如果已经添加,则跳过此步骤。例如,添加MyApplication类名称。

  1. <application
  2.  android:name=".MyApplication"
  3.  …
  4.  >
  5. …

7. 在eclipse菜单栏中点击“Project”,执行“Clean”操作,即完成SDK集成。

2.5 配置混淆脚本

开发者编译APK前需要配置不要混淆HMS SDK,避免功能异常。

Android Studio开发环境里的配置文件是“proguard-rules.pro”,Eclipse开发环境里的配置文件是“proguard-project.txt”。

1. 打开工程的混淆配置文件。

2. 加入排除HMS SDK的混淆配置。

  1. -ignorewarnings
  2. -keepattributes *Annotation*
  3. -keepattributes Exceptions
  4. -keepattributes InnerClasses
  5. -keepattributes Signature
  6. -keepattributes SourceFile,LineNumberTable
  7. -keep class com.hianalytics.android.**{*;}
  8. -keep class com.huawei.updatesdk.**{*;}
  9. -keep class com.huawei.hms.**{*;}
  10. -keep class com.huawei.gamebox.plugin.gameservice.**{*;}
  11. -keep interface com.huawei.hms.analytics.type.HAEventType{*;}
  12. -keep interface com.huawei.hms.analytics.type.HAParamType{*;}
  13. -keep class com.huawei.hms.analytics.HiAnalyticsTools{
  14.        public static void enableLog();
  15.        public static void enableLog(int);
  16. }
  17. -keep class com.huawei.hms.analytics.HiAnalyticsInstance{*;}
  18. -keep class com.huawei.hms.analytics.HiAnalytics{*;}

3. 如果开发者使用了AndResGuard,需要在混淆配置文件中加入AndResGuard允许清单。

  1. "R.string.agc*",
  2. "R.string.hms*",
  3. "R.string.connect_server_fail_prompt_toast",
  4. "R.string.getting_message_fail_prompt_toast",    
  5. "R.string.no_available_network_prompt_toast",    
  6. "R.string.third_app_*",    
  7. "R.layout.hms*",      
  8. "R.drawable.upsdk*",    
  9. "R.color.upsdk*",  
  10. "R.dimen.upsdk*",  
  11. "R.style.upsdk*",
  12. "R.id.scroll_layout",
  13. "R.id.divider",
  14. "R.id.name_textview",
  15. "R.id.version_textview",
  16. "R.id.appsize_textview",
  17. "R.id.allsize_textview",
  18. "R.id.content_textview",
  19. "R.id.third_app_dl_progress_text",
  20. "R.id.cancel_bg",
  21. "R.id.third_app_dl_progressbar",
  22. "R.id.upsdk*",
  23. "R.string.upsdk*",
  24. "R.layout.upsdk*"

3. 应用升级

3.1 场景介绍

在应用启动完成后或用户在应用中主动检查应用新版本时,应用需要调用HMS SDK相关接口检测华为应用市场是否有新版本应用。如果需要升级,HMS SDK将拉起升级提示框提示用户在华为应用市场升级应用。

3.2 业务流程

  1. 用户触发检查升级操作,例如启动应用或主动在检查升级页面检查升级。

  2. 应用调用JosApps.getAppUpdateClient方法请求初始化AppUpdateClient实例。

  3. HMS SDK向应用返回当前应用的AppUpdateClient实例。

  4. 应用调用AppUpdateClient.checkAppUpdate方法请求检查应用是否有更新。

  5. HMS SDK在华为应用市场查询最新的应用版本信息。

  6. 华为应用市场向HMS SDK返回应用版本信息。

  7. HMS SDK通过回调方式将检查结果返回给应用。

  8. 应用从回调结果中onUpdateInfo方法返回的ApkUpgradeInfo实例确认应用是否有更新。
    ● 如果应用版本有更新则进行下一步。
    ● 如果应用版本没有更新,则流程结束。

  9. 应用调用AppUpdateClient.showUpdateDialog方法请求拉起升级提示页面。

  10. HMS SDK向用户拉起升级提示页面。

  11. 用户在升级确认页面中选择升级应用。

  12. HMS SDK向华为应用市场请求下载最新的应用安装包。

  13. 华为应用市场向HMS SDK返回应用软件包。

  14. HMS SDK在下载完成后启动应用安装。

3.3 开发步骤

涉及应用升级的关键开发步骤如下:

1、调用JosApps.getAppUpdateClient方法初始化AppUpdateClient对象。

  1. AppUpdateClient client = JosApps.getAppUpdateClient(this);

2、调用AppUpdateClient.checkAppUpdate方法检查升级版本。

(1) 调用checkAppUpdate方法。

  1. public void checkUpdate() {
  2.    AppUpdateClient client = JosApps.getAppUpdateClient(this);
  3.    client.checkAppUpdate(this, new UpdateCallBack(this));
  4. }

(2) 定义检查更新的回调方法,从回调结果中获取ApkUpgradeInfo对象。

  1. private static class UpdateCallBack implements CheckUpdateCallBack {
  2.    private GameApiActivity apiActivity;
  3.    private UpdateCallBack(GameApiActivity apiActivity) {
  4.        this.apiActivity = apiActivity;
  5.    }
  6.    public void onUpdateInfo(Intent intent) {
  7.        if (intent != null) {
  8.            // 获取更新状态码, Default_value为取不到status时默认的返回码,由应用自行决定
  9.            int status = intent.getIntExtra(UpdateKey.STATUS, DEFAULT_VALUE);
  10.            // 错误码,建议打印
  11.            int rtnCode = intent.getIntExtra(UpdateKey.FAIL_CODE, DEFAULT_VALUE);
  12.            // 失败信息,建议打印
  13.            String rtnMessage = intent.getStringExtra(UpdateKey.FAIL_REASON);
  14.            Serializable info = intent.getSerializableExtra(UpdateKey.INFO);
  15.            //可通过获取到的info是否属于ApkUpgradeInfo类型来判断应用是否有更新
  16.            if (info instanceof ApkUpgradeInfo) {
  17.                // 这里调用showUpdateDialog接口拉起更新弹窗,由于demo有单独拉起弹窗按钮,所以不在此调用,详见checkUpdatePop()方
  18.                apiActivity.showLog("There is a new update");
  19.                apiActivity.apkUpgradeInfo = (ApkUpgradeInfo) info;
  20.            }
  21.            apiActivity.showLog("onUpdateInfo status: " + status + ", rtnCode: " + rtnCode + ", rtnMessage: " + rtnMessage);
  22.        }
  23.    }
  24. }

3、当检查到应用版本有更新时,在checkAppUpdate的回调方法中调用AppUpdateClient.showUpdateDialog方法向用户弹出升级提示框。

  1. public void checkUpdatePop(boolean forceUpdate) {
  2.    AppUpdateClient client = JosApps.getAppUpdateClient(this);
  3.    client.showUpdateDialog(this, apkUpgradeInfo, forceUpdate);
  4.    Log.i(TAG, "checkUpdatePop success");
  5. }