Android熱修復之AndFix使用教程
阿新 • • 發佈:2018-11-12
AndFix
全稱Android hot-fix,是alibaba的Android熱修復框架,支援Android 2.3到6.0的版本,支援arm與X86系統架構,支援Dalvik和ART Runtime。
原理
AndFix的原理就是方法的替換,把有bug的方法替換成補丁檔案中的方法。
原理-替換方法.png使用教程
1. 新增依賴和混淆
compile 'com.alipay.euler:andfix:[email protected]' }``` **混淆:**
-keep class * extends java.lang.annotation.Annotation
-keepclasseswithmembernames class * {
native <methods>;
}
**2. 在Application.onCreate()中初始化PatchManager**
public class AndFixApplication extends Application {
public static PatchManager mPatchManager; @Overridepublic void onCreate() { super.onCreate(); // 初始化patch管理類 mPatchManager = new PatchManager(this); // 初始化patch版本 mPatchManager.init("1.0");
// String appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
// mPatchManager.init(appVersion);
// 載入已經新增到PatchManager中的patchmPatchManager.loadPatch(); }
}
**3. 找個地方載入補丁,我們這裡為了演示,點選按鈕進行載入補丁**
findViewById(R.id.main_btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { update(); } });
private static final String APATCH_PATH = "/fix.apatch"; // 補丁檔名
private void update() { String patchFileStr = Environment.getExternalStorageDirectory().getAbsolutePath() + APATCH_PATH; try { AndFixApplication.mPatchManager.addPatch(patchFileStr); } catch (IOException e) { e.printStackTrace(); } }
PatchManager的addPatch方法載入新補丁,專案中可以在下載補丁檔案之後呼叫,這裡為了演示就把補丁檔案放在本地的SD卡中了,程式碼中patchFileStr就是補丁存放的位置,**.apatch**就是生成補丁檔案的字尾名,fix就是補丁檔案的名字,這裡我們將其名字寫死。
我們看一下打補丁之前MainActivity的所有程式碼
public class MainActivity extends AppCompatActivity {
private static final String APATCH_PATH = "/fix.apatch"; // 補丁檔名 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("點選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, "打補丁之前", Toast.LENGTH_LONG).show(); } /** * 動態更新,載入補丁檔案 * @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. 我們將以上應用打包,我們命名為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, "打補丁之後", Toast.LENGTH_LONG).show(); }
mainTv.setText("載入了補丁之後");
上面程式碼可知,我們只修改TextView的文字和TextView點選之後的Toast內容,然後打包 ![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補丁檔案** 點選上面的連結下載apkpatch之後解壓 ![apkpatch.png](http://upload-images.jianshu.io/upload_images/1689990-d694879c1ef977f8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 將兩個apk檔案和該app的簽名檔案放入到該目錄中 ![加入簽名檔案和apk.png](http://upload-images.jianshu.io/upload_images/1689990-9217393c8a6016e1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 使用命令生成.apatch補丁檔案,先cmd進入該目錄 ![進人apkpatch目錄.png](http://upload-images.jianshu.io/upload_images/1689990-86d824a35b3a5f2d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 使用命令生成補丁 ![生成補丁檔案.png](http://upload-images.jianshu.io/upload_images/1689990-4ea5d937652ad95f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 上圖所示則表示補丁包生成完成 <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> : 輸出目錄(補丁檔案的存放目錄) * -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補丁檔案.png](http://upload-images.jianshu.io/upload_images/1689990-ebf6c69cc76890e5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 將生成的.apatch補丁檔案改成程式碼中寫死的fix.apatch ![改名成fix.apatch.png](http://upload-images.jianshu.io/upload_images/1689990-8d2aeead99d107d1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) **7.執行andfix_v1.0檢視修復之前的效果,把補丁檔案push到sd卡目錄下, 點選Button更新按鈕載入補丁檔案,再看其效果,到這裡我們就完成了AndFix的熱修復了** ![開啟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) * 執行andfix_v1.0沒有點選動態更新按鈕,點選TextView ![打補丁之前.jpg](http://upload-images.jianshu.io/upload_images/1689990-cd3785eaec76e2f9.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) * 點選動態更新Button之後再Toast,我們發現Tost的內容變了,但是TextView的內容沒換 ![動態更新再Toast.jpg](http://upload-images.jianshu.io/upload_images/1689990-f38474939eeb74c5.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) * 退出之後我們重新進入該應用就會發現TextView的內容也變化了。 ![打補丁之後,退出再重新進入.jpg](http://upload-images.jianshu.io/upload_images/1689990-5c5880c9d9525a77.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)