之前有跟蹤考察過這種熱修複技術,這段時間阿裡公測了HotFix 特此寫這篇內建文檔。
第一步 登陸阿裡百川 建立應用
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICN4ETNxYDN2EjNwkDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
第二步 建立項目 引用代碼庫
當然也可以引用官方jar包,我這裡直接引用遠端庫了。
dependencies {
compile 'com.alibaba.sdk.android.plugins:alisdk-hotfix:1.0.0.3'
compile 'com.alibaba.sdk.android.plugins.jar:alisdk-utdid:0.0.1'
}
第三步 AndroidManifest.xml 中添加配置資訊
在“application”節點下添加如下配置:
<meta-data
android:name="com.taobao.android.hotfix.APPSECRET"
android:value="your-app-secret" />
<meta-data
android:name="com.taobao.android.hotfix.RSASECRET"
android:value="your-rsa-secret" />
添權重限
<! -- 網絡權限 -->
<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.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
畫紅線的地方替換你的資訊。由于現在hotfix是屬于公測期間是以需要你申請公測資格
申請完之後就可以在hotfix背景看到你的資訊了 比如:appId res密鑰 secret資訊等
第四步 在你的Application中添加hotfix代碼
這個地方不過多介紹了 mAppId需要替換
public class MainApp extends Application {
private String mAppVersion;
private String mAppId = "你的APPID";
@Override
public void onCreate() {
super.onCreate();
try {
mAppVersion = this.getPackageManager().getPackageInfo(this.getPackageName(), ).versionName;
} catch (Exception e) {
this.mAppVersion = "1.0.0";
}
HotFixManager hotFixManager = HotFixManager.getInstance().initialize(this, mAppVersion, mAppId, new NewPatchListener() {
@Override
public void handlePatch(int i) {
Toast.makeText(MainApp.this, "請重新開機應用進行更新", Toast.LENGTH_LONG).show();
}
});
hotFixManager.queryNewHotPatch();
}
}
第五步 修改代碼
打更新檔之前的錯誤代碼
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private int s = ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_hot_fix_test).setOnClickListener(this);
}
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.btn_hot_fix_test:
int i = / s;
Log.w("wzh", "" + i);
Toast.makeText(this, "修複成功", Toast.LENGTH_SHORT).show();
break;
}
}
}
修複bug之後的代碼
package com.cehome.hotfixtest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private int s = ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_hot_fix_test).setOnClickListener(this);
}
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.btn_hot_fix_test:
if (s == ) {
s = ;
}
int i = / s;
Log.w("wzh", "" + i);
Toast.makeText(this, "修複成功", Toast.LENGTH_SHORT).show();
break;
}
}
}
HotFix要求在原來的代碼上編碼,注意不要新增Field也不要新增方法,隻需要在原來的方法裡邊修改邏輯解決掉問題即可,例如:
修改前的方法:
public void A(Object a) {
...
a.getXXX();//a對象可能為空,而造成線上crash
}
修改後的方法:
public void A(Object a) {
...
if (a != null) {
a.getXXX();
}
}
将修改後的工程打包apk與修複前apk使用patch工具即可生成patch。
首先,需要聲明的是,patch是針對用戶端某個版本的,patch需要和版本綁定。
舉個例子:
新上線的版本1.0發現了一個bug,表示為bug1
修複一個bug以後基于1.0版本産生patch1,修複1.0版本bug1
過不久又發現一個bug,表示為bug2
此時要在修複bug1的基礎上再修複bug2,修複後的APK中應包含bug1和bug2,然後在基于1.0版本産生patch2,去替換之前的patch1。
也就是說,同一個版本中的最新patch總是包含該版本所有的bug修複。用戶端一個版本隻能對應一個patch。
當你選擇更新應用時,當然也必須包含該之前所有的bug修複代碼。
第六步 打更新檔
java -jar alisdk-hotfix-android-pack-tools.jar PATCH srcAPK fixedAPK outPatch signInfo outLog
參數說明:
srcAPK:填寫本地的原始APK(有問題的APK)的本地路徑,如果檔案找不到會報錯
fixedAPK:已經修複過該問題的APK
outPatch:輸出patch的路徑
signInfo:本地的簽名配置屬性檔案,可選,不輸入或者不正确則不做簽名
outLog:輸出日志的目錄,可以不填寫,預設為控制台輸出
這是我截圖:
我的目錄結構:![]()
HotFix 內建文檔 ![]()
HotFix 內建文檔
第七步 上傳更新檔
先打開hotfix背景建立一個版本資訊
建立完版本資訊之後,點選檢視詳情上傳更新檔資訊。
上傳完更新檔之後會看到二維碼用測試工具先測試更新檔是否可用。
第八部 測試更新檔
先下載下傳更新檔測試工具 更新檔測試工具
先連接配接應用 然後掃更新檔二維碼。
如果有任何問題可以加入叮叮群 咨詢官方人員
代碼混淆
#HotFix
-keep class * extends java.lang.annotation.Annotation
-keepclasseswithmembernames class * {
native <methods>;
}
-keep class com.alipay.euler.andfix.**{
*;
}
-keep class com.taobao.hotfix.aidl.**{*;}
-keep class com.ta.utdid2.device.**{*;}
-keep class com.taobao.hotfix.HotFixManager{
public *;
}
文檔支援更新中。。。
hotfix現在處于公測中,可能還有一些問題。也在持續關注中
官網位址:http://baichuan.taobao.com//product/hotfix.htm?spm=a3c0d.7662652.1998907851.8.JNLdp3