省流更新SDK使用说明 - GrouthDownload/TDownloadSDK GitHub Wiki

  应用宝省流量更新SDK提供应用更新升级服务:应用的新版本在应用宝开发平台上架之后,便可通过SDK获取到应用的升级信息。应用升级信息通常分为以下两类:

  1. 普通更新: 下载新版本应用的全量Apk文件,完成升级;
  2. 增量更新: 下载新版本应用与旧版本应用的差分文件,下载完成之后利用本地已安装的旧版Apk文件和所下载的差分文件合成新版本Apk。
    普通更新逻辑简单,适合apk包文件体积小的应用;增量更新只下载新旧版本Apk文件的差异文件(差异文件的大小因新旧版本Apk而异,新版本与旧版本差异小的情况下,差异文件的文件大小会非常小),节省用户流量,提高升级效率。   由于增量更新涉及比较复杂的合成逻辑,所以此类升级方式只能依赖应用宝App才能完成;普通更新仅需要下载Apk文件,可以在SDK内独立完成,不需要应用宝App介入。

0 省流量更新SDK接入

添加maven仓库

maven {
   url "http://maven.oa.com/nexus/content/repositories/thirdparty"
}

在模块中添加依赖

   implementation "com.tencent.basicservices:patch_update:1.0.2-release102-WithJce-HideHalley-4001"

1 省流量更新SDK初始化

  在调用省流量更新SDK提供的接口前,需要对SDK进行初始化。省流量更新SDK初始化涉及参数代码如下所示:

private String mAppKey    = "SuperDownTestDemo2";
private String mAppSecret = "dd40b776992873be708858471220d5b3";

private void initSelfUpdateSDK() {
    Map<String, String> initMap = new HashMap<>();

    initMap.put(InitParam.APP_KEY, mAppKey);
    initMap.put(InitParam.APP_SECRET, mAppSecret);
    initMap.put(UpdateConst.INIT_PARAM.YYB_APK_CHANNEL_ID, "990483");
    initMap.put(UpdateConst.INIT_PARAM.HOST_APP_CHANNEL_ID, "000116083735373738333534");
    initMap.put(UpdateConst.INIT_PARAM.VIA, "ANDROIDQQ.YYB.SELFUPDATE");
    SelfUpdateSDK.init(this, initMap);
}

初始化参数中:   1) appKey/appSecret属于公共参数,接入sdk时分配。   2) YYB_APK_CHANNEL_ID是指拉新应用宝时,下载的应用宝Apk的渠道号,由应用宝产品同学分配,接入时可联系产品同学提供。   3) HOST_APP_CHANNEL_ID是指App自身在应用宝数据源的渠道信息,对应于qms上的channleID字段信息,用于跳转应用宝时下载指定渠道的Apk,如若不需指定渠道,不填即可,切忌填写错误的渠道号。   4) VIA是指用于应用宝识别来源方的字段信息,由应用宝产品同学分配,接入时可联系产品同学提供。

2 应用更新检查

检查应用更新首先需注册接收检查更新结果的监听器,监听器定义具体代码如下:

private ISelfUpdateListener mSelfUpdateListener = new ISelfUpdateListener() {
    @Override
    public void onUpdateStateChanged(TMAppUpdateInfo tmAppUpdateInfo) {
        Log.i(TAG, ">onUpdateStateChanged " + tmAppUpdateInfo);
        //执行更新时,下载任务状态回调
    }

    @Override
    public void onUpdateProgressChanged(TMAppUpdateInfo tmAppUpdateInfo) {
        Log.i(TAG, ">onUpdateProgressChanged " + tmAppUpdateInfo);
        //执行更新时,下载任务进度回调
    }

    @Override
    public void onCheckUpdateSucc(TMAppUpdateInfo tmAppUpdateInfo) {
        Log.i(TAG, ">onCheckUpdateSucc " + tmAppUpdateInfo);
        //检查更新协议成功,接收到更新数据
    }

    @Override
    public void onCheckUpdateFailed(int errorCode) {
        //检查更新协议请求失败
    }
};

  监听器中包括两部分:下载任务相关的回调、检查更新相关的回调。检查更新时只涉及检查更新相关的回调。   注册监听器,并触发检查更新动作:

