天天看点

简单使用阿里sophix热修复

APP上线了,妈呀,几个bug测试没测出来,真TM蛋疼,又得重新打包审核提交上线,受不了,于是研究下热更新。

具体了解了下,目前比较火的热修复方案主要有:

1、阿里系:Sophix、AndFix 。

2、腾讯系:Tinker。

3、美团系:Robust。

这里我就从阿里的Sophix着手。

阿里云热修复的快速入门:https://help.aliyun.com/document_detail/53238.html?spm=a2c4g.11186623.6.556.1f9f5cbcoQJtA4

一、首先当然得去阿里云申请移动热修复啦,

简单使用阿里sophix热修复

然后添加Demo

简单使用阿里sophix热修复

点击应用信息获取需要在Manifest中配置参数App ID、App Secret、RSA密钥

简单使用阿里sophix热修复

其他的配置可以看看阿里云热修复的说明文档。

下面就说一下android studio的一些关键配置,

1、SophixApplication的初始化,

public class SophixStubApplication extends SophixApplication {
    private final String TAG = "SophixStubApplication";

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
//         如果需要使用MultiDex,需要在此处调用。
//         MultiDex.install(this);
        initSophix();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        // queryAndLoadNewPatch不可放在attachBaseContext 中,否则无网络权限,建议放在后面任意时刻,如onCreate中
        /** 补丁在后台发布之后, 并不会主动下行推送到客户端, 客户端通过调用queryAndLoadNewPatch方法查询后台补丁是否可用*/
        SophixManager.getInstance().queryAndLoadNewPatch();
    }

    private void initSophix() {
        String appVersion = "1.0";
        try {
            appVersion = this.getPackageManager()
                    .getPackageInfo(this.getPackageName(), 0)
                    .versionName;
        } catch (Exception e) {
        }
        final SophixManager instance = SophixManager.getInstance();
        Log.e("lin", "appVersion= " + appVersion);
        instance.setContext(this)
                .setAppVersion(appVersion)
                .setSecretMetaData(null, null, null)
                .setEnableDebug(true)
                .setEnableFullLog()
                .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) {
                            Log.e(TAG, "sophix load patch success!");
                        } else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
                            // 如果需要在后台重启,建议此处用SharePreference保存状态。
                            Log.e(TAG, "sophix preload patch success. restart app to make effect.");
                        } else {
                            Log.e("lin", "code= " + code);
                            Log.e("lin", "mode= " + mode);
                            Log.e("lin", "info= " + info);
                            Log.e("lin", "handlePatchVersion= " + handlePatchVersion);
                        }
                    }
                }).initialize();
    }


    // 此处SophixEntry应指定真正的Application,并且保证RealApplicationStub类名不被混淆。
    @Keep
    @SophixEntry(MyRealApplication.class)
    static class RealApplicationStub {
    }
}
           

关键位置在MyRealApplication,MyRealApplication其实就是自定义的Application,

public class MyRealApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Log.e("lin", "MyRealApplication start" );
    }
}
           

但是在清单文件配置的确是SophixStubApplication,具体为什么要这么配置,我还得去研究。

简单使用阿里sophix热修复

剩下看阿里云的配置文档应该都会。

开始热修复吧。。。。

热修复之前页面就一个TextView,赋值修复前,热修复后的代码就在Activity给TextView赋值修复后,分别打包。用Windows版本打包工具地址:https://link.juejin.im/?target=http%3A%2F%2Fams-hotfix-repo.oss-cn-shanghai.aliyuncs.com%2FSophixPatchTool_windows.zip

使用该工具就生成了差异jar包,这就是热修复的代码(补丁包),然后阿里云热修复后台上传补丁包,

简单使用阿里sophix热修复

应用版本号应该和app的build.gradle版本号一致,上传成功后先不急发布,先本地测试下,

  • 下载安装HotFix 调试工具。
  • 使用HotFix 调试工具获取补丁;
  • Android调试工具使用说明。
  • 本地测试好后再发布。

MMP,感觉写的好稀烂,整天写Code,弄得脑袋瓜子都不好使了。