查看: 199|回复: 0

[Android教程] Android热修复之 - 阿里开源的热补丁

发表于 5 天前

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 -t -o -k -p <> -a -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包,当然有可能没有就太好了佛祖保佑。下载下来之后我们就可以调用方法进行修复了,我们可以暂时放在本地测试一下,这些代码肯定之前就得写好:

  1. public class BaseApplication extends Application {
  2. // Patch管理类
  3. public static PatchManager mPatchManager;
  4. @Override
  5. public void onCreate() {
  6. super.onCreate();
  7. // 捕捉崩溃信息
  8. ExceptionCrashHandler.getInstance().init(this);
  9. // Ali热修复
  10. try {
  11. mPatchManager = new PatchManager(this);
  12. // 初始化patch版本
  13. String pkName = this.getPackageName();
  14. String versionName = getPackageManager().getPackageInfo(pkName, 0).versionName;
  15. // 初始化版本名称
  16. mPatchManager.init(versionName);
  17. // 加载之前的patch
  18. mPatchManager.loadPatch();
  19. } catch (PackageManager.NameNotFoundException e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. }
复制代码
  1. 主页面MainActivity
复制代码
  1. 1 public class MainActivity extends BaseSkinActivity {
  2. 2
  3. 3 @Override
  4. 4 protected void initData() {
  5. 5 // 获取上次的崩溃信息
  6. 6 File crashFile = ExceptionCrashHandler.getInstance().getCrashFile();
  7. 7 // 上传到服务器,后面再说.......
  8. 8 }
  9. 9
  10. 10 @Override
  11. 11 protected void initView() {
  12. 12
  13. 13 }
  14. 14
  15. 15 @Override
  16. 16 protected void setContentView() {
  17. 17 setContentView(R.layout.activity_main);
  18. 18 }
  19. 19
  20. 20 @Override
  21. 21 protected void initTitle() {
  22. 22
  23. 23 }
  24. 24
  25. 25 @Onclick(R.id.test)
  26. 26 public void test(View view) {
  27. 27 // 没有修复之前会报异常闪退
  28. 28 Toast.makeText(this, Utils.test(), Toast.LENGTH_LONG).show();
  29. 29 }
  30. 30
  31. 31 @Onclick(R.id.ali_fix)
  32. 32 public void aliHotFix(View view) {
  33. 33 try {
  34. 34 // 测试 目前暂且放在本地
  35. 35 String patchFileString = Environment.getExternalStorageDirectory()+"/fix.apatch";
  36. 36 Log.e("TAG", patchFileString);
  37. 37 // 修复apatch,不需要重启可立即生效
  38. 38 BaseApplication.mPatchManager.addPatch(patchFileString);
  39. 39 Toast.makeText(this, "Bug修复成功", Toast.LENGTH_LONG).show();
  40. 40 } catch (Exception e) {
  41. 41 e.printStackTrace();
  42. 42 Toast.makeText(this, "Bug修复失败", Toast.LENGTH_LONG).show();
  43. 43 }
  44. 44 }
  45. 45 }
复制代码

运行的效果就在最上面,如果直接点击测试会报异常闪退,当我们点击完阿里开源热修复后再次点击测试,发现不闪退了。接下来的内容你可能要看不懂了请做好准备。

1.4 正式开发需要注意的地方: 1.每次生成之后一定要测试; 2.尽量的不要分包,不要分多个dex 3.混淆的时候,设计到NDK AndFix.java 不要混淆 4.生成包之后一般会加固什么的,这个时候生成的差分包,一定要在之前去生成。 5.既然是去修复方法,第一个不能增加成员变量,不能增加方法
复制代码



上一篇:Java编程规范
下一篇:2017年终总结
回复

使用道具 举报