SelfUpdateSDK.get().addSelfUpdateListener(mSelfUpdateListener);
SelfUpdateSDK.get().checkSelfUpdate();

  当SDK接收到后台返回的更新数据后,通过已注册的监听器告知调用方。

3 使用SDK进行自升级

  调用检查更新接口成功接收到更新信息(TMAppUpdateInfo 结构体)后,可通过updateMethod字段判断更新类型,具体类型描述如下代码所述:

private TMAppUpdateInfo mAppUpdateInfo;
private void checkUpdateType() {
    if (mAppUpdateInfo.updateMethod == UpdateConst.TYPE.NO_UPDATE) {
        //无更新
    } else if (mAppUpdateInfo.updateMethod == UpdateConst.TYPE.NORMAL_UPDATE) {
        //普通更新
    } else if (mAppUpdateInfo.updateMethod == UpdateConst.TYPE.PATCH_UPDATE) {
        //增量更新
    }
}

  当更新类型为普通更新(后台未返回增量更新数据,无法进行增量更新)时,建议使用SDK进行自升级。   第2节已注册更新过程的回调监听器,只需调用SDK更新接口即可开始执行更新流程:

SelfUpdateSDK.get().startSelfUpdateBySDK(mAppUpdateInfo);

  任务的下载进度和状态变化会通过监听器回调给调用方。暂停下载任务的接口如下:

SelfUpdateSDK.get().pauseSelfUpdateBySDK(mAppUpdateInfo);

  自升级任务的状态用TMAppUpdateInfo 结构体的updateState字段区分,updateState字段的值对应的含义如下代码所示:

private String getShowText(int updateState) {
    String text = "";
    switch (updateState) {
        case UpdateConst.UPDATE_STATE.WATING:
            text = "等待开始下载...";
            break;
        case UpdateConst.UPDATE_STATE.DOWNLOADING:
            text = "下载中";
            break;
        case UpdateConst.UPDATE_STATE.DOWNLOAD_PAUSED:
            text = "已暂停";
            break;
        case UpdateConst.UPDATE_STATE.DOWNLOAD_FAILED:
            text = "下载失败";
            break;
        case UpdateConst.UPDATE_STATE.DOWNLOAD_DELETED:
            text = "下载删除";
            break;
        case UpdateConst.UPDATE_STATE.DOWNLOAD_SUCC:
            text = "自更新任务下载成功";
            break;
        case UpdateConst.UPDATE_STATE.SELF_UPDATE_FAILED:
            text = "自更新任务失败";
            break;
        case UpdateConst.UPDATE_STATE.INSTALL_SUCC:
            text = "自更新任务安装成功";
            break;
        default:
            text = "UNKNOWN";
            break;
    }
    return text;
}

4 使用YYB进行自升级

  类似于SDK升级流程,当检查更新的结果为增量更新时,建议使用YYB进行自更新(否则使用SDK升级即普通更新效果)。   开始自更新和暂停自更新接口调用如下:

SelfUpdateSDK.get().startSelfUpdateByYYB(mAppUpdateInfo);
SelfUpdateSDK.get().pauseSelfUpdateByYYB(mAppUpdateInfo);

  使用YYB进行自更新时,前提条件是需要用户已安装应用宝App。腾讯下载SDK提供判断应用宝是否安装的接口。另外,也提供下载应用宝Apk相关服务的接口。

监听下载应用宝APK任务的状态

初始化监听器:

