天天看點

簡單使用阿裡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,弄得腦袋瓜子都不好使了。