Android 热修复AndFix
来源:互联网 发布:伪娘 知乎 编辑:程序博客网 时间:2024/05/29 04:47
AndFix的github地址
AndFix
全称Android hot-fix,是alibaba的Android热修复框架,支持Android 2.3到6.0的版本,支持arm与X86系统架构,支持Dalvik和ART Runtime。
原理
AndFix的原理就是方法的替换,把有bug的方法替换成补丁文件中的方法。
使用教程
1. 添加依赖和混淆dependencies { compile 'com.alipay.euler:andfix:0.4.0@aar'}
混淆:
-keep class * extends java.lang.annotation.Annotation-keepclasseswithmembernames class * { native <methods>;}
2. 在Application.onCreate()中初始化PatchManager
public class AndFixApplication extends Application { public static PatchManager mPatchManager; @Override public void onCreate() { super.onCreate(); // 初始化patch管理类 mPatchManager = new PatchManager(this); // 初始化patch版本 mPatchManager.init("1.0");// String appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;// mPatchManager.init(appVersion); // 加载已经添加到PatchManager中的patch mPatchManager.loadPatch(); }}
3. 找个地方加载补丁,我们这里为了演示,点击按钮进行加载补丁
findViewById(R.id.main_btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { update(); } });
private static final String APATCH_PATH = "/fix.apatch"; // 补丁文件名
private void update() { String patchFileStr = Environment.getExternalStorageDirectory().getAbsolutePath() + APATCH_PATH; try { AndFixApplication.mPatchManager.addPatch(patchFileStr); } catch (IOException e) { e.printStackTrace(); } }
PatchManager的addPatch方法加载新补丁,项目中可以在下载补丁文件之后调用,这里为了演示就把补丁文件放在本地的SD卡中了,代码中patchFileStr就是补丁存放的位置,.apatch就是生成补丁文件的后缀名,fix就是补丁文件的名字,这里我们将其名字写死。
我们看一下打补丁之前MainActivity的所有代码
public class MainActivity extends AppCompatActivity { private static final String APATCH_PATH = "/fix.apatch"; // 补丁文件名 private TextView mainTv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mainTv = (TextView) findViewById(R.id.main_tv); mainTv.setText("点击Toast"); mainTv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showToast(); } }); findViewById(R.id.main_btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { update(); } }); } private void showToast() { Toast.makeText(this, "打补丁之前", Toast.LENGTH_LONG).show(); } /** * 动态更新,加载补丁文件 * @author zehua_chen * create at 2016/8/3 14:35 */ private void update() { String patchFileStr = Environment.getExternalStorageDirectory().getAbsolutePath() + APATCH_PATH; try { AndFixApplication.mPatchManager.addPatch(patchFileStr); } catch (IOException e) { e.printStackTrace(); } }}
4. 我们将以上应用打包,我们命名为andfix_v1.0
5. 修改MainActivity中的代码,打包成andfix_v2.0
private void showToast() { Toast.makeText(this, "打补丁之后", Toast.LENGTH_LONG).show(); }
mainTv.setText("加载了补丁之后");
上面代码可知,我们只修改TextView的文字和TextView点击之后的Toast内容,然后打包
6. 使用官方提供的工具apkpatch生成.apatch补丁文件
点击上面的链接下载apkpatch之后解压
将两个apk文件和该app的签名文件放入到该目录中
使用命令生成.apatch补丁文件,先cmd进入该目录
使用命令生成补丁
上图所示则表示补丁包生成完成
apkpatch.bat -f andfix_v2.0.apk -t andfix_v1.0.apk -o output -k AndFixKey.jks -p andfix -a andfix -e andfix
apkpatch.bat -f 新apk -t 旧apk -o 输出目录 -k app签名文件 -p 签名文件密码 -a 签名文件别名 -e 别名密码
- -f <new.apk> :新apk
- -t <old.apk> : 旧apk
- -o <output> : 输出目录(补丁文件的存放目录)
- -k <keystore>: 打包所用的keystore
- -p <password>: keystore的密码
- -a <alias>: keystore 用户别名
- -e <alias password>: keystore 用户别名密码
生成的output文件:
将生成的.apatch补丁文件改成代码中写死的fix.apatch
7.运行andfix_v1.0查看修复之前的效果,把补丁文件push到sd卡目录下, 点击Button更新按钮加载补丁文件,再看其效果,到这里我们就完成了AndFix的热修复了
- 运行andfix_v1.0没有点击动态更新按钮,点击TextView
点击动态更新Button之后再Toast,我们发现Tost的内容变了,但是TextView的内容没换
退出之后我们重新进入该应用就会发现TextView的内容也变化了。
- Android 热修复-AndFix
- Android热修复---AndFix
- Android 热修复 AndFix
- Android 热修复AndFix
- Android 热修复之AndFix
- Android AndFix 热修复框架
- Android热修复之AndFix
- Android AndFix 热修复 使用
- Android AndFix 热修复框架
- Android热修复框架andfix
- Android 热修复 andfix demo
- Android AndFix 热修复框架
- android:AndFix热修复实现
- Android热修复之AndFix
- android热修复之AndFix
- Android 热修复框架AndFix
- android热修复实践-andfix
- Android热修复之AndFix.android studio
- 微信公众号开发-客户端侧-服务器URL认证 Java版
- php 删除目录,文件
- request.getRequestDispatcher()跳转+中文乱码
- android 常用api 接口签名验证
- uboot编译
- Android 热修复AndFix
- iOS - 解决This application is modifying the autolayout engine from a background thread
- Spring管理filter和servlet
- Android WebView 跳转动画和后退动画的处理
- uboot内文件介绍
- ERP顾问工作中应该注意哪些工作是不该做的
- jquery 等待3秒钟执行函数
- [转]c++ 时间类型详解 time_t
- struts.objectFactory和struts.objectFactory.spring.autoWire