天天看點

【筆記】阿裡非侵入式熱修複方案Sophix

上周看到一篇關于阿裡公測的熱修複Sophix的文章——阿裡推出業界首個非侵入式熱修複方案Sophix,颠覆移動端傳統發版更新流程!

文章中有一張關于Sophix、Tinker、Amigo的對比圖檔,之前使用Tinker感覺也還可以,但既然Sophix說更好,那就當然要嘗試下了,而且Tinker不能修複加強的APK還是有點不足的,但驚喜的是Sophix貌似可以修複加強的APK。

【筆記】阿裡非侵入式熱修複方案Sophix

簡單使用

Sophix的使用就像圖上說的那樣,真正的傻瓜式接入。

1、建立項目

控制台建立應用(https://help.aliyun.com/document_detail/53238.html)

本地建立Android項目

2、添加配置

android studio內建方式

maven倉庫

allprojects {
    repositories {
        jcenter()
        maven {
            url 'http://maven.aliyun.com/nexus/content/repositories/releases/'
        }
    }
}           

gradle依賴

compile('com.aliyun.ams:alicloud-android-hotfix:3.0.2') {
        exclude(module: 'alicloud-android-utdid')
    }           

3、設定AndroidManifest

權限

<!-- 網絡權限 -->
    <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" />           

application節點(value中的值分别改為通過平台HotFix服務申請得到的App Secret和RSA密鑰)

<meta-data
android:name="com.taobao.android.hotfix.IDSECRET"
android:value="App ID" />
<meta-data
android:name="com.taobao.android.hotfix.APPSECRET"
android:value="App Secret" />
<meta-data
android:name="com.taobao.android.hotfix.RSASECRET"
android:value="RSA密鑰" />           

混淆檔案

#基線包使用,生成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           

4、使用

SDK初始化

private void initSophix() {
        SophixManager.getInstance().setContext(this)
                .setAppVersion(BuildConfig.VERSION_NAME)
                //如果這裡設定了AES,在生成熱修複包的時候也需要配置
                .setAesKey("1234567890123456")
                .setEnableDebug(true)
                .setPatchLoadStatusStub(new PatchLoadStatusListener() {
                    @Override
                    public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {
                        // 更新檔加載回調通知
                        Log.i(TAG, String.format("mode=%d,code=%d,info=%s,handlePatchVersion=%d", mode, code, info, handlePatchVersion));
                        if (code == PatchStatus.CODE_LOAD_SUCCESS) {
                            // 表明更新檔加載成功
                            Log.i(TAG, "表明更新檔加載成功");
                        } else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
                            // 表明新更新檔生效需要重新開機. 開發者可提示使用者或者強制重新開機;
                            // 建議: 使用者可以監聽進入背景事件, 然後應用自殺
                            Log.i(TAG, "表明新更新檔生效需要重新開機");
                        } else if (code == PatchStatus.CODE_LOAD_FAIL) {
                            // 内部引擎異常, 推薦此時清空本地更新檔, 防止失敗更新檔重複加載
                            SophixManager.getInstance().cleanPatches();
                            Log.i(TAG, "内部引擎異常");
                        } else {
                            // 其它錯誤資訊, 檢視PatchStatus類說明
                            Log.i(TAG, "其它錯誤資訊");
                        }
                    }
                }).initialize();
    }           

最簡單的使用已經完成,詳情可檢視 快速接入。

更新檔生成

1、日志(小坑)

【筆記】阿裡非侵入式熱修複方案Sophix
【筆記】阿裡非侵入式熱修複方案Sophix

如果你裝的Java JDK是1.8可能出現這個錯誤資訊,隻需要删除C:\Windows\System32和C:\Windows\SysWOW64下的java*.exe

2、設定

【筆記】阿裡非侵入式熱修複方案Sophix

3、進階設定(根據個人需求)

【筆記】阿裡非侵入式熱修複方案Sophix

4、傻瓜式使用(點選Go!生成)

【筆記】阿裡非侵入式熱修複方案Sophix

更新檔工具使用說明

調試工具

開發中總是需要調試,Sophix也提供了更新檔的調試,不需要釋出直接可以測試更新檔的使用。

【筆記】阿裡非侵入式熱修複方案Sophix

調試工具使用

注:在調試過程中發現Sophix可以在360加強的APK中使用,不過需要注意的是這時候去生成更新檔需要使用未加強的APK,否則雖然也能生成APK,但使用的時候隻能修複class類,其他so庫、資源檔案等都無法修複,這應該是Sophix隻進行了類加載方案。

資料

文檔

https://help.aliyun.com/document_detail/51415.html

github

https://github.com/aliyun/alicloud-android-demo/tree/master/hotfix_android_demo

源碼Demo

執行個體