Android 使用移動熱修復Sophix

Android熱修復方案有很多種,但都存在一個致命問題,沒有管理后臺可以上傳補丁包,所以都淘汰了。


各種解決方案

還有一款還能用:阿里云Sophix
不知道其他大廠(騰訊,網(wǎng)易,百度)有沒有,也可以去看看。不知道有沒有其他的可以使用,知道的歡迎在評論區(qū)留言。

Sophix這個熱修復方案的還是不錯的,簡單接入快,非侵入式,管理方便。


對比

簡單介紹下熱修復使用場景,可對線上App發(fā)現(xiàn)嚴重bug進行緊急修復,需要付出巨大的成本進行換包和重新發(fā)布。采用移動熱修復服務,可以隨時發(fā)布補丁實時解決線上問題,用戶全程無感知。

Sophix接入的流程如下:阿里云創(chuàng)建應用->接入SDK->生成補丁包->發(fā)布補丁->補丁測試

1.阿里云創(chuàng)建應用

阿里云官網(wǎng)
官網(wǎng)路徑:產(chǎn)品-移動研發(fā)平臺 EMAS-移動熱修復-創(chuàng)建應用

官網(wǎng)

創(chuàng)建應用

拿到應用appkey等標志信息
應用信息.png

2.接入SDK

接入文檔
這里直接上官方接入文檔,我就不復制官網(wǎng)的接入代碼了,按照官網(wǎng)的接入說明一步一步往下走即可。

關于SophixStubApplication 踩坑

需要特別注意的是SophixStubApplication這個類的里面的方法使用,我在這里踩了坑,
我把代碼貼出來

package com.my.pkg;
import android.app.Application;
import android.content.Context;
import android.support.annotation.Keep;
import android.util.Log;
import com.taobao.sophix.PatchStatus;
import com.taobao.sophix.SophixApplication;
import com.taobao.sophix.SophixEntry;
import com.taobao.sophix.SophixManager;
import com.taobao.sophix.listener.PatchLoadStatusListener;
import com.my.pkg.MyRealApplication;
/**
 * Sophix入口類,專門用于初始化Sophix,不應包含任何業(yè)務邏輯。
 * 此類必須繼承自SophixApplication,onCreate方法不需要實現(xiàn)。
 * 此類不應與項目中的其他類有任何互相調(diào)用的邏輯,必須完全做到隔離。
 * AndroidManifest中設置application為此類,而SophixEntry中設為原先Application類。
 * 注意原先Application里不需要再重復初始化Sophix,并且需要避免混淆原先Application類。
 * 如有其它自定義改造,請咨詢官方后妥善處理。
 */
public class SophixStubApplication extends SophixApplication {
    private final String TAG = "SophixStubApplication";
    // 此處SophixEntry應指定真正的Application,并且保證RealApplicationStub類名不被混淆。
    @Keep
    @SophixEntry(MyRealApplication.class)
    static class RealApplicationStub {}
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
//         如果需要使用MultiDex,需要在此處調(diào)用。
//         MultiDex.install(this);
        initSophix();
    }
    private void initSophix() {
        String appVersion = "0.0.0";
        try {
            appVersion =  BuildConfig.VERSION_NAME;
        } catch (Exception e) {
        }
        final SophixManager instance = SophixManager.getInstance();
        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.i(TAG, "sophix load patch success!");
                        } else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
                            // 如果需要在后臺重啟,建議此處用SharePreference保存狀態(tài)。
                            Log.i(TAG, "sophix preload patch success. restart app to make effect.");
                        }
                    }
                }).initialize();
    }
}

這里@SophixEntry(MyApplication.class)是引用之前的自己在用的Application,SophixStubApplication不能被任何類調(diào)用和調(diào)用除原生/官網(wǎng)寫的其他任何類,推薦直接使用官網(wǎng)的,只更改 @SophixEntry(XXX.class)即可,在AndroidManifest.xml文件中引用android:name=".SophixStubApplication",相當于新增了一個中間類SophixStubApplication;之前Application不用做修改。
在代碼混淆中記得把包路徑換成自己項目的正確包路徑。

其他注意點

1.推薦使用 BuildConfig.VERSION_NAME;獲取版本號
2.注意這句話 生成的mapping.txt在app/build/outputs/mapping/release路徑下,移動到/app路徑下,修復后的項目使用,保證混淆結果一致很關鍵。如果混淆文件不一致,將導致補丁下載成功但無法成功補丁成功。


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


-keepclassmembers class xxx.xxx.xxx.MyRealApplication {
    public <init>();
}
-keep class xxx.xxx.xxx.SophixStubApplication$RealApplicationStub

3.生成補丁包

生成補丁包按照官網(wǎng)的說明下載生成補丁程序即可,官方也有對程序功能的說明;這里直接附上鏈接。跳轉(zhuǎn)到生成補丁官方文檔

生成補丁踩坑

官網(wǎng)說Key Store Password,Key Alias,Key Passwrod是選填可不填,但只要發(fā)布的包都是經(jīng)過簽名的,這里推薦必填,把簽名文件路徑引入,填寫簽名密碼。
現(xiàn)在也支持xxx.keystore后綴的簽名文件了,上面說不支持可能還沒改過來。

官網(wǎng)說明.png

把簽名文件路徑引入,填寫簽名密碼

4.發(fā)布上傳補丁

發(fā)布補丁比較簡單,去控制臺發(fā)布就好了,我這里貼出發(fā)布補丁的官方操作說明
發(fā)布補丁官方操作說明鏈接

貼一張上傳補丁的管理后臺圖

5.補丁測試

官網(wǎng)推薦的調(diào)試補丁方法

注:測試時請保證混淆文件不變

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容