記錄一下初次使用阿裡熱修複的內建步驟(雖然阿裡的開發文檔已經記錄的很清楚了)
阿裡內建文檔:https://help.aliyun.com/document_detail/53240.html?spm=a2c4g.11186623.6.546.zq6lR7
內建準備
android studio內建方式
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.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以上的運作時權限擷取。
READ_EXTERNAL_STORAGE
配置AndroidManifest檔案
在
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,在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。
ps:
舊包:<必填> 選擇基線包路徑(有問題的APK)。
新包:<必填> 選擇新包路徑(修複過該問題APK)。
日志:打開日志輸出視窗。
進階:展開進階選項。
設定:配置其他資訊。
GO!:開始生成更新檔。
- 打開進階設定是否需要冷啟動,本項為預設即可,無需設定:
ps:
強制冷啟動:勾選的話強制生成更新檔包為需要冷啟動才能修複的格式。預設不選的話,工具會根據代碼變更情況自動選擇即時熱替換或者冷啟動修複。
不比較資源:打更新檔時不比較資源的變化。
不比較SO庫:打更新檔時不比較SO庫的變化。
- 打開設定選項進行簽名資訊設定:
- 點選Go生成更新檔:
開始上傳更新檔
更新檔檔案名稱規範:
- Android:檔案名必須為:
;sophix-patch.jar
- 如何生成Android更新檔檔案,見文檔Android生成Patch更新檔
更新檔狀态:
- 等待中:更新檔上傳成功,等待操作。
- 已灰階:更新檔正在進行部分裝置灰階釋出中。
- 已釋出:更新檔已全量釋出至所有裝置。
- 已停止:更新檔釋出行為已暫停,服務端停止下發更新檔,用戶端已經下載下傳的更新檔繼續生效。
本地測試
HotFix提供了調試工具實作本地測試,友善您在正式釋出前,在您的手機本地進行測試。步驟如下:
- 下載下傳安裝HotFix 調試工具。
- 使用HotFix 調試工具擷取更新檔;
- Android調試工具使用說明。
填寫包名,點選連接配接應用,然後掃描更新檔詳情中的二維碼下載下傳更新檔。或者将更新檔包放到手機sdcard,填寫絕對路徑也是可以的。
Mode:1 表示掃碼模式, Code:12 表示應用目前已經有一個更新檔, 是以新更新檔不會立刻加載需要等下一次重新開機加載。(因為我已經下載下傳過一次了)
這時候打開我們裝上的first.apk發現并沒有變,殺掉程序,重新進入,發現已經是我們想要的内容了。
本地測試之後沒有問題就可以釋出了
釋出之後,重新啟動APP,會發現可以内容已經變為我們想要的。(這個過程可能略有延遲)
混淆配置
-
#基線包使用,生成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
釋出之後,重新啟動APP,會發現可以内容已經變為我們想要的。(這個過程可能略有延遲)