天天看點

阿裡熱修複之Sophix

記錄一下初次使用阿裡熱修複的內建步驟(雖然阿裡的開發文檔已經記錄的很清楚了)

阿裡內建文檔:https://help.aliyun.com/document_detail/53240.html?spm=a2c4g.11186623.6.546.zq6lR7

內建準備

android studio內建方式

gradle遠端倉庫依賴, 打開項目找到app的build.gradle檔案,添加如下配置:

添加maven倉庫位址:

  1. repositories {

  2. maven {

  3. url "http://maven.aliyun.com/nexus/content/repositories/releases"

  4. }

  5. }

添加gradle坐标版本依賴:

  1. compile 'com.aliyun.ams:alicloud-android-hotfix:3.2.0'

注意,若SDK內建過程中出現UTDID沖突,請參考:阿裡雲-移動雲産品SDK UTDID沖突解決方案。

如若倉庫通路失敗, 那麼用本地依賴的方式進行依賴, SDK下載下傳見“1.5 用戶端本地SDK及DEMO下載下傳”節。

權限說明

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

READ_EXTERNAL_STORAGE

權限屬于Dangerous Permissions,僅調試工具擷取外部更新檔需要,不影響線上釋出的更新檔加載,調試時請自行做好android6.0以上的運作時權限擷取。

配置AndroidManifest檔案

AndroidManifest.xml

中間的

application

節點下添加如下配置:

  1. <meta-data

  2. android:name="com.taobao.android.hotfix.IDSECRET"

  3. android:value="App ID" />

  4. <meta-data

  5. android:name="com.taobao.android.hotfix.APPSECRET"

  6. android:value="App Secret" />

  7. <meta-data

  8. android:name="com.taobao.android.hotfix.RSASECRET"

  9. android:value="RSA密鑰" />

阿裡熱修複之Sophix

阿裡熱修複之Sophix

接入範例

這裡繼承Application,在onCreate()方法中進行初始化:

public class SophixApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        initSophix();
    }

    private void initSophix() {
        String appVersion;

        try {
            appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
        } catch (PackageManager.NameNotFoundException e) {
            appVersion = "1.0.0";
            e.printStackTrace();
        }

        // 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) {
                            // 表明新更新檔生效需要重新開機. 開發者可提示使用者或者強制重新開機;
                            // 建議: 使用者可以監聽進入背景事件, 然後調用killProcessSafely自殺,以此加快應用更新檔,詳見1.3.2.3
                        } else {
                            // 其它錯誤資訊, 檢視PatchStatus類說明
                        }
                    }
                }).initialize();
        // queryAndLoadNewPatch不可放在attachBaseContext 中,否則無網絡權限,建議放在後面任意時刻,如onCreate中
        SophixManager.getInstance().queryAndLoadNewPatch();
    }

}           
生成更新檔
生成更新檔的話需要下載下傳阿裡的打更新檔工具SophixPatchTool,然後分别選擇兩次打包生成的apk。
阿裡熱修複之Sophix

ps: 

舊包:<必填> 選擇基線包路徑(有問題的APK)。 

新包:<必填> 選擇新包路徑(修複過該問題APK)。 

日志:打開日志輸出視窗。 

進階:展開進階選項。 

設定:配置其他資訊。 

GO!:開始生成更新檔。

  • 打開進階設定是否需要冷啟動,本項為預設即可,無需設定:
阿裡熱修複之Sophix

ps: 

強制冷啟動:勾選的話強制生成更新檔包為需要冷啟動才能修複的格式。預設不選的話,工具會根據代碼變更情況自動選擇即時熱替換或者冷啟動修複。 

不比較資源:打更新檔時不比較資源的變化。 

不比較SO庫:打更新檔時不比較SO庫的變化。

  • 打開設定選項進行簽名資訊設定:
阿裡熱修複之Sophix
  • 點選Go生成更新檔:

開始上傳更新檔

阿裡熱修複之Sophix
阿裡熱修複之Sophix

更新檔檔案名稱規範:

  • Android:檔案名必須為:

    sophix-patch.jar

  • 如何生成Android更新檔檔案,見文檔Android生成Patch更新檔

更新檔狀态:

  • 等待中:更新檔上傳成功,等待操作。
  • 已灰階:更新檔正在進行部分裝置灰階釋出中。
  • 已釋出:更新檔已全量釋出至所有裝置。
  • 已停止:更新檔釋出行為已暫停,服務端停止下發更新檔,用戶端已經下載下傳的更新檔繼續生效。

本地測試

HotFix提供了調試工具實作本地測試,友善您在正式釋出前,在您的手機本地進行測試。步驟如下:

  • 下載下傳安裝HotFix 調試工具。
  • 使用HotFix 調試工具擷取更新檔;
  • Android調試工具使用說明。

填寫包名,點選連接配接應用,然後掃描更新檔詳情中的二維碼下載下傳更新檔。或者将更新檔包放到手機sdcard,填寫絕對路徑也是可以的。

阿裡熱修複之Sophix

Mode:1 表示掃碼模式, Code:12 表示應用目前已經有一個更新檔, 是以新更新檔不會立刻加載需要等下一次重新開機加載。(因為我已經下載下傳過一次了)

這時候打開我們裝上的first.apk發現并沒有變,殺掉程序,重新進入,發現已經是我們想要的内容了。

阿裡熱修複之Sophix

本地測試之後沒有問題就可以釋出了

阿裡熱修複之Sophix

釋出之後,重新啟動APP,會發現可以内容已經變為我們想要的。(這個過程可能略有延遲)

阿裡熱修複之Sophix

混淆配置

  1. #基線包使用,生成mapping.txt

  2. -printmapping mapping.txt

  3. #生成的mapping.txt在app/buidl/outputs/mapping/release路徑下,移動到/app路徑下

  4. #修複後的項目使用,保證混淆結果一緻

  5. #-applymapping mapping.txt

  6. #hotfix

  7. -keep class com.taobao.sophix.**{*;}

  8. -keep class com.ta.utdid2.device.**{*;}

  9. #防止inline

  10. -dontoptimize

阿裡熱修複之Sophix

釋出之後,重新啟動APP,會發現可以内容已經變為我們想要的。(這個過程可能略有延遲)

阿裡熱修複之Sophix