天天看點

Android之移動熱修複

阿裡雲推出了移動熱修複服務,聽說這個服務傻瓜式接入,性能相對較好,對新技術比較好奇的我決定嘗試一下。

Android之移動熱修複

1.首先,需要開通這個服務,建立應用

Android之移動熱修複

2.然後,在項目中接入服務。按照文檔所述

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

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

第二步:添加gradle坐标版本依賴:

compile 'com.aliyun.ams:alicloud-android-hotfix:3.0.6'
      

第三步:在AndroidManifest.xml中添權重限:

<!-- 網絡權限 -->
    <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"/>
    <!--讀取手機裝置碼-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
      

文檔中并沒有提到最後一個權限,不過我運作項目的時候有提示需要這個權限。

第四步:配置AndroidManifest檔案:

<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密鑰" />
      

這些資訊可以在建立的應用中找到

Android之移動熱修複

第五步:混淆配置:

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

第六步:在Application中初始化:

initialize的調用應該盡可能的早,必須在Application.attachBaseContext()或者Application.onCreate()的最開始進行SDK初始化操作,否則極有可能導緻崩潰。

// 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) {
                            // 表明新更新檔生效需要重新開機. 開發者可提示使用者或者強制重新開機;
                            // 建議: 使用者可以監聽進入背景事件, 然後應用自殺
                        } else if (code == PatchStatus.CODE_LOAD_FAIL) {
                            // 内部引擎異常, 推薦此時清空本地更新檔, 防止失敗更新檔重複加載
                            // SophixManager.getInstance().cleanPatches();
                        } else {
                            // 其它錯誤資訊, 檢視PatchStatus類說明
                        }
                    }
                }).initialize();
// queryAndLoadNewPatch不可放在attachBaseContext 中,否則無網絡權限,建議放在後面任意時刻,如onCreate中
SophixManager.getInstance().queryAndLoadNewPatch();
      

到此,內建完畢。

接下來,開始測試。

我剛開始直接在原有項目中撸了一遍,結果跟友盟有沖突(看來嘗試新東西還是得建立項目,偷不得懶)。。。是以又建立了一個項目,重新撸一遍。。。

1.舊版本:不顯示“HelloWord”;

2.新版本:顯示“HelloWord”;

3.下載下傳更新檔工具:https://help.aliyun.com/document_detail/53247.html?spm=5176.doc53240.6.548.o2zESp

4.使用更新檔工具生成更新檔。

5.上傳更新檔檔案。在APP清單中,點選“管理”,添加版本(版本要和app版本一緻)。

Android之移動熱修複

點選對應版本的“檢視詳情”,上傳更新檔。

Android之移動熱修複

點選對應更新檔版本的“檢視詳情”,裡面可以釋出更新檔。

6.釋出更新檔。

最後手機上的APP沒有立即顯示“HelloWord”,關閉重新開機APP後成功顯示“HelloWord”。雖然沒有即時生效,但至少成功更新了。