Android三步集成阿里热修复——Sophix

准备工作

  • 打开阿里云
  • 找到产品
  • 找到移动热修复
  • 创建APP(在右上角)
  • 然后会有app id 等信息,配置会用到(复制的时候注意会有空格)

官方集成文档

1、配置

  • 添加maven仓库地址:
repositories {
   maven {
       url "http://maven.aliyun.com/nexus/content/repositories/releases"
   }
}
  • 添加gradle坐标版本依赖:
compile 'com.aliyun.ams:alicloud-android-hotfix:3.2.0'
  • 添加权限
<! -- 网络权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<! -- 外部存储读权限,调试工具加载本地补丁需要 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

注意 READ_EXTERNAL_STORAGE在6.0+需要动态获取的哦~

  • 在AndroidManifest.xml中间的application节点下添加如下配置:
<meta-data
android:name="com.taobao.android.hotfix.IDSECRET"
android:value="App ID" />
<meta-data
android:name="com.taobao.android.hotfix.APPSECRET"
android:value="App Secret" />
<meta-data
android:name="com.taobao.android.hotfix.RSASECRET"
android:value="RSA密钥" />
  • Application中初始化
public class App extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        // initialize最好放在attachBaseContext最前面,初始化直接在Application类里面,切勿封装到其他类
        SophixManager.getInstance().setContext(this)
                .setAppVersion(getVersionName())
                .setAesKey(null)
                .setEnableDebug(true)//正式发布该参数必须为false
                .setPatchLoadStatusStub(new PatchLoadStatusListener() {
                    @Override
                    public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {
                        // 补丁加载回调通知
                        if (code == PatchStatus.CODE_LOAD_SUCCESS) {
                            // 表明补丁加载成功
                        } else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
                            // 表明新补丁生效需要重启. 开发者可提示用户或者强制重启;
                            // 建议: 用户可以监听进入后台事件, 然后调用killProcessSafely自杀,以此加快应用补丁,详见1.3.2.3

                            //SophixManager.getInstance().killProcessSafely();

                        } else {
                            // 其它错误信息, 查看PatchStatus类说明
                        }
                    }
                }).initialize();

        // queryAndLoadNewPatch不可放在attachBaseContext 中,否则无网络权限,建议放在后面任意时刻,如onCreate中
        SophixManager.getInstance().queryAndLoadNewPatch();

    }

    public String getVersionName() {
        try {
            return this.getPackageManager().getPackageInfo(this.getPackageName(), 0).versionName;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
            return null;
        }
    }
}

以上配置无需动脑,直接从集成文档中复制过来就ok的~

别忘了引用你的Application类

2、代码

这一步就是模拟修复bug

  • 就很简单设置“第一次运行”

这里写图片描述

  • 运行效果

这里写图片描述

  • 这时候签名打一个包,demo_1.apk,假装这是一个出bug的apk
  • 完成之后,修改代码并变成红色,假装修复

这里写图片描述

  • 运行效果

这里写图片描述

  • 此时再打一个包,demo_2.apk

3、发布

好了,到第三步了,也是比较关键的地方了,但是不要怕,依然没有难度

大概原理:在第二步中我们打了两个安装包,demo_1.apk 和 demo_2.apk,就是比较这两个apk,差异的部分生成补丁包,然后控制台去控制下发、拉取、加载等操作。

  • 所以,现在就需要用到补丁包,需要这个工具SophixPatchTool,以windows为例,下载之后解压,找到并打开SophixPatchTool.exe,然后选择旧包、新包
    这里写图片描述

  • 设置里面选择补丁包的输出路径

这里写图片描述

  • 高级
    这里写图片描述

  • 点击 GO 开始生成补丁包

这里写图片描述

这里可能会遇到apk加固而无法生成补丁包的情况,加固前先生成补丁,然后再加固,加固了的apk是可以应用上补丁的。

  • 打开输出路径
    这里写图片描述

可以看到多了一个sophix-patch.jar文件

  • 控制台先添加版本,比如1.0.0
  • 然后查看详情中,选择上传补丁,就是刚才的jar文件
  • 上传之后就可以发布了
    这里写图片描述

比如现在手机装的是demo_1.apk,发布之后就可以重新打开,再运行就是demo_2.apk的效果了

为什么需要重新打开呢
在生成补丁包的时候,有一个高级选项,我没有勾选强制冷启动,Sophix就会根据情况自己去选择冷启动生效还是及时生效。

哦对了,还有个测试,调试补丁

也超简单的,下载调试工具,是个apk,打开如下图

这里写图片描述

操作:
  • 第一个是输入包名,然后点击连接,连接成功的话会在下面通知内容中显示success
  • 然后扫描二维码,就是发布时那个二维码
  • 然后就是输入绝对路径了,就是补丁包在手机的路径
  • 然后点击应用就ok了,通知中会显示-1,表示本地补丁,2 表示本地补丁模式, 1 表示加载成功

总结

整套操作下来基本没有难度,不过要用好的话还是需要把官方文档好好研究一下,比如能不能直接加一个Activity啊、补丁包发错了怎么办啊、补丁怎么找不到啊等等,其实都有对应的解决方案,实在解决不了也可以提交一个工单,我这个集成下来十分钟左右就搞定了,当然,官方文档我也研究了好几遍。。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yechaoa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值