Android热修复之 - 阿里开源的热补丁

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;@Overridepublic 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 }

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

 

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/391560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 456. 132 模式(单调栈)

给你一个整数数组 nums &#xff0c;数组中共有 n 个整数。132 模式的子序列 由三个整数 nums[i]、nums[j] 和 nums[k] 组成&#xff0c;并同时满足&#xff1a;i < j < k 和 nums[i] < nums[k] < nums[j] 。 如果 nums 中存在 132 模式的子序列 &#xff0c;返回…

seaborn分类数据可视:散点图|箱型图|小提琴图|lv图|柱状图|折线图

一、散点图stripplot( ) 与swarmplot&#xff08;&#xff09; 1.分类散点图stripplot( ) 用法stripplot(xNone, yNone, hueNone, dataNone, orderNone, hue_orderNone,jitterTrue, dodgeFalse, orientNone, colorNone, paletteNone,size5, edgecolor"gray", linewi…

数据图表可视化_数据可视化十大最有用的图表

数据图表可视化分析师每天使用的最佳数据可视化图表列表。 (List of best data visualization charts that Analysts use on a daily basis.) Presenting information or data in a visual format is one of the most effective ways. Researchers have proved that the human …

javascript实现自动添加文本框功能

转自&#xff1a;http://www.cnblogs.com/damonlan/archive/2011/08/03/2126046.html 昨天&#xff0c;我们公司的网络小组决定为公司做一个内部的网站&#xff0c;主要是为员工比如发布公告啊、填写相应信息、投诉、问题等等需求。我那同事给了我以下需求&#xff1a; 1.点击一…

从Mysql slave system lock延迟说开去

本文主要分析 sql thread中system lock出现的原因&#xff0c;但是笔者并明没有系统的学习过master-slave的代码&#xff0c;这也是2018年的一个目标&#xff0c;2018年我都排满了&#xff0c;悲剧。所以如果有错误请指出&#xff0c;也作为一个笔记用于后期学习。同时也给出笔…

传智播客全栈_播客:从家庭学生到自学成才的全栈开发人员

传智播客全栈In this weeks episode of the freeCodeCamp podcast, Abbey chats with Madison Kanna, a full-stack developer who works remotely for Mediavine. Madison describes how homeschooling affected her future learning style, how she tackles imposter syndrom…

leetcode 82. 删除排序链表中的重复元素 II(map)

解题思路 map记录数字出现的次数&#xff0c;出现次数大于1的数字从链表中移除 代码 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(…

python 列表、字典多排序问题

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 by-sa 版权协议&#xff0c;转载请附上原文出处链接和本声明。本文链接&#xff1a;https://blog.csdn.net/justin051/article/details/84289189Python使用sorted函数来排序&#xff1a; l [2,1,3,5,7,3]print…

接facebook广告_Facebook广告分析

接facebook广告Is our company’s Facebook advertising even worth the effort?我们公司的Facebook广告是否值得努力&#xff1f; 题&#xff1a; (QUESTION:) A company would like to know if their advertising is effective. Before you start, yes…. Facebook does ha…

如何创建自定义进度栏

Originally published on www.florin-pop.com最初发布在www.florin-pop.com The theme for week #14 of the Weekly Coding Challenge is: 每周编码挑战第14周的主题是&#xff1a; 进度条 (Progress Bar) A progress bar is used to show how far a user action is still in…

基于SpringBoot的CodeGenerator

title: 基于SpringBoot的CodeGenerator tags: SpringBootMybatis生成器PageHelper categories: springboot date: 2017-11-21 15:13:33背景 目前组织上对于一个基础的crud的框架需求较多 因此选择了SpringBoot作为基础选型。 Spring Boot是由Pivotal团队提供的全新框架&#xf…

seaborn线性关系数据可视化:时间线图|热图|结构化图表可视化

一、线性关系数据可视化lmplot( ) 表示对所统计的数据做散点图&#xff0c;并拟合一个一元线性回归关系。 lmplot(x, y, data, hueNone, colNone, rowNone, paletteNone,col_wrapNone, height5, aspect1,markers"o", sharexTrue,shareyTrue, hue_orderNone, col_orde…

hdu 1257

http://acm.hdu.edu.cn/showproblem.php?pid1257 题意&#xff1a;有个拦截系统&#xff0c;这个系统在最开始可以拦截任意高度的导弹&#xff0c;但是之后只能拦截不超过这个导弹高度的导弹&#xff0c;现在有N个导弹需要拦截&#xff0c;问你最少需要多少个拦截系统 思路&am…

eda可视化_5用于探索性数据分析(EDA)的高级可视化

eda可视化Early morning, a lady comes to meet Sherlock Holmes and Watson. Even before the lady opens her mouth and starts telling the reason for her visit, Sherlock can tell a lot about a person by his sheer power of observation and deduction. Similarly, we…

我的AWS开发人员考试未通过。 现在怎么办?

I have just taken the AWS Certified Developer - Associate Exam on July 1st of 2019. The result? I failed.我刚刚在2019年7月1日参加了AWS认证开发人员-联考。结果如何&#xff1f; 我失败了。 The AWS Certified Developer - Associate (DVA-C01) has a scaled score …

关系数据可视化gephi

表示对象之间的关系&#xff0c;可通过gephi软件实现&#xff0c;软件下载官方地址https://gephi.org/users/download/ 如何来表示两个对象之间的关系&#xff1f; 把对象变成点&#xff0c;点的大小、颜色可以是它的两个参数&#xff0c;两个点之间的关系可以用连线表示。连线…

Hyperledger Fabric 1.0 从零开始(十二)——fabric-sdk-java应用

Hyperledger Fabric 1.0 从零开始&#xff08;十&#xff09;——智能合约&#xff08;参阅&#xff1a;Hyperledger Fabric Chaincode for Operators——实操智能合约&#xff09; Hyperledger Fabric 1.0 从零开始&#xff08;十一&#xff09;——CouchDB&#xff08;参阅&a…

css跑道_如何不超出跑道:计划种子的简单方法

css跑道There’s lots of startup advice floating around. I’m going to give you a very practical one that’s often missed — how to plan your early growth. The seed round is usually devoted to finding your product-market fit, meaning you start with no or li…

将json 填入表格_如何将Google表格用作JSON端点

将json 填入表格UPDATE: 5/13/2020 - New Share Dialog Box steps available below.更新&#xff1a;5/13/2020-下面提供了 新共享对话框步骤。 Thanks Erica H!谢谢埃里卡H&#xff01; Are you building a prototype dynamic web application and need to collaborate with …

leetcode 173. 二叉搜索树迭代器

实现一个二叉搜索树迭代器类BSTIterator &#xff0c;表示一个按中序遍历二叉搜索树&#xff08;BST&#xff09;的迭代器&#xff1a; BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在…