天天看點

HotFix 內建文檔

之前有跟蹤考察過這種熱修複技術,這段時間阿裡公測了HotFix 特此寫這篇內建文檔。

第一步 登陸阿裡百川 建立應用

HotFix 內建文檔

第二步 建立項目 引用代碼庫

當然也可以引用官方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'
}
           
HotFix 內建文檔

第三步 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是屬于公測期間是以需要你申請公測資格

申請完之後就可以在hotfix背景看到你的資訊了 比如:appId res密鑰 secret資訊等

HotFix 內建文檔

第四步 在你的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 內建文檔

建立完版本資訊之後,點選檢視詳情上傳更新檔資訊。

上傳完更新檔之後會看到二維碼用測試工具先測試更新檔是否可用。

HotFix 內建文檔

第八部 測試更新檔

先下載下傳更新檔測試工具 更新檔測試工具

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