美文网首页
热补丁技术初探(一)

热补丁技术初探(一)

作者: Geepi | 来源:发表于2016-08-19 14:10 被阅读0次

上月领导有想法,希望公司能实现热更新的技术与提供解决方案,应对一些函数,变量,配置级别的bug的修复。特去整理了下,整理了三个可探究的方案:andfix Dexposed ClassLoader。
现在整理下优缺点:
Dexposed:支持的系统版本,上限是4.4,直接pass,采用的AOP切片式思维,在数据统计这块有大用途,阿里开源的库,比较老的一个库;
ClassLoader: 插件式思维,和注入式更新还是有点不一样;
andfix:支持的系统全面,阿里2015年开源的库,在native层注入代码,解决思路有点类似IOS的jspatch。
最终决定,采用andfix的解决方案,马上教程式的给出集成方案。

一、基础原理

全称Android hot-fix,是alibaba的Android热修复框架,支持Android 2.3到6.0的版本,支持arm与X86系统架构,支持Dalvik和ART Runtime。
原理
AndFix的原理就是方法的替换,把有bug的方法替换成补丁文件中的方法。


原理-替换方法

二、使用教程

1)github上的链接
https://github.com/alibaba/AndFix
作为module集成到项目中
2)在AndroidMainFest.xml中生命所需要的权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

3) 添加依赖和混淆

dependencies { compile 'com.alipay.euler:andfix:0.4.0@aar' }

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

4)在Application.onCreate()中初始化PatchManager

public class HotPatchApplication extends Application {
    public static PatchManager mPatchManager;
    @Override
    public void onCreate() {
        super.onCreate();
        // 初始化patch管理类
        mPatchManager = new PatchManager(this);
        // 初始化patch版本
        mPatchManager.init("1.0");
        // 加载已经添加到PatchManager中的patch
        mPatchManager.loadPatch();
    }
}

5)找个地方加载补丁,我们这里为了演示,点击按钮进行加载补丁

findViewById(R.id.main_btn).setOnClickListener(new View.OnClickListener() {   
       @Override    
       public void onClick(View v) {       
             update();   
       }
});
private void update() {    
        String patchFileStr = Environment.getExternalStorageDirectory().getAbsolutePath() + APATCH_PATH;    
         try { 
             HotPatchApplication.mPatchManager.addPatch(patchFileStr);    
         } catch (IOException e) {   
            e.printStackTrace();    
        }
}

PatchManager的addPatch方法加载新补丁,项目中可以在下载补丁文件之后调用,这里为了演示就把补丁文件放在本地的SD卡中了,代码中patchFileStr就是补丁存放的位置,.apatch就是生成补丁文件的后缀名,fix就是补丁文件的名字,这里我们将其名字写死。
至此,热更新的功能代码全部写完
6)写上测试是否替代成功的代码
热更新覆盖前的代码如下:

mainTv = (TextView) findViewById(R.id.main_tv);mainTv.setText("点击Toast");
mainTv.setOnClickListener(new View.OnClickListener() {    
    @Override    
    public void onClick(View v) {        
        showToast();    
    }
});

private void showToast() {    
        Toast.makeText(this, "打补丁之前", Toast.LENGTH_LONG).show();
}

编译打包城一个old.apk(使用release的签名证书)
热更新覆盖的代码如下:

mainTv = (TextView) findViewById(R.id.main_tv);
mainTv.setText("点击Toast");
mainTv.setOnClickListener(new View.OnClickListener() {    
      @Override    
      public void onClick(View v) {    
            showToast();  
      }
});

private void showToast() {    
      Toast.makeText(this, "打补丁之后", Toast.LENGTH_LONG).show();
}

编译打包成一个new.apk(使用release的签名证书)。

三、测试过程

Paste_Image.png

使用andfix中的diff工具执行,生成一个appatch文件,命名为fix.appacth

Paste_Image.png

adb push上述fix.appatch文件到sd卡中;
3)


Paste_Image.png

安装old.apk

4)打开app,点击跟新,

10230000.jpg

点击更新按钮,然后点击toast按钮,应当能看到 “打补丁之后”的提示。

git:https://github.com/braveliao/hotupdate

相关文章

  • 热补丁技术初探(一)

    上月领导有想法,希望公司能实现热更新的技术与提供解决方案,应对一些函数,变量,配置级别的bug的修复。特去整理了下...

  • javassist即时编译技术,美团热修复核心与原理解密01-美

    什么是热修复技术? 关于热修复这个名词,并不陌生。相信大家都有过更新window补丁的经历,通过补丁可以动态修复系...

  • Android 热修复介绍之代码修复

    什么是Android热修复技术 简单来说就是不重新安装apk的情况下,通过补丁,修复bug 目前主流的热修复技术框...

  • 快速接入美团热修复Robust

    相信很多人都认识了解过 热修复、热更新、热补丁(对于这个技术也没有特别标准的一种叫法,下面我统一叫热更新),之后的...

  • 热修复

    什么是热修复 那么关于Android平台的热修复技术,简单来说,就是通过下发补丁包,让已安装的客户端动态更新,让用...

  • Android关于热修复

    热修复: 热修复(也称热补丁、热修复补丁,英语:hotfix)是一种包含信息的独立的累积更新包,通常表现为一个或多...

  • 热修复框架源码剖析

    前言 在一个多月前,我写过一篇热修复初探,主要介绍了各种被广泛讨论和使用的热修复的技术实现原理,在那篇文章中,我也...

  • Andfix源码分析

    热修复主要有三个步骤: 1 生成差异补丁 2 加载差异补丁 3 替换方法 1.1 生成差异补丁 阿里提供的差量补丁...

  • Android热修复技术选择和原理分析

    背景 热修复就是通过下发补丁包,让已安装的客户端动态更新,用户不用重新安装APP,就能够修复软件缺陷。 热修复技术...

  • 8年老Android开发:热修复的知识全在这里

    背景 热修复就是通过下发补丁包,让已安装的客户端动态更新,用户不用重新安装APP,就能够修复软件缺陷。 热修复技术...

网友评论

      本文标题:热补丁技术初探(一)

      本文链接:https://www.haomeiwen.com/subject/awebsttx.html