1.1 基本介紹 我們先去github上面瞭解它https://github.com/alibaba/AndFix 請原諒我的盜圖行為,英文解釋我就不貼了我自己也看不懂,大致的意思的就是要想盡一切辦法給導致我們崩潰的那個類的某個方法去動手術把它弄好,而這裡就有一個概念那就AndFix.apatch補 ...
1.1 基本介紹
我們先去github上面瞭解它https://github.com/alibaba/AndFix
請原諒我的盜圖行為,英文解釋我就不貼了我自己也看不懂,大致的意思的就是要想盡一切辦法給導致我們崩潰的那個類的某個方法去動手術把它弄好,而這裡就有一個概念那就AndFix.apatch補丁用來修複方法,接下來我們看看到底是怎麼實現的。
1.2 生成apatch包
假如我們收到了用戶上傳的崩潰信息,我們改完需要修複的Bug,這個時候就會有一個新的的apk我們就叫它為new.apk,原來的那個有Bug的apk你也有我們就叫它old.apk。這個時候我們就可以利用阿裡github上面提供的工具生成一個xxxx.apatch包用於修複Bug。
命令是:apkpatch.bat -f <new> -t <old> -o <output> -k <keystore> -p <> -a <alias> -e <>
-f : 沒有Bug的新版本apk
-t : 有bug的舊版本apk
-o : 生成的補丁文件所放的文件夾
-k : 簽名打包密鑰
-p : 簽名打包密鑰密碼
-a : 簽名密鑰別名
-e : 簽名別名密碼(這樣一般和密鑰密碼一致)
我的是這樣子:
apkpatch.bat -f new.apk -t old.apk -o out -k joke.jks -p 240336124 -a 內涵段子 -e 240336124
1.3 修複apatch包
怎麼獲取apatch包呢?我們肯定是請求介面獲取下載我們的修複好的apatch包,當然有可能沒有就太好了佛祖保佑。下載下來之後我們就可以調用方法進行修複了,我們可以暫時放在本地測試一下,這些代碼肯定之前就得寫好:
public class BaseApplication extends Application { // Patch管理類 public static PatchManager mPatchManager; @Override public void onCreate() { super.onCreate(); // 捕捉崩潰信息 ExceptionCrashHandler.getInstance().init(this); // Ali熱修複 try { mPatchManager = new PatchManager(this); // 初始化patch版本 String pkName = this.getPackageName(); String versionName = getPackageManager().getPackageInfo(pkName, 0).versionName; // 初始化版本名稱 mPatchManager.init(versionName); // 載入之前的patch mPatchManager.loadPatch(); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } } }
主頁面MainActivity
1 public class MainActivity extends BaseSkinActivity { 2 3 @Override 4 protected void initData() { 5 // 獲取上次的崩潰信息 6 File crashFile = ExceptionCrashHandler.getInstance().getCrashFile(); 7 // 上傳到伺服器,後面再說....... 8 } 9 10 @Override 11 protected void initView() { 12 13 } 14 15 @Override 16 protected void setContentView() { 17 setContentView(R.layout.activity_main); 18 } 19 20 @Override 21 protected void initTitle() { 22 23 } 24 25 @Onclick(R.id.test) 26 public void test(View view) { 27 // 沒有修複之前會報異常閃退 28 Toast.makeText(this, Utils.test(), Toast.LENGTH_LONG).show(); 29 } 30 31 @Onclick(R.id.ali_fix) 32 public void aliHotFix(View view) { 33 try { 34 // 測試 目前暫且放在本地 35 String patchFileString = Environment.getExternalStorageDirectory()+"/fix.apatch"; 36 Log.e("TAG", patchFileString); 37 // 修複apatch,不需要重啟可立即生效 38 BaseApplication.mPatchManager.addPatch(patchFileString); 39 Toast.makeText(this, "Bug修複成功", Toast.LENGTH_LONG).show(); 40 } catch (Exception e) { 41 e.printStackTrace(); 42 Toast.makeText(this, "Bug修複失敗", Toast.LENGTH_LONG).show(); 43 } 44 } 45 }
運行的效果就在最上面,如果直接點擊測試會報異常閃退,當我們點擊完阿裡開源熱修複後再次點擊測試,發現不閃退了。接下來的內容你可能要看不懂了請做好準備。