全部产品

SDK API

更新时间:2020-10-10 15:59:07

initialize方法

initialize(): <必选>

该方法主要做些必要的初始化工作以及如果本地有补丁的话会加载补丁,但不会自动请求补丁。因此需要自行调用queryAndLoadNewPatch方法拉取补丁。initialize调用需要尽可能的早,必须在Application的attachBaseContext方法的最前面调用(在super.attachBaseContext之后,如果有Multidex,也需要在Multidex.install之后),initialize()方法调用之前你需要先调用如下几个方法进行一些必要的参数设置,方法调用说明如下:

setContext(application): <必选>

传入入口Application即可

setAppVersion(appVersion): <必选>

应用的版本号,拉取补丁时对应控制台创建的版本。

举例:

  • setAppVersion传1.0.0,控制台创建1.0.0的版本号然后发布补丁,这样拉取对应版本号下的补丁。
  • setAppVersion传1.0.0加载了对应的补丁,升级安装新的apk后传1.0.1,会自动清理1.0.0的补丁。

setSecretMetaData(idSecret, appSecret, rsaSecret): <可选,推荐使用>

三个Secret分别对应AndroidManifest里面的三个参数,可以不在AndroidManifest设置而是用此函数来设置Secret。放到代码里面进行设置可以自定义混淆代码,更加安全,此函数的设置会覆盖AndroidManifest里面的设置,如果对应的值设为null,默认会在使用AndroidManifest里面的。

setEnableDebug(isEnabled): <可选>

isEnabled默认为false,是否打开调试模式,调试模式下会输出日志以及不进行补丁签名校验。线下调试此参数可以设置为true,查看日志过滤TAG:Sophix,同时强制不对补丁进行签名校验,所有就算补丁未签名或者签名失败也发现可以加载成功。

注意:正式发布该参数必须为false,false会对补丁做签名校验,否则就可能存在安全漏洞风险。

setAesKey(aesKey): <可选>

用户自定义aes秘钥,会对补丁包采用对称加密。这个参数值必须是16位数字或字母的组合,是和补丁工具设置里面AES Key保持完全一致,补丁才能正确被解密进而加载。此时平台无感知这个秘钥,所以不用担心阿里云移动平台会利用你们的补丁做一些非法的事情。

setPatchLoadStatusStub(new PatchLoadStatusListener()): <可选>

设置patch加载状态监听器,该方法参数需要实现PatchLoadStatusListener接口,接口说明见下文PatchLoadStatusListener说明。

setUnsupportedModel(modelName, sdkVersionInt): <可选>

把不支持的设备加入黑名单,加入后不会进行热修复。

  • modelName为该机型上Build.MODEL的值,这个值也可以通过adb shell getprop | grep ro.product.model取得。
  • sdkVersionInt就是该机型的Android版本,也就是Build.VERSION.SDK_INT,若设为0,则对应该机型所有安卓版本。

说明:目前控制台也可以直接设置机型黑名单,更加灵活。详情请参见机型过滤

queryAndLoadNewPatch方法

该方法主要用于查询服务器是否有新的可用补丁。SDK内部限制连续两次queryAndLoadNewPatch()方法调用不能短于3s,否则的话就会报code:19的错误码。 如果查询到可用的话,首先下载补丁到本地,然后:

  • 应用原本没有补丁,那么如果当前应用的补丁是热补丁,那么会立刻加载(不管是冷补丁还是热补丁)。如果当前应用的补丁是冷补丁,那么需要重启生效。
  • 应用已经存在一个补丁,请求发现有新补丁后,本次不受影响。并且在下次启动时补丁文件删除,下载并预加载新补丁,在下下次启动时应用新补丁。

说明:补丁在后台发布之后,并不会主动下行推送到客户端,需要手动调用queryAndLoadNewPatch方法查询后台补丁是否可用。

  • 只会下载补丁版本号比当前应用存在的补丁版本号高的补丁,比如当前应用已经下载了补丁版本号为5的补丁,那么只有后台发布的补丁版本号>5才会重新下载。

移动热修复控制台上线了“全部回滚”补丁的功能,如果后台进行了“全部回滚”的操作,那么这个方法将会返回code:18的状态码。 此时本地补丁将会被强制清除,同时不清除本地补丁版本号。

killProcessSafely方法

可以在PatchLoadStatusListener监听到CODE_LOAD_RELAUNCH后在合适的时机,调用此方法杀死进程。

注意:不可以直接Process.killProcess(Process.myPid())来杀进程,这样会扰乱Sophix的内部状态。因此如果需要杀死进程,建议使用killProcessSafely方法,它在内部做一些适当处理后才杀死本进程。

cleanPatches()方法

清空本地补丁,并且不再拉取被清空的版本的补丁。正常情况下不需要开发者自己调用,因为Sophix内部会判断对补丁引发崩溃的情况进行自动清空。

PatchLoadStatusListener接口

该接口需要自行实现并传入initialize方法中,补丁加载状态会回调给该接口,参数说明如下:

  • mode:无实际意义,为了兼容老版本,默认始终为0
  • code:补丁加载状态码,详情查看PatchStatus类说明
  • info:补丁加载详细说明
  • handlePatchVersion:当前处理的补丁版本号,0:无;-1:本地补丁;其它:后台补丁

setTags接口 [v3.2.7新增]

该参数设置端上拉取补丁包时的标签,可以支持条件更为丰富的灰度发布,以下为简单示例:

  1. List<String> tags = new ArrayList<>();
  2. tags.add("test");
  3. //此处调用在queryAndLoadNewPatch()方法前
  4. SophixManager.getInstance().setTags(tags);
  1. List<String> tags = new ArrayList<>();
  2. tags.add("production");
  3. //此处调用在queryAndLoadNewPatch()方法前
  4. SophixManager.getInstance().setTags(tags);

如上,设置不同的tags,同一版本号下,可以打两个或者多个基线包,线上发布时用production的基线包,测试环境用test的基线包,这样就可以测试同一版本号下的同一个补丁了,两个环境互不影响。tags可以add多个,结构为前后非空字符串即可。生成补丁时,用同样tags的基线包和修复包。