Android熱修復(fù)之AndFix使用教程

AndFix的github地址

AndFix

全稱Android hot-fix,是alibaba的Android熱修復(fù)框架,支持Android 2.3到6.0的版本,支持arm與X86系統(tǒng)架構(gòu),支持Dalvik和ART Runtime。

原理

AndFix的原理就是方法的替換,把有bug的方法替換成補(bǔ)丁文件中的方法。

原理-替換方法.png

使用教程

1. 添加依賴和混淆

    compile 'com.alipay.euler:andfix:0.4.0@aar'
}```
   **混淆:**

-keep class * extends java.lang.annotation.Annotation
-keepclasseswithmembernames class * {
native <methods>;
}



**2. 在Application.onCreate()中初始化PatchManager**

public class AndFixApplication extends Application {

public static PatchManager mPatchManager;

@Override
public void onCreate() {
    super.onCreate();

    // 初始化patch管理類
    mPatchManager = new PatchManager(this);

    // 初始化patch版本
    mPatchManager.init("1.0");

// String appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
// mPatchManager.init(appVersion);

    // 加載已經(jīng)添加到PatchManager中的patch
    mPatchManager.loadPatch();

}

}

**3. 找個(gè)地方加載補(bǔ)丁,我們這里為了演示,點(diǎn)擊按鈕進(jìn)行加載補(bǔ)丁**
findViewById(R.id.main_btn).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        update();
    }
});

private static final String APATCH_PATH = "/fix.apatch"; // 補(bǔ)丁文件名

  
private void update() {
    String patchFileStr = Environment.getExternalStorageDirectory().getAbsolutePath() + APATCH_PATH;
    try {
        AndFixApplication.mPatchManager.addPatch(patchFileStr);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
PatchManager的addPatch方法加載新補(bǔ)丁,項(xiàng)目中可以在下載補(bǔ)丁文件之后調(diào)用,這里為了演示就把補(bǔ)丁文件放在本地的SD卡中了,代碼中patchFileStr就是補(bǔ)丁存放的位置,**.apatch**就是生成補(bǔ)丁文件的后綴名,fix就是補(bǔ)丁文件的名字,這里我們將其名字寫死。
我們看一下打補(bǔ)丁之前MainActivity的所有代碼

public class MainActivity extends AppCompatActivity {

private static final String APATCH_PATH = "/fix.apatch"; // 補(bǔ)丁文件名
private TextView mainTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mainTv = (TextView) findViewById(R.id.main_tv);
    mainTv.setText("點(diǎn)擊Toast");
    mainTv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showToast();
        }
    });

    findViewById(R.id.main_btn).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            update();
        }
    });

}

private void showToast() {
    Toast.makeText(this, "打補(bǔ)丁之前", Toast.LENGTH_LONG).show();
}

/**
 * 動(dòng)態(tài)更新,加載補(bǔ)丁文件
 * @author zehua_chen
 * create at 2016/8/3 14:35
 */
private void update() {
    String patchFileStr = Environment.getExternalStorageDirectory().getAbsolutePath() + APATCH_PATH;
    try {
        AndFixApplication.mPatchManager.addPatch(patchFileStr);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

**4. 我們將以上應(yīng)用打包,我們命名為andfix_v1.0**
![andfix_v1.0.png](http://upload-images.jianshu.io/upload_images/1689990-fea1230a4b800532.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

**5. 修改MainActivity中的代碼,打包成andfix_v2.0**
private void showToast() {
    Toast.makeText(this, "打補(bǔ)丁之后", Toast.LENGTH_LONG).show();
}
mainTv.setText("加載了補(bǔ)丁之后");
上面代碼可知,我們只修改TextView的文字和TextView點(diǎn)擊之后的Toast內(nèi)容,然后打包
![andfix_v2.0.png](http://upload-images.jianshu.io/upload_images/1689990-6375e8976f9aba23.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

**6. 使用官方提供的工具[apkpatch](https://github.com/alibaba/AndFix/blob/master/tools/apkpatch-1.0.3.zip)生成.apatch補(bǔ)丁文件**
點(diǎn)擊上面的鏈接下載apkpatch之后解壓
![apkpatch.png](http://upload-images.jianshu.io/upload_images/1689990-d694879c1ef977f8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
將兩個(gè)apk文件和該app的簽名文件放入到該目錄中
![加入簽名文件和apk.png](http://upload-images.jianshu.io/upload_images/1689990-9217393c8a6016e1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

使用命令生成.apatch補(bǔ)丁文件,先cmd進(jìn)入該目錄


![進(jìn)人apkpatch目錄.png](http://upload-images.jianshu.io/upload_images/1689990-86d824a35b3a5f2d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
使用命令生成補(bǔ)丁
![生成補(bǔ)丁文件.png](http://upload-images.jianshu.io/upload_images/1689990-4ea5d937652ad95f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
上圖所示則表示補(bǔ)丁包生成完成

<u>apkpatch.bat -f andfix_v2.0.apk -t andfix_v1.0.apk -o output -k AndFixKey.jks -p andfix -a andfix -e andfix</u>

<u>apkpatch.bat -f 新apk -t 舊apk -o 輸出目錄 -k app簽名文件 -p 簽名文件密碼 -a 簽名文件別名 -e 別名密碼</u>

* -f <new.apk> :新apk
* -t <old.apk> : 舊apk
* -o <output> : 輸出目錄(補(bǔ)丁文件的存放目錄)
* -k <keystore>: 打包所用的keystore
* -p <password>: keystore的密碼
* -a <alias>: keystore 用戶別名
* -e <alias password>: keystore 用戶別名密碼

生成的output文件:
![生成的output文件.png](http://upload-images.jianshu.io/upload_images/1689990-388d2802c9ec436a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

![apatch補(bǔ)丁文件.png](http://upload-images.jianshu.io/upload_images/1689990-ebf6c69cc76890e5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

  將生成的.apatch補(bǔ)丁文件改成代碼中寫死的fix.apatch
![改名成fix.apatch.png](http://upload-images.jianshu.io/upload_images/1689990-8d2aeead99d107d1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

**7.運(yùn)行andfix_v1.0查看修復(fù)之前的效果,把補(bǔ)丁文件push到sd卡目錄下, 點(diǎn)擊Button更新按鈕加載補(bǔ)丁文件,再看其效果,到這里我們就完成了AndFix的熱修復(fù)了**

![打開File Explorer.png](http://upload-images.jianshu.io/upload_images/1689990-1c2eb8b8edbe4209.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

![push fix.apatch文件到sd卡中.png](http://upload-images.jianshu.io/upload_images/1689990-c9be1be105ffa32c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

* 運(yùn)行andfix_v1.0沒(méi)有點(diǎn)擊動(dòng)態(tài)更新按鈕,點(diǎn)擊TextView
![打補(bǔ)丁之前.jpg](http://upload-images.jianshu.io/upload_images/1689990-cd3785eaec76e2f9.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
* 點(diǎn)擊動(dòng)態(tài)更新Button之后再Toast,我們發(fā)現(xiàn)Tost的內(nèi)容變了,但是TextView的內(nèi)容沒(méi)換
![動(dòng)態(tài)更新再Toast.jpg](http://upload-images.jianshu.io/upload_images/1689990-f38474939eeb74c5.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

* 退出之后我們重新進(jìn)入該應(yīng)用就會(huì)發(fā)現(xiàn)TextView的內(nèi)容也變化了。
![打補(bǔ)丁之后,退出再重新進(jìn)入.jpg](http://upload-images.jianshu.io/upload_images/1689990-5c5880c9d9525a77.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,109評(píng)論 25 709
  • 背景 當(dāng)一個(gè)App發(fā)布之后,突然發(fā)現(xiàn)了一個(gè)嚴(yán)重bug需要進(jìn)行緊急修復(fù),這時(shí)候公司各方就會(huì)忙得焦頭爛額:重新打包Ap...
    灬丨墨殤丶閱讀 807評(píng)論 0 4
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,586評(píng)論 19 139
  • 前言 熱修復(fù)也叫熱更新,又叫做動(dòng)態(tài)加載、動(dòng)態(tài)修復(fù)、動(dòng)態(tài)更新,是指不通過(guò)重新安裝新的APK安裝包的情況下修復(fù)一些線上...
    小楠總閱讀 1,720評(píng)論 11 10
  • 基本情況介紹 姓名:苗鈞魁,性別:男,民族:漢族,年齡:80后,職業(yè):科研工作者,黨派:九三學(xué)社,學(xué)歷:在讀博士,...
    自踐不息的喵喵大貓閱讀 437評(píng)論 2 1

友情鏈接更多精彩內(nèi)容