博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android热修复之 - 阿里开源的热补丁
阅读量:6226 次
发布时间:2019-06-21

本文共 2950 字,大约阅读时间需要 9 分钟。

1.1 基本介绍

 
  我们先去github上面了解它

这里就有一个概念那就AndFix.apatch补丁用来修复方法,接下来我们看看到底是怎么实现的。

  

1.2 生成apatch包
  
  假如我们收到了用户上传的崩溃信息,我们改完需要修复的Bug,这个时候就会有一个新的的apk我们就叫它为new.apk,原来的那个有Bug的apk你也有我们就叫它old.apk。这个时候我们就可以利用生成一个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     @Override11     protected void initView() {12 13     }14 15     @Override16     protected void setContentView() {17         setContentView(R.layout.activity_main);18     }19 20     @Override21     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 }

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

 

1.4 正式开发需要注意的地方:

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

转载于:https://www.cnblogs.com/ganchuanpu/p/8184554.html

你可能感兴趣的文章
[转]推荐一些不错的计算机书籍
查看>>
linux命令(30):tail
查看>>
有关windows dpi适配(c#)
查看>>
SoupUI的使用
查看>>
Nlog的简单使用
查看>>
JQuery中 数组与字符串(过滤,排序,拆分,合并)
查看>>
pycharm 设置
查看>>
js添加事件
查看>>
模式识别开发之项目---基于人头检测的人流量监测
查看>>
嵌入式开发之优化---代码优化
查看>>
题解 P1665 【正方形计数】
查看>>
python 字典 get方法
查看>>
支付宝9张图稳扫出敬业福
查看>>
GBDT记录
查看>>
同一个菜品商家中心和erp价格显示不一致解决方案FAQ
查看>>
新博客
查看>>
中文前端UI框架Kit(十一)摇头动画?让你的页面元素嗑药嗑起来??
查看>>
2018-2019-2 20162329 《网络对抗技术》Exp7: 网络欺诈防范
查看>>
今日随笔:scrollTop与overflow
查看>>
分分钟用上C#中的委托和事件
查看>>