private TaskListener mYYBDownloadListener = new TaskListener() {
    @Override
    public void onTaskStart(DownloadInfo downloadInfo) {
    }

    @Override
    public void onTaskStateChanged(DownloadInfo downloadInfo) {
        Log.i(TAG, ">onTaskStateChanged " + downloadInfo);
    }

    @Override
    public void onTaskProgressChanged(DownloadInfo downloadInfo) {
        Log.i(TAG, ">onTaskProgressChanged " + downloadInfo);
    }

    @Override
    public void onInstallStart(DownloadInfo downloadInfo) {

    }

    @Override
    public void onInstalled(DownloadInfo downloadInfo) {
        Log.i(TAG, ">onInstalled " + downloadInfo);
    }
};

注册监听器:

SelfUpdateSDK.get().registerDownloadYYBApkListener(mYYBDownloadListener);

  触发应用宝Apk下载任务的方式有两种:     1.静默预下载;     2.调用YYB自升级接口自动触发。   两者的区别是:预下载不会主动拉起安装,而调用YYB自升级接口自动触发会主动拉起应用宝安装。

   预下载应用宝调用:

int ret = SelfUpdateSDK.get().preDownloadYYB();
if (ret == DownloadConst.ALREADY_SUCC_ERROR) {
    Log.e(TAG, "应用宝已经预下载完成了");
}

5 TMAppUpdateInfo字段说明

  TMAppUpdateInfo结构体贯穿整个自升级过程,它的主要字段及含义如下:

字段名称 含义
updateMethod 更新类型,值含义参考UpdateConst#TYPE
newApkSize 新版本apk全量包大小
patchSize 增量包大小,仅在增量更新类型时值才有效
newFeature 新版本特性文案
updateDownloadUrl 新版本下载链接
packageName 包名
versionName 版本名
versionCode 版本号
fileMd5 新版本文件MD5
apkId 新版本apkId
appId 新版本appId
updateState 任务所处状态
downloaderType 下载器类型标识,值含义参考UpdateConst#DownloaderType
apkPath 最终apk路径
receivedLength 已接收到的任务大小
totalLength 任务总大小
updateErrorCode 任务出错时的错误码
updateErrorMsg 任务出错时的错误信息
downloadErrorCode 下载过程的错误码,由下载模块定义
pauseOnMobile 任务是否需要在移动网络下自动暂停
hostChannelId 任务包名对应的APP在应用宝数据源的渠道信息
via 业务VIA,标识来源

6 省流量更新SDK交互补充

image.png

6.1 判断应用宝是否安装,显示不同界面

if(SelfUpdateSDK.get().isYYBInstalled()) {
    // TODO : 应用宝安装,只显示极速更新按钮
} else {
    // TODO : 应用宝未安装,显示极速更新以及普通更新两个按钮
    // 注册应用宝安装包下载情况监听器,注册监听器可挪至其它更早的位置,具体参考省流量更新文档
    SelfUpdateSDK.get().registerDownloadYYBApkListener(taskListener);
    // 基础服务SDK中base库提供网络环境查询
    // 当前连接WIFI
    if(NetworkUtil.isWifi()) {
        // Wifi状态下后台开始静默下载
        SelfUpdateSDK.get().preDownloadYYB();
    }
}

  通过SelfUpdateSDK.get().isYYBInstalled()来判断应用宝是否安装。   应用宝已安装返回true,此时只显示极速更新按钮。   应用宝未安装返回false,此时显示两个按钮,分别为极速更新按钮以及普通更新按钮。   应用宝未安装时,注册一个应用宝下载状况监听器(TaskListener),用来获取应用宝的下载状况信息。应用宝未安装时当前网络状态为Wifi连接时(这里在腾讯下载sdk的base组件中提供网络环境查询函数),后台对应用宝进行静默下载,静默下载调用SelfUpdateSDK.get().preDownloadYYB()。

6.2 点击极速更新按钮

/**
 * 极速更新点击时响应伪代码
 */
