天天看點

Android三步內建阿裡熱修複——Sophix

準備工作

  • 打開阿裡雲
  • 找到産品
  • 找到移動熱修複
  • 建立APP(在右上角)
  • 然後會有app id 等資訊,配置會用到(複制的時候注意會有空格)
官方內建文檔

1、配置

  • 添加maven倉庫位址:
repositories {
   maven {
       url "http://maven.aliyun.com/nexus/content/repositories/releases"
   }
}           
  • 添加gradle坐标版本依賴:
compile 'com.aliyun.ams:alicloud-android-hotfix:3.2.0'           
  • 添權重限
<! -- 網絡權限 -->
<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

在6.0+需要動态擷取的哦~

  • 在AndroidManifest.xml中間的application節點下添加如下配置:
<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密鑰" />           
  • Application中初始化
public class App extends Application {

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

        // initialize最好放在attachBaseContext最前面,初始化直接在Application類裡面,切勿封裝到其他類
        SophixManager.getInstance().setContext(this)
                .setAppVersion(getVersionName())
                .setAesKey(null)
                .setEnableDebug(true)//正式釋出該參數必須為false
                .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

                            //SophixManager.getInstance().killProcessSafely();

                        } else {
                            // 其它錯誤資訊, 檢視PatchStatus類說明
                        }
                    }
                }).initialize();

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

    }

    public String getVersionName() {
        try {
            return this.getPackageManager().getPackageInfo(this.getPackageName(), 0).versionName;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
            return null;
        }
    }
}           

以上配置無需動腦,直接從內建文檔中複制過來就ok的~

别忘了引用你的Application類

2、代碼

這一步就是模拟修複bug
  • 就很簡單設定“第一次運作”
Android三步內建阿裡熱修複——Sophix
  • 運作效果
Android三步內建阿裡熱修複——Sophix
  • 這時候簽名打一個包,demo_1.apk,假裝這是一個出bug的apk
  • 完成之後,修改代碼并變成紅色,假裝修複
Android三步內建阿裡熱修複——Sophix
  • 運作效果
Android三步內建阿裡熱修複——Sophix
  • 此時再打一個包,demo_2.apk

3、釋出

好了,到第三步了,也是比較關鍵的地方了,但是不要怕,依然沒有難度

大概原理:在第二步中我們打了兩個安裝包,demo_1.apk 和 demo_2.apk,就是比較這兩個apk,差異的部分生成更新檔包,然後控制台去控制下發、拉取、加載等操作。

  • 是以,現在就需要用到更新檔包,需要這個工具SophixPatchTool,以windows為例,下載下傳之後解壓,找到并打開SophixPatchTool.exe,然後選擇舊包、新包
    Android三步內建阿裡熱修複——Sophix
  • 設定裡面選擇更新檔包的輸出路徑
Android三步內建阿裡熱修複——Sophix
  • 進階
    Android三步內建阿裡熱修複——Sophix
  • 點選 GO 開始生成更新檔包
Android三步內建阿裡熱修複——Sophix
這裡可能會遇到

apk加強

而無法生成更新檔包的情況,加強前先生成更新檔,然後再加強,加強了的apk是可以應用上更新檔的。
  • 打開輸出路徑
    Android三步內建阿裡熱修複——Sophix

可以看到多了一個sophix-patch.jar檔案

  • 控制台先添加版本,比如1.0.0
  • 然後檢視詳情中,選擇上傳更新檔,就是剛才的jar檔案
  • 上傳之後就可以釋出了
    Android三步內建阿裡熱修複——Sophix

比如現在手機裝的是demo_1.apk,釋出之後就可以重新打開,再運作就是demo_2.apk的效果了

為什麼需要重新打開呢

在生成更新檔包的時候,有一個進階選項,我沒有勾選強制冷啟動,Sophix就會根據情況自己去選擇冷啟動生效還是及時生效。

哦對了,還有個測試,調試更新檔

也超簡單的,下載下傳調試工具,是個apk,打開如下圖
Android三步內建阿裡熱修複——Sophix

操作:

  • 第一個是輸入包名,然後點選連接配接,連接配接成功的話會在下面通知内容中顯示success
  • 然後掃描二維碼,就是釋出時那個二維碼
  • 然後就是輸入絕對路徑了,就是更新檔包在手機的路徑
  • 然後點選應用就ok了,通知中會顯示-1,表示本地更新檔,2 表示本地更新檔模式, 1 表示加載成功

總結

整套操作下來基本沒有難度,不過要用好的話還是需要把官方文檔好好研究一下,比如能不能直接加一個Activity啊、更新檔包發錯了怎麼辦啊、更新檔怎麼找不到啊等等,其實都有對應的解決方案,實在解決不了也可以送出一個工單,我這個內建下來十分鐘左右就搞定了,當然,官方文檔我也研究了好幾遍。。

繼續閱讀