AndFix的github地址

AndFix

全称Android hot-fix,是alibaba的Android热修复框架,支持Android 2.3到6.0的版本,支持arm与X86系统架构,支持Dalvik和ART Runtime。

原理

AndFix的原理就是方法的替换,把有bug的方法替换成补丁文件中的方法。

 
原理-替换方法.png

使用教程

1. 添加依赖和混淆

  1. compile 'com.alipay.euler:andfix:0.4.0@aar'
  2. }```
  3.    **混淆:**

-keep class * extends java.lang.annotation.Annotation
-keepclasseswithmembernames class * {
native <methods>;
}

  1. **. Application.onCreate()中初始化PatchManager**

public class AndFixApplication extends Application {

  1. public static PatchManager mPatchManager;
  2.  
  3. @Override
  4. public void onCreate() {
  5. super.onCreate();
  6.  
  7. // 初始化patch管理类
  8. mPatchManager = new PatchManager(this);
  9.  
  10. // 初始化patch版本
  11. mPatchManager.init("1.0");

// String appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
// mPatchManager.init(appVersion);

  1. // 加载已经添加到PatchManager中的patch
  2. mPatchManager.loadPatch();
  3. }

}

  1. **3. 找个地方加载补丁,我们这里为了演示,点击按钮进行加载补丁**
  1. findViewById(R.id.main_btn).setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. update();
  5. }
  6. });

private static final String APATCH_PATH = "/fix.apatch"; // 补丁文件名

  1. private void update() {
  2. String patchFileStr = Environment.getExternalStorageDirectory().getAbsolutePath() + APATCH_PATH;
  3. try {
  4. AndFixApplication.mPatchManager.addPatch(patchFileStr);
  5. } catch (IOException e) {
  6. e.printStackTrace();
  7. }
  8. }
  1. PatchManageraddPatch方法加载新补丁,项目中可以在下载补丁文件之后调用,这里为了演示就把补丁文件放在本地的SD卡中了,代码中patchFileStr就是补丁存放的位置,**.apatch**就是生成补丁文件的后缀名,fix就是补丁文件的名字,这里我们将其名字写死。
  2. 我们看一下打补丁之前MainActivity的所有代码

public class MainActivity extends AppCompatActivity {

  1. private static final String APATCH_PATH = "/fix.apatch"; // 补丁文件名
  2. private TextView mainTv;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7.  
  8. mainTv = (TextView) findViewById(R.id.main_tv);
  9. mainTv.setText("点击Toast");
  10. mainTv.setOnClickListener(new View.OnClickListener() {
  11. @Override
  12. public void onClick(View v) {
  13. showToast();
  14. }
  15. });
  16.  
  17. findViewById(R.id.main_btn).setOnClickListener(new View.OnClickListener() {
  18. @Override
  19. public void onClick(View v) {
  20. update();
  21. }
  22. });
  23.  
  24. }
  25.  
  26. private void showToast() {
  27. Toast.makeText(this, "打补丁之前", Toast.LENGTH_LONG).show();
  28. }
  29.  
  30. /**
  31. * 动态更新,加载补丁文件
  32. * @author zehua_chen
  33. * create at 2016/8/3 14:35
  34. */
  35. private void update() {
  36. String patchFileStr = Environment.getExternalStorageDirectory().getAbsolutePath() + APATCH_PATH;
  37. try {
  38. AndFixApplication.mPatchManager.addPatch(patchFileStr);
  39. } catch (IOException e) {
  40. e.printStackTrace();
  41. }
  42. }

}

  1. **. 我们将以上应用打包,我们命名为andfix_v1.**
  2. ![andfix_v1..png](http://upload-images.jianshu.io/upload_images/1689990-fea1230a4b800532.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  3.  
  4. **. 修改MainActivity中的代码,打包成andfix_v2.**
  1. private void showToast() {
  2. Toast.makeText(this, "打补丁之后", Toast.LENGTH_LONG).show();
  3. }
  1. mainTv.setText("加载了补丁之后");
  1. 上面代码可知,我们只修改TextView的文字和TextView点击之后的Toast内容,然后打包
  2. ![andfix_v2..png](http://upload-images.jianshu.io/upload_images/1689990-6375e8976f9aba23.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  3.  
  4. **. 使用官方提供的工具[apkpatch](https://github.com/alibaba/AndFix/blob/master/tools/apkpatch-1.0.3.zip)生成.apatch补丁文件**
  5. 点击上面的链接下载apkpatch之后解压
  6. ![apkpatch.png](http://upload-images.jianshu.io/upload_images/1689990-d694879c1ef977f8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  7. 将两个apk文件和该app的签名文件放入到该目录中
  8. ![加入签名文件和apk.png](http://upload-images.jianshu.io/upload_images/1689990-9217393c8a6016e1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  9.  
  10. 使用命令生成.apatch补丁文件,先cmd进入该目录
  11.  
  12. ![进人apkpatch目录.png](http://upload-images.jianshu.io/upload_images/1689990-86d824a35b3a5f2d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  13. 使用命令生成补丁
  14. ![生成补丁文件.png](http://upload-images.jianshu.io/upload_images/1689990-4ea5d937652ad95f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  15. 上图所示则表示补丁包生成完成
  16.  
  17. <u>apkpatch.bat -f andfix_v2..apk -t andfix_v1..apk -o output -k AndFixKey.jks -p andfix -a andfix -e andfix</u>
  18.  
  19. <u>apkpatch.bat -f apk -t apk -o 输出目录 -k app签名文件 -p 签名文件密码 -a 签名文件别名 -e 别名密码</u>
  20.  
  21. * -f <new.apk> :新apk
  22. * -t <old.apk> : apk
  23. * -o <output> 输出目录(补丁文件的存放目录)
  24. * -k <keystore> 打包所用的keystore
  25. * -p <password> keystore的密码
  26. * -a <alias> keystore 用户别名
  27. * -e <alias password>: keystore 用户别名密码
  28.  
  29. 生成的output文件:
  30. ![生成的output文件.png](http://upload-images.jianshu.io/upload_images/1689990-388d2802c9ec436a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  31.  
  32. ![apatch补丁文件.png](http://upload-images.jianshu.io/upload_images/1689990-ebf6c69cc76890e5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  33.  
  34. 将生成的.apatch补丁文件改成代码中写死的fix.apatch
  35. ![改名成fix.apatch.png](http://upload-images.jianshu.io/upload_images/1689990-8d2aeead99d107d1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  36.  
  37. **.运行andfix_v1.0查看修复之前的效果,把补丁文件pushsd卡目录下, 点击Button更新按钮加载补丁文件,再看其效果,到这里我们就完成了AndFix的热修复了**
  38.  
  39. ![打开File Explorer.png](http://upload-images.jianshu.io/upload_images/1689990-1c2eb8b8edbe4209.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  40.  
  41. ![push fix.apatch文件到sd卡中.png](http://upload-images.jianshu.io/upload_images/1689990-c9be1be105ffa32c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  42.  
  43. * 运行andfix_v1.0没有点击动态更新按钮,点击TextView
  44. ![打补丁之前.jpg](http://upload-images.jianshu.io/upload_images/1689990-cd3785eaec76e2f9.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  45. * 点击动态更新Button之后再Toast,我们发现Tost的内容变了,但是TextView的内容没换
  46. ![动态更新再Toast.jpg](http://upload-images.jianshu.io/upload_images/1689990-f38474939eeb74c5.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  47.  
  48. * 退出之后我们重新进入该应用就会发现TextView的内容也变化了。
  49. ![打补丁之后,退出再重新进入.jpg](http://upload-images.jianshu.io/upload_images/1689990-5c5880c9d9525a77.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

Android热修复之AndFix使用教程的更多相关文章

  1. [Android]热修复框架AndFix测试说明

    AndFix,全称是Android hot-fix.是阿里开源的一个热补丁框架,允许APP在不重新发布版本的情况下修复线上的bug.支持Android 2.3 到 6.0,并且支持arm 与 X86系 ...

  2. 十分钟教会你使用安卓热修复框架AndFix

    腾讯最近开发出一个Tinker,阿里也有一个Dexposed框架,当然还有一个就是今天的主角热修复框架AndFix.接下来,我会从它的概念.原理.使用方法等为你详细介绍. 1.什么是AndFix? A ...

  3. 走进热修复框架AndFix的世界

    关于阿里的开源热修复框架AndFix引起了广泛共鸣,受到了很多人的青睐.那今天就跟随我的步伐来详细了解一下AndFix的详细信息和使用方法.1.什么是AndFix? AndFix是阿里巴巴出的一个专门 ...

  4. Android热修复之微信Tinker使用初探

      文章地址:Android热修复之微信Tinker使用初探 前几天,万众期待的微信团队的Android热修复框架tinker终于在GitHub上开源了. 地址:https://github.com/ ...

  5. 全面了解Android热修复技术

    WeTest 导读 本文探讨了Android热修复技术的发展脉络,现状及其未来. 热修复技术概述 热修复技术在近年来飞速发展,尤其是在InstantRun方案推出之后,各种热修复技术竞相涌现.国内大部 ...

  6. Android热修复框架汇总整理(Hotfix)

      Android平台出现了一些优秀的热更新方案,主要可以分为两类:一类是基于multidex的热更新框架,包括Nuwa.Tinker等:另一类就是native hook方案,如阿里开源的Andfix ...

  7. Android热修复技术原理详解(最新最全版本)

    本文框架 什么是热修复? 热修复框架分类 技术原理及特点 Tinker框架解析 各框架对比图 总结   通过阅读本文,你会对热修复技术有更深的认知,本文会列出各类框架的优缺点以及技术原理,文章末尾简单 ...

  8. Android热修复技术总结

    https://blog.csdn.net/xiangzhihong8/article/details/77718004 插件化和热修复技术是Android开发中比较高级的知识点,是中级开发人员通向高 ...

  9. Android热修复技术原理详解

    阿里Dexposed -- native解决方案 原理: 直接在native层进行方法的结构体信息对换,从而实现完美的方法新旧替换,从而实现热修复功能   他的思想完全来源于Xposed框架,完美诠释 ...

随机推荐

  1. Smarty <= 3.1.32 Remote Code execution(CVE-2017-1000480)

    Smarty介绍   smarty是一个php模板引擎,其项目地址:https://github.com/smarty-php/smarty 测试环境搭建   下载:https://github.co ...

  2. java翻译到mono C#实现系列(4) 利用CountDownTimer类实现倒计时功能 mono版

    群里的朋友问利用CountDownTimer类实现倒计时功能怎么实现,我就百度了,参考http://blog.csdn.net/qq344429461/article/details/7521361写 ...

  3. MVC3权限验证,诡异的OnAuthorization

    mvc3权限验证 protected override void OnAuthorization(AuthorizationContext filterContext) { if (//开始权限验证返 ...

  4. MySQL中show语法

    1. show tables或show tables from database_name; -- 显示当前数据库中所有表的名称. 2. show databases; -- 显示mysql中所有数据 ...

  5. 配置tomcat-users

    <role rolename="admin-gui"/><role rolename="admin-script"/><role ...

  6. 【Maven学习】maven中依赖的配置详解

    根元素project下的dependencies可以包含一个或者多个dependency元素,以声明一个或多个项目依赖.每个依赖可以包含的元素有: groupId,artifactId和version ...

  7. C#的可空类型与不可空类型

    null:为空,表示产量没有指向任何对象, 如:string = null; int a = null;//是错的 但可以这样,在类型后面加一个问号. int? a = null;//这就是正确的,是 ...

  8. kd树 C++实现

    参考:百科kd-tree /* * kdtree.h * * Created on: Mar 3, 2017 * Author: wxquare */ #ifndef KDTREE_H_ #defin ...

  9. 10w定时任务,如何高效触发超时

    一.缘起 很多时候,业务有定时任务或者定时超时的需求,当任务量很大时,可能需要维护大量的timer,或者进行低效的扫描. 例如:58到家APP实时消息通道系统,对每个用户会维护一个APP到服务器的TC ...

  10. JAVA练手--String

    package tet; public class kk { public static void main(String[] args) { //1. { String Stra = "1 ...