阿里移動(dòng)熱修復(fù)Sophix試用

今年Android領(lǐng)域熱門技術(shù)之一是熱修復(fù)技術(shù),試用了一下阿里的Sophix,真心給阿里的技術(shù)點(diǎn)贊,接入成本非常低。唯一遺憾的是不是完全免費(fèi),單個(gè)賬戶創(chuàng)建的應(yīng)用總活躍設(shè)備超過5萬臺(tái)就會(huì)收費(fèi)(偶買噶...),但是有5萬臺(tái)的額度也夠用了o(╯□╰)o

對(duì)比

image.png

使用步驟

  1. 注冊(cè)阿里云賬號(hào)
  2. 注冊(cè)“移動(dòng)熱修復(fù)”功能
  3. 創(chuàng)建APP
  4. 創(chuàng)建版本
  5. 集成Sophix到Android工程
  6. build apk,一個(gè)old.apk, 一個(gè)new.apk,使用補(bǔ)丁生成工具,生成補(bǔ)丁
  7. 上傳補(bǔ)丁
  8. 使用調(diào)試app,掃描補(bǔ)丁二維碼,進(jìn)行測(cè)試
  1. 發(fā)布補(bǔ)丁

集成注意事項(xiàng)

  1. gradle配置
  2. AndroidManifest添加
<!--Sophix配置-->
<meta-data
    android:name="com.taobao.android.hotfix.IDSECRET"
    android:value="" />
<meta-data
    android:name="com.taobao.android.hotfix.APPSECRET"
    android:value="" />
<meta-data
    android:name="com.taobao.android.hotfix.RSASECRET"
    android:value="" />  
  1. 混淆配置

基線包

### Sophix
#基線包使用,生成mapping.txt
-printmapping mapping.txt
#生成的mapping.txt在app/buidl/outputs/mapping/release路徑下,移動(dòng)到/app路徑下
#修復(fù)后的項(xiàng)目使用,保證混淆結(jié)果一致
#-applymapping mapping.txt
#hotfix
-keep class com.taobao.sophix.**{*;}
-keep class com.ta.utdid2.device.**{*;}
#防止inline
-dontoptimize

非基線包
基線包生成的mapping.txt在app/buidl/outputs/mapping/release路徑下,移動(dòng)到/app路徑下

### Sophix
#基線包使用,生成mapping.txt
#-printmapping mapping.txt
#生成的mapping.txt在app/buidl/outputs/mapping/release路徑下,移動(dòng)到/app路徑下
#修復(fù)后的項(xiàng)目使用,保證混淆結(jié)果一致
-applymapping mapping.txt
#hotfix
-keep class com.taobao.sophix.**{*;}
-keep class com.ta.utdid2.device.**{*;}
#防止inline
-dontoptimize
  1. Application
    initialize的調(diào)用應(yīng)該盡可能的早,必須在Application.attachBaseContext()或者Application.onCreate()的最開始進(jìn)行SDK初始化操作,否則極有可能導(dǎo)致崩潰。而查詢服務(wù)器是否有可用補(bǔ)丁的操作可以在后面的任意地方。
SophixManager.getInstance().setContext(this)
                .setAppVersion(appVersion)
                .setSecretMetaData("IDSECRET", "APPSECRET", "RSASECRET")//使用自己的替換
                .setAesKey(null)
                .setEnableDebug(true)
                .setPatchLoadStatusStub(new PatchLoadStatusListener() {
                    @Override
                    public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {
                        String msg = new StringBuilder("").append("Mode:").append(mode)
                                .append(" Code:").append(code)
                                .append(" Info:").append(info)
                                .append(" HandlePatchVersion:").append(handlePatchVersion).toString();
                        LogUtil.i(msg);
                        // 補(bǔ)丁加載回調(diào)通知
                        if (code == PatchStatus.CODE_LOAD_SUCCESS) {
                            // 表明補(bǔ)丁加載成功
                        } else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
                            // 表明新補(bǔ)丁生效需要重啟. 開發(fā)者可提示用戶或者強(qiáng)制重啟;
                            // 建議: 用戶可以監(jiān)聽進(jìn)入后臺(tái)事件, 然后應(yīng)用自殺,以此加快應(yīng)用補(bǔ)丁
                            // 建議調(diào)用killProcessSafely,詳見1.3.2.3
                            // SophixManager.getInstance().killProcessSafely();
                        } else if (code == PatchStatus.CODE_LOAD_FAIL) {
                            // 內(nèi)部引擎異常, 推薦此時(shí)清空本地補(bǔ)丁, 防止失敗補(bǔ)丁重復(fù)加載
                            // SophixManager.getInstance().cleanPatches();
                        } else {
                            // 其它錯(cuò)誤信息, 查看PatchStatus類說明
                        }
                    }
                }).initialize();
  1. 拉取補(bǔ)丁,放在initialize()之后,可以放在onCreate()中
SophixManager.getInstance().queryAndLoadNewPatch();

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容