android--------阿里 AndFix 热修复
AndFix,全称是Android hot-fix。是阿里开源的一个热补丁框架,允许APP在不重新发布版本的情况下修复线上的bug。
支持Android 2.3 到 6.0,并且支持arm 与 X86系统架构的设备。完美支持Dalvik与ART的Runtime,补丁文件是以 .apatch 结尾的文件。
原理
AndFix的原理就是方法的替换,把有bug的方法替换成补丁文件中的方法;
直接在native层进行方法的结构体信息对换,从而实现完美的方法新旧替换,从而实现热修复功能。
添加依赖和混淆
compile 'com.alipay.euler:andfix:0.5.0@aar'
-keep class * extends java.lang.annotation.Annotation
-keepclasseswithmembernames class * {
native <methods>;
}
权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
Application 代码(在AndriodManifest中添加)
public class AndFixApplication extends Application { public static PatchManager mPatchManager; public String TAG = "Application"; private static final String APATCH_PATH = "/out.apatch"; // 补丁文件名 @Override
public void onCreate() {
super.onCreate();
// 初始化patch管理类
mPatchManager = new PatchManager(this);
// 初始化patch版本
mPatchManager.init("1.0"); mPatchManager.loadPatch(); try {
// .apatch file path ,这里一定要注意每台手机sd卡路径不同
String patchFileString = Environment.getExternalStorageDirectory().getAbsolutePath() + APATCH_PATH;
Log.i(TAG, "onCreate: "+patchFileString);
//3)添加patch
mPatchManager.addPatch(patchFileString);
Log.d(TAG, "apatch:" + patchFileString + " added.");
} catch (IOException e) {
Log.e(TAG, "", e);
} }
}
生成有bug的apk文件和生成修复好的apk文件
第一次apk文件代码,表示有bug未修复的
private void initView(){
textView = (TextView) findViewById(R.id.textview);
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"bug未修复",Toast.LENGTH_LONG).show();
textView.setText("bug未修复");
}
});
}
生成签名文件 andfix.jks 然后生成apk文件,命名为 old.apk
第二步生成 修复bug的apk文件,我的修复很简单,命名为new.apk
private void initView(){
textView = (TextView) findViewById(R.id.textview);
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"bug已修复",Toast.LENGTH_LONG).show();
textView.setText("bug已修复");
}
});
}
生成patch补丁文件
下载生成工具:https://github.com/alibaba/AndFix/tree/master/tools 下的apkpatch-1.0.3.zip
解压文件,假设在:F:\blog\android\java\git\three\rexiufu\aliyun\andfix\apkpatch\ 目录下 (指明便于我讲解补丁文件生成)
cmd打开命令,切换到 F:\blog\android\java\git\three\rexiufu\aliyun\andfix\apkpatch\ 目录下
然后把先前生成的两个apk 文件 old.apk和new.apk 拷贝到该目录下,把生成的签名文件andfix.jks 也拷贝到该目录下
输入命令生成 补丁文件,输入命令,看到下面表示成功
命令 : apkpatch.bat -f new.apk -t old.apk -o D:\Android -k andfix.jks -p 123456 -a andfix -e 123456
语法解释
-f <new.apk> :新版本
-t <old.apk> : 旧版本
-o <output> : 输出目录
-k <keystore>: 打包所用的keystore
-p <password>: keystore的密码
-a <alias>: keystore 用户别名
-e <alias password>: keystore 用户别名密码
在D:\Android 目录下面生成了两个文件
第二个就是补丁文件,我们也要使用他来实现补丁修复。
把第二个文件复制到 F:\blog\android\java\git\three\rexiufu\aliyun\andfix\apkpatch\ 目录下便于提交到手机内部存储下面.
重命名为 out.apatch 和前面的Application类中的APATCH_PATH的名称对应
private static final String APATCH_PATH = "/out.apatch"; // 补丁文件名
补丁文件修复旧(bug)apk
未提交补丁文件前,先把有bug的apk安装在手机上,运行起来,看看我的效果图:
这里我们通过adb命令来上传补丁到手机本地内存目录下,然后修复错误,
adb命令相关请看博客: http://www.cnblogs.com/zhangqie/p/8505252.html
上传成功后,我们结束bug应用,重新启动,修复补丁,效果图:
项目中使用
一般正式的项目不会这样去需要用户点击某个按钮来加载修复包(out.apatch),而是用户一开始进入我们app的时候,第一个界面就应该去服务器访问(一般一个App中都会有一个接口,用来获取服务器给客户端的全局配置)。
假设服务器返回有更新的包,应该就应该弹框
去下载apatch文件,这个时候用户是什么都做不了的,最好加个进度条,当下载完成后,然后修复,最后在跳到主界面。
最好使用HTTPS保证数据的安全,当我们访问服务器是否有修复包的时候,如果有,服务器应该返回修复文件apatch的下载地址和文件的MD5值,
然后客户端下载完成后对文件进行MD5,然后和服务器的返回的MD5值进行对比看是否一致,因为文件可能被篡改,安全问题,对MD5加密的值和后台人员商议,一致即可。
局限性
- 不支持YunOS
- 无法添加新类和新的字段
- 需要使用加固前的apk制作补丁,但是补丁文件很容易被反编译,也就是修改过的类源码容易泄露。
- 有的手机不支持,爱报错
所以并不推荐使用。
结语:
我的Demo中 测试 release版 (需要配置签名)我测试成功了,可以下载参考
Github:https://github.com/DickyQie/android-andfix
AndFix官网源码和案例:https://github.com/alibaba/AndFix
android--------阿里 AndFix 热修复的更多相关文章
- 阿里 AndFix 热修复框架简介
阿里AndFix热修复框架简介 热修复原理: Android的类加载机制 Android的类加载器分为两种,PathClassLoader和DexClassLoader,两者都继承自BaseDexCl ...
- 阿里最新热修复Sophix与QQ超级补丁和Tinker的实现与总结
2015年以来,Android开发领域里对热修复技术的讨论和分享越来越多,同时也出现了一些不同的解决方案,如QQ空间补丁方案.阿里AndFix以及微信Tinker(Bugly sdk也集成Tikner ...
- 阿里Sophix热修复
阿里巴巴对Android热修复技术已经进行了长达多年的探索. 最开始,是手淘基于Xposed进行了改进,产生了针对Android Dalvik虚拟机运行时的Java Method Hook技术,Dex ...
- Andfix热修复框架原理及源代码解析-上篇
热补丁介绍及Andfix的使用 Andfix热修复框架原理及源代码解析-上篇 Andfix热修复框架原理及源代码解析-下篇 1.不知道怎样使用的同学,建议看看我上一篇写的介绍热补丁和Andfix的使用 ...
- 阿里SopHix热修复框架
2015年以来,Android开发领域里对热修复技术的讨论和分享越来越多,同时也出现了一些不同的解决方案,如QQ空间补丁方案.阿里AndFix以及微信Tinker(Bugly sdk也集成Tikner ...
- Andfix热修复原理
一.前言 最近腾讯弄出一个Tinker热修复框架,那么本文先不介绍这个框架,先来介绍一下阿里的一个热修复框架AndFix,这个框架出来已经很长时间了,但是看网上没有太多非常详细的讲解,这里就来做一次分 ...
- AndFix热修复 —— 实战与源码解析
当你的应用发布后第二天却发现一个重要的bug要修复,头疼的同时你可能想着赶紧修复重新打个包发布出去,让用户收到自动更新重新下载.但是万事皆有可能,万一隔一天又发现一个急需修复的bug呢?难道再次发布打 ...
- Android之移动热修复
阿里云推出了移动热修复服务,听说这个服务傻瓜式接入,性能相对较好,对新技术比较好奇的我决定尝试一下. 1.首先,需要开通这个服务,创建应用 2.然后,在项目中接入服务.按照文档所述 第一步:gradl ...
- Andfix热修复技术使用
AndFix,全称是Android hot-fix.是阿里开源的一个Android热补丁框架,允许APP在不重新发版本的情况下修复线上的bug.支持Android 2.3 到 6.0. andfix的 ...
随机推荐
- 论文笔记:语音情感识别(三)手工特征+CRNN
一:Emotion Recognition from Human Speech Using Temporal Information and Deep Learning(2018 InterSpeec ...
- python json-json.loads()函数中的字符串需要是严格的json串格式,不能包含单引号
先看下json的dumps()和loads()函数的定义 json.dumps():将一个Python对象编码成JSON字符串.把字典对象转换成json串 json.loads():将JSON格式字符 ...
- Linux基础命令---dumpe2fs
dumpe2fs 显示ext2.ext3.ext4文件系统的超级快和块组信息.此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 1.语法 ...
- 在notepad++里面使用正则表达式替换掉所有行逗号前面内容
需求:在notepad++里面使用正则表达式替换掉所有行逗号前面内容,一文本内容如下(只贴一小部分,实际上N多): 级别,層級程序,程式插件,外掛程式鼠标,滑鼠打印,列印打开,開啟博客,部落格联系,聯 ...
- 虚拟机中安装mac系统
虚拟机安装就很简单了,傻瓜式安装,一直点击下一步就行,这里就不多说了. 所需要的配置: 虚拟机下载地址:链接:http://pan.baidu.com/s/1i45wXRf 密码:7c4x mac补丁 ...
- Django框架----models.py(数据库操作文件)
利用一个中间模块 帮助我们连接数据库,写SQL语句,执行SQL语句,拿到结果 models.py 一.数据的对应关系 1. 类 ---> 表 2. 对象 ---> 数据行 3. 属性 -- ...
- web前端----JavaScript的DOM(二)
前面在DOM一中我们知道了属性操作,下面我们来了解一下节点操作.很重要!! 一.节点操作 创建节点:var ele_a = document.createElement('a');添加节点:ele_p ...
- 20145122 《Java程序设计》第8周学习总结
教材学习内容总结 1.NIO使用频道(channel)来衔接数据节点,对数据区的标记提供了clear(),rewind(),flip(),compact()等高级操作. 2.想要取得channel的操 ...
- 网站精准查询IP
分享一些网站能精准查询IP的 https://www.chaidu.com/App/Web/IP/ http://www.ipip.net/ip.html http://www.hao7188.com ...
- java 关于wait,notify和notifyAll
public synchronized void hurt() { //... this.wait(); //... } public synchronized void recover() { // ...