AndFix 使用詳解

AndFix基本介紹

​ 已經好幾年沒有維護了,阿里出了一個收費的。這個已經被放棄了。這裏只是簡單的介紹一下用法。如果不想看的,可以直接跳過

​ AndFix是一個在線修復bug的解決方案,而不是重新發布Android App。它是作爲Android庫發佈的。Andfix是“Android熱修復”的縮寫。

​ AndFix支持Android 2.3 - 7.0版本,支持ARM和X86架構,支持Dalvik和ART runtime,支持32位和64位

​ AndFix補丁的壓縮文件格式是.apatch。它會從你自己的服務器發送到客戶端來修復你的應用程序的bug。

​ AndFix 只用用於方法級別的替換,使用場景有限

AndFix 執行流程及核心原理

在這裏插入圖片描述
​ 從圖中看到 A 調用 B,B 調用 C,但是 B 出了 bug。出現bug 以後 通過 AndFix 生成一個 patch,這個patch 中包含了要被替換的 B,然後執行的順序就成爲了 A 調用 B’ ,B’ 調用 C,這樣就避免了調用 bug。

​ 修復 Bug 的步驟
在這裏插入圖片描述
使用 AndFix 完成線上bug 修復

​ 1,集成

implementation 'com.alipay.euler:andfix:0.5.0@aar'

​ 2,AndFix 使用非常簡單,只有三個 api (github),下面對他做一個簡單的封裝:

public class AndFixManager {
    private static AndFixManager mInstance = null;
    private PatchManager mPatchManger = null;

    public static AndFixManager getInstance() {
        if (mInstance == null)
            synchronized (AndFixManager.class) {
                if (mInstance == null) {
                    mInstance = new AndFixManager();
                }
            }
        return mInstance;
    }

    /**
     * 初始化 AndFix 方法
     *
     * @param context
     */
    public void initPatch(Context context) {
        mPatchManger = new PatchManager(context);
        mPatchManger.init(getVersionName(context));
        mPatchManger.loadPatch();
    }


    /**
     * 加載 path 文件
     *
     * @param path
     */
    public void addPath(String path) {
        if (mPatchManger != null) {
            try {
                mPatchManger.addPatch(path);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    public static String getVersionName(Context context) {
        String version = "1.0.0";
        try {
            PackageManager pm = context.getPackageManager();
            PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), 0);
            version = packageInfo.versionName;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return version;
    }
}

​ 注意在 Application 中進行初始化:

  AndFixManager.getInstance().initPatch(this);

​ 3,準備一個有 bug 的 apk 並安裝到手機

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    /**
     * 文件後綴名
     */
    private static final String FILE_END = ".apatch";
    /**
     * 文件路徑
     */
    private String mPatchDir;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        findViewById(R.id.btn_one).setOnClickListener(this);
        findViewById(R.id.btn_two).setOnClickListener(this);

        mPatchDir = getExternalCacheDir().getAbsolutePath() + "/apatch/";
        //創建文件夾
        File file = new File(mPatchDir);
        if (file.exists()) {
            file.mkdir();
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_one:
                printLog();
                break;
            case R.id.btn_two:
                AndFixManager.getInstance().addPath(getPatchName());
                break;
        }
    }

    /**
     * bug 方法
     */
    public void printLog() {
        String error = null;
        Log.e("-----", "printLog: " + Integer.valueOf(error));
    }

    /**
     * 構造文件名
     *
     * @return
     */
    private String getPatchName() {
        return mPatchDir.concat("345").concat(FILE_END);
    }

}

​ 我們創建了兩個按鈕,按鈕 one 執行bug 方法,two 進行修復,注意修復傳入的路徑。接着打包,主要要 replace 有簽名的包,打完包後給它改一個名字 爲 old.apk。然後保存在一個文件夾中。

4,分析解決 bug 後,build 一個新的Apk

​ 我們現在找到 bug 了,然後進行修復:

	/**
     * bug 方法
     */
    public void printLog() {
//        String error = null;
//        Log.e("-----", "printLog: " + Integer.valueOf(error));
        Toast.makeText(this, "沒有bug", Toast.LENGTH_LONG).show();
    }

​ 我們修復了 bug,明企鵝彈出了一個提示框,接着進行 replace 打包,保存名字爲 new.apk。將他 和 old .apk 放在一起

5,構建 patch 文件

下載構建工具

​ 如下所示:

​ [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-NmhkO4Oo-1574754236863)(5%EF%BC%8CAndFix%20%E4%BD%BF%E7%94%A8%E8%AF%A6%E8%A7%A3.assets/1573635111925.png)]

​ 其中 apkpatch.bat 是 window 用到的,apkpatch.sh 是蘋果用到的,

​ 我創建了一個 output 文件夾用來保存 patch 文件,然後將 old.apk 和 new.apk ,KeyStory.jsk 都放進去了,因爲我們要用 apkpath 來比較 old 和 new 的變化。接着我們來看一下怎麼生成 patch 文件。

打開 cmd ,進入上面的目錄,輸入 apkpatch.bat 就可以查看對應命令和解釋
在這裏插入圖片描述

	apkpatch -f <new> -t <old> -o <output> -k <keystore> -p <***> -a <alias>

​ 生成 patch 文件所用到的命令

​ apkpatch -m <apatch_path…> -k -p <***> -a -e <***>

​ 合併多個 patch 文件爲 1 個的時候用到的命令

  • -f :沒有 bug 的 apk
  • -t :有 bug 的 apk
  • -o:patch 文件輸出路徑
  • -k:keyStore
  • -p:密碼
  • -a:別名
  • -e:密碼

​ 下面我們來看下一生成 patch文件:
在這裏插入圖片描述
​ 可以看到他將兩者的差異找到了,就是 printLog 方法。接着我們看一下輸出的 patch 文件:
在這裏插入圖片描述

​ 這就是生成的文件,其中我們只需要用到 .apatch 文件,345是我自己改的哈。。

patch 安裝

​ 將我們生成的 patch copy 到程序中定義的路徑中,就是我們在程序中創建的那個路徑。可以進行 copy,也可以進行 adb push ,都可以。只要將 patch 文件弄進去就好了。這裏我通過 adb 的方式:
在這裏插入圖片描述
在這裏插入圖片描述
可以看到已經成功了。

然後打開 app ,點擊修復按鈕之後重啓應用,就會發現bug已經修復了。


參考:慕課網視頻

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章