1. 程式人生 > >Sophix熱修復實踐

Sophix熱修復實踐

實踐環境

1 . Android Studio
2 . win10 64位

整合步驟

在阿里雲控制檯新建app


  1. 獲取appId、secret、以及rsa祕鑰 網址連結

依次點選產品->移動服務->移動熱修復
image

點選管理控制檯

image

進入到後臺 新建app 檢視三個配置引數

image

app配置

1 . 在app中的build.gradle中配置maven倉庫和依賴

repositories {
    maven {
        url "http://maven.aliyun.com/nexus/content/repositories/releases"
} } dependencies { ... //如果其它阿里系SDK也可能依賴了utdid這個SDK, 編譯期間報utdid重複, 此時進行如下處理即可, // 關閉傳遞性依賴,沒有其他可以將大括號刪除: compile ('com.aliyun.ams:alicloud-android-hotfix:3.0.3') { exclude(module:'alicloud-android-utdid') } ... }

2 . 在AndroidManifest檔案中新增Sophix許可權

 <!--網路許可權-->
<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"/>

3 . 在AndroidManifest檔案中配置上個步驟獲取到的appId、secret、rsa祕鑰

<meta-data
            android:name="com.taobao.android.hotfix.IDSECRET"
            android:value="your id" />
        <meta-data
            android:name="com.taobao.android.hotfix.APPSECRET"
            android:value="your secret" />
        <meta-data
            android:name="com.taobao.android.hotfix.RSASECRET"
            android:value="your rsa" />

4 . 新建Application子類

attachBaseContext初始化SophixManager

@Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        // initialize最好放在attachBaseContext最前面
        SophixManager.getInstance().setContext(this)
                .setAppVersion(appVersion)
                .setAesKey(null)
                .setEnableDebug(true)
                .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) {
                            // 表明新補丁生效需要重啟. 開發者可提示使用者或者強制重啟;
                            // 建議: 使用者可以監聽進入後臺事件, 然後應用自殺
                            // SophixManager.getInstance().killProcessSafely();//安全自殺應用推薦
                        } else if (code == PatchStatus.CODE_LOAD_FAIL) {
                            // 內部引擎異常, 推薦此時清空本地補丁, 防止失敗補丁重複載入
                            SophixManager.getInstance().cleanPatches();
                        } else {
                            // 其它錯誤資訊, 檢視PatchStatus類說明
                            Log.d("lzc", code + "");
                        }
                    }
                }).initialize();
    }

注意:上面的appVersion與app版本無關可以自己定義只要與自己控制檯中版本一致即可。我這裡定義的是private static final String appVersion = “1.0.0”;

onCreate中請求差異包

 // queryAndLoadNewPatch不可放在attachBaseContext 中,否則無網路許可權,建議放在後面任意時刻,如onCreateSophixManager.getInstance().queryAndLoadNewPatch();

5 . 混淆配置

在app目錄下的proguard-rules.pro檔案下新增如下程式碼:

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

測試Sophix

1 . 下載window 差異打包工具
連結地址
2 . 將新舊差異包差異打包
image

3 . 這其中可以設定差異包所用到的簽名,簽名必須與app簽名一致 保證安全性
image

4 . 點選go 就會生成差異包以.jar結尾 路勁就是自己設定的
image

5 . 將生成的差異包上傳至控制檯
image

image

下發差異包之前最好先下載阿里提供的測試工具測試一下差異包是否能用然後在灰度下發在全量下發

6 . 下載阿里差異包測試工具
下載地址

7 . 將舊的apk和除錯工具裝在手機中 開啟除錯工具 輸入包名->連線應用->掃描二維碼 觀察下方輸出的日誌
image

8 . 成功的話就可以開始下發差異包了,之後就可以觀察手機中舊的apk發生了變化了