首页 >移动DevOps >开发指南 >发布SDK接入

发布SDK接入

在接入阿里云移动SDK之前,请明确您已在阿里云移动研发平台 ( EMAS ) 上建立相关产品,并获得对应的appkey和appSecret。

注意

  • 为避免在日志中泄漏参数appkey/appsecret或App运行过程中产生的数据,建议线上版本关闭SDK调试日志。

  • 由于所有用户使用统一的SDK接入,在接入过程中需要在代码中设置appkey/appsecret参数,而此类参数与计量计费密切相关,为防止恶意反编译获取参数造成信息泄漏,建议您开启混淆,并进行App加固后再发布上线。

一、Android SDK接入

1、添加依赖Maven仓库依赖接入

在项目build.gradle中添加阿里云Maven仓库地址:

repositories {
    maven { url "http://maven.aliyun.com/nexus/content/repositories/releases" }
}

app模块的build.gradle的dependencies节点内添加:

compile 'com.taobao.android:update-main:1.1.14-open'

2、接入服务

在自定义Application类的onCreate里面启动服务:

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        initUpdate();
    }
    private void initUpdate() {
        //以下引号部分需要客户根据自己的应用进行配置()
        Config config = new Config();
        //填写appkey
        config.group = "${appkey}" + "@android";   
        //渠道号
        config.ttid = "${渠道号}";    
        config.isOutApk = false;
        //app name
        config.appName = "${appname}"; 
        
        //设置自定义弹窗
        setCustomDialog(this, true);
        //初始化
        UpdateRuntime.init(this, config.ttid, config.appName, config.group);
        UpdateDataSource.getInstance().init(this, config.group, config.ttid, config.isOutApk, 
             "${appkey}", "${appsecret}", "${渠道号}", new UpdateAdapter());
        //设置是否开启缓存,true开启,false关闭
        UpdateDataSource.getInstance().setEnableCache(true);
        //设置缓存有效时间,单位ms,eg: 缓存有效时间12h
        UpdateDataSource.getInstance().setCacheValidTime(12 * 60 * 60 * 1000);
        //true:同步, false:异步
        UpdateDataSource.getInstance().startUpdate(false);
    }

     /* 设置自定义弹窗
      * @param context Context 
      * @param customDialog 是否自定义弹窗
     */
     private void setCustomDialog(final Context context, boolean customDialog) {
         ApkUpdater apkUpdate = new ApkUpdater(context);
         apkUpdate.setUpdateLog(updateLog);
         //设置apk下载进度回调
         apkUpdate.setApkDownloadListener(new ApkDownloadListener() {
             @Override
             public void onPreDownload() {
                //下载开始
             }

             @Override
             public void onDownloadProgress(int progress) {
                //下载进行中
             }

             @Override
             public void onStartFileMd5Valid(String filePath, String fileSize) {
                //开启文件md5校验
             }

             @Override
             public void onFinishFileMd5Valid(boolean success) {
                //完成文件校验
             }

             @Override
             public void onDownloadFinish(String url, String filePath) {
                //下载完成
             }

             @Override
             public void onDownloadError(String url, int errorCode, String msg) {
                //下载出错
             }
         });
         if (customDialog) {
             //自定义有更新信息时的Dialog
             apkUpdate.setUpdateNotifyListener(new UpdateNotifyListener() {
                 @Override
                 public void onNotify(Activity activity, CustomUpdateInfo customUpdateInfo, final UserAction userAction) {
                     AlertDialog.Builder builder = new AlertDialog.Builder(activity);
                     builder.setTitle("新版本升级");
                     builder.setMessage(customUpdateInfo.getInfo() + "\n版本:" + customUpdateInfo.getVersion() + "\n安装包大小:" + customUpdateInfo.getSize() + "\n是否强制升级:" + customUpdateInfo.isForceUpdate());
                     builder.setCancelable(false);
                     builder.setPositiveButton(userAction.getConfirmText(), new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            userAction.onConfirm();
                            dialogInterface.dismiss();
                        }
                    });
                    builder.setNegativeButton(userAction.getCancelText(), new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            userAction.onCancel();
                            dialogInterface.dismiss();
                        }
                    });
                    builder.create().show();
                 }
             });
             //如果是强制更新,用户点击更新Dialog的取消按钮时会弹出这个Dialog;如果不是强制更新,则不会弹出这个Dialog
             apkUpdate.setCancelUpdateNotifyListener(new UpdateNotifyListener() {
                 @Override
                 public void onNotify(Activity activity, CustomUpdateInfo customUpdateInfo, final UserAction userAction) {
                     AlertDialog.Builder builder = new AlertDialog.Builder(activity);
                     builder.setTitle("强制升级取消提示");
                     builder.setMessage(customUpdateInfo.getInfo());
                     builder.setCancelable(false);
                     builder.setPositiveButton(userAction.getConfirmText(), new DialogInterface.OnClickListener() {
                         @Override
                         public void onClick(DialogInterface dialogInterface, int i) {
                             userAction.onConfirm();
                             dialogInterface.dismiss();
                         }
                     });
                     builder.setNegativeButton(userAction.getCancelText(), new DialogInterface.OnClickListener() {
                         @Override
                         public void onClick(DialogInterface dialogInterface, int i) {
                             userAction.onCancel();
                             dialogInterface.dismiss();
                         }
                     });
                     builder.create().show();
                 }
             });
             //apk下载完成后,安装Dialog
             apkUpdate.setInstallUpdateNotifyListener(new UpdateNotifyListener() {
                 @Override
                 public void onNotify(Activity activity, CustomUpdateInfo customUpdateInfo, final UserAction userAction) {
                     AlertDialog.Builder builder = new AlertDialog.Builder(activity);
                     builder.setTitle("个性化安装");
                     builder.setMessage(customUpdateInfo.getInfo());
                     builder.setCancelable(false);
                     builder.setPositiveButton(userAction.getConfirmText(), new DialogInterface.OnClickListener() {
                         @Override
                         public void onClick(DialogInterface dialogInterface, int i) {
                             userAction.onConfirm();
                             dialogInterface.dismiss();
                         }
                     });
                     builder.setNegativeButton(userAction.getCancelText(), new DialogInterface.OnClickListener() {
                         @Override
                         public void onClick(DialogInterface dialogInterface, int i) {
                             userAction.onCancel();
                             dialogInterface.dismiss();
                         }
                     });
                     builder.create().show();
                 }
             });
             //自定义更新结果提示
             apkUpdate.setUpdateResultListener(new UpdateResultListener() {
                 @Override
                 public void onFinish(int i, int i1, String s) {
                     
                 } 
             });
         } else {
             //接口设为null,则弹窗默认使用SDK内置的Dialog
             apkUpdate.setUpdateNotifyListener(null);
             apkUpdate.setCancelUpdateNotifyListener(null);
             apkUpdate.setInstallUpdateNotifyListener(null);
         }
         //自定义日志接口
         apkupdate.setUpdateLog(new IUpdateLog() {
            @Override
            public void d(String s) {

            }

            @Override
            public void d(String s, Throwable throwable) {

            }

            @Override
            public void e(String s) {

            }

            @Override
            public void e(String s, Throwable throwable) {

            }

            @Override
            public void i(String s) {

            }

            @Override
            public void i(String s, Throwable throwable) {

            }

            @Override
            public void w(String s) {

            }

            @Override
            public void w(String s, Throwable throwable) {

            }

            @Override
            public void v(String s) {

            }

            @Override
            public void v(String s, Throwable throwable) {

            }
        });
    }
}

AndroidManifest.xml里面指定自定义Application:

<application
    android:name=".MyApplication"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme" >
</application>

AndroidManifest.xml里面Application标签内注册FileProvider,如示例:

<provider
    android:name="com.taobao.update.provider.UpdateProvider"
    android:authorities="${applicationId}.update.provider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/apk_paths" />
</provider>

说明

@xml/apk_paths已经包含在SDK中,客户无需自定义该文件。

3、接口说明

3.1 前后台查询更新
  • 手动触发更新接口。 每次都会请求接口,不会使用缓存。

    //参数指定同步/异步,true是同步,false是异步
    UpdateDataSource.getInstance().startManualUpdate(false) 
  • 自动触发更新接口。如果开启了缓存且在缓存有效期内,则优先使用缓存。

    //参数指定同步/异步,true是同步,false是异步
    UpdateDataSource.getInstance().startUpdate(false)

3.2 缓存功能说明

注意

如果是调用UpdateDataSource.getInstance().startManualUpdate()方法,不会使用缓存。

开启缓存功能后,每次请求更新接口前会先检查本地是否有之前接口Response的缓存,如果有且在缓存有效时间内,则直接使用本地缓存的