public void onClick_SpeedUpdate() {
    if(SelfUpdateSDK.get().isYYBInstalled()) {
        // 应用宝已安装, 拉起应用宝极速更新
        // tmAppUdateInfo为更新应用的信息,类型TMAppUpdateInfo
        // tmAppUdateInfo获取可通过检查更新回调获取,如何进行检查更新参考省流量更新文档
        SelfUpdateSDK.get().startSelfUpdateByYYB(tmAppUpdateInfo);
    } else {
        int ret = SelfUpdateSDK.get().preDownloadYYB();
        // 应用宝未安装但是静默下载完成
        if(ret == DownloadConst.ALREADY_SUCC_ERROR) {
            // 弹出应用宝安装界面,tmYYBUpdateInfo为应用宝应用的信息,类型TMAppUpdateInfo
            SelfUpdateSDK.get().startSelfUpdateByYYB(tmYYBUpdateInfo);
        } else {
            // TODO : 应用宝未安装并且下载未完成,极速更新变为应用宝安装包的下载进度
            // TODO : 下载进度的更新获取可通过应用宝安装包下载情况监听器获取,监听onTaskProgressChanged
        }
    }
}

  当点击极速更新按钮,存在两种情况,一种是已安装应用宝(只存在极速更新按钮),另一种是未安装应用宝(同时存在极速更新和普通更新按钮)。   1)  已安装应用宝     点击极速更新按钮,拉起应用宝并进行更新应用,此时调用     SelfUpdateSDK.get().startSelfUpdateByYYB(tmAppUpdateInfo)     tmAppUpdateInfo为更新应用的更新信息,具体类型为TMAppUpdateInfo。可通过检查更新回调监听器(ISelfUpdateListener)获取应用的TMAppUpdateInfo。   2)  未安装应用宝     点击极速更新按钮,如果应用宝静默下载完成,则直接拉起应用宝安装,拉起应用宝调用应用宝的自升级接口自动触发。此时调用     SelfUpdateSDK.get().startSelfUpdateByYYB(tmYYBUpdateInfo)     tmYYBUpdateInfo为应用宝的更新信息,具体类型为TMAppUpdateInfo。     如果应用宝静默下载未完成,则通过应用宝安装包下载安装监听器(TaskListener)中回调函数onTaskProgressChanged、onTaskStateChanged等获取进度变化以及状态变化。

6.3 点击普通更新按钮

/**
 * 普通更新点击时响应
 */
public void onClick_GeneralUpdate() {
    // 使用SDK自升级
    SelfUpdateSDK.get().startSelfUpdateBySDK(tmAppUpdateInfo);
    // TODO : 显示普通下载进度变化条
}

  当点击普通更新按钮,直接通过SDK进行下载。此时调用   SelfUpdateSDK.get().startSelfUpdateBySDK(tmAppUpdateInfo)   tmAppUpdateInfo为更新应用的更新信息,具体类型为TMAppUpdateInfo。SDK下载进度以及下载状态可通过设置SDK下载监听器(ISelfUpdateListener)获取到。

7 接入测试用例

用例名称 用例描述 前提条件 操作步骤 期待结果
未安装应用宝进行省流量更新 未安装应用宝时点击省流量更新按钮 检测到新版本且未安装应用宝 1.启动应用,显示省流量更新按钮和普通更新按钮。2.点击省流量更新按钮。 1.后台静默下载应用宝安装包。2.点击省流量更新后应用宝安装包下载完成则拉起安装,下载未完成则提示应用宝的下载进度。3.应用宝安装包拉起安装,但是用户拒绝安装,给出提示省流量更新失败。4.应用宝安装成功,跳转应用宝并省流量更新应用。
未安装应用宝进行普通更新 未安装应用宝时点击普通更新按钮 检测到新版本且未安装应用宝 1.启动应用,显示省流量更新按钮和普通更新按钮。2.点击普通更新按钮。 1.后台静默下载应用宝安装包。 2.开始下载应用最新安装包,完成后拉起安装。
安装应用宝进行省流量更新 已安装应用宝点击省流量更新按钮 检测到新版本且安装应用宝 1.启动应用,只显示省流量更新按钮。2.点击省流量更新按钮。 跳转到应用宝界面并省流量更新应用。