andfix 热补丁修复

andfix 热补丁修复

背景:

我们知道Android在发布新版本后如果发现某个方法有bug时native app是不能像webapp让用户无感知的实现更新代码的,我们必须要提醒用户下载新版本;在这种情况下我们就会希望有一种方法可以实现app的在线热修复;

很多大牛都提到过多种热修复的方法:

1. https://github.com/alibaba/AndFix

2. https://github.com/alibaba/dexposed

3. https://github.com/jasonross/Nuwa

4. https://github.com/bunnyblue/DroidFix

5. https://github.com/dodola/HotFix

他们的原理都来自于安卓App热补丁动态修复技术介绍,以及Android dex分包方案;有兴趣的朋友大家都去看看吧;

第一个和第二个都是Alibaba的开源框架,其他的我也没怎么了解,哈哈哈。。。

这里主要说下AndFix的使用方式,及具体的demo,很多原理性的东西大家自己去看,我可不能误人子弟啊。。。。。

andfix具体使用(androidstudio)

eclipse的朋友可以下载项目然后引用就可以了(类似于方法1)

一:两种引用方式:

  1. https://github.com/alibaba/AndFix下载andfix项目,新建Androidstudio项目将andfix作为 module引用就可以
  2. 在build.gradle文件中引用

compile ‘com.alipay.euler:andfix:0.3.1’

二:导入so文件

建立jniLibs文件夹将相应的so文件导入进去如图:

三:代码实现

  1. 在application中初始化:
package com.android.shub.andfixtest;

import android.app.Application;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Environment;
import android.util.Log;

import com.alipay.euler.andfix.patch.PatchManager;

import java.io.IOException;

/**
 * Created by shubing on 2016/3/15.
 */
public class MyApplication extends Application {

    private PatchManager mPatchManager;
    private static final String APATCH_PATH = "/output.apatch";
    private static final String DIR = "apatch";//补丁文件夹

    @Override
    public void onCreate() {
        super.onCreate();
        mPatchManager = new PatchManager(this);
        mPatchManager.init("1.0");

        mPatchManager.loadPatch();

        String patchFileString = Environment.getExternalStorageDirectory().getAbsolutePath() + APATCH_PATH;
        Log.e("测试hotFix-------->", "补丁文件领:“" + patchFileString + "”");
        try {
        //添加下载的补丁包路径
            mPatchManager.addPatch(patchFileString);

            //加载完补丁后删除补丁,否则有新补丁将不会生效哦
            mPatchManager.removeAllPatch();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * 获取应用信息
     *
     * @param context
     * @return
     */
    public static PackageInfo getPackageInfo(Context context) {
        PackageInfo packageInfo = null;
        try {
            packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);

        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return packageInfo;
    }
}

MainActivity就简单了,就两个toast方法,原先的包就一个toast方法,修改后增加一个toast,先后生成两个apk

package com.android.shub.andfixtest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        showToast();
//        showToastNew();

    }

    private void showToast() {
        Toast.makeText(this, "第一个TOAST", Toast.LENGTH_SHORT).show();
    }

    private void showToastNew() {
        Toast.makeText(this, "第二个TOAST!", Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        android.os.Process.killProcess(android.os.Process.myPid());
    }
}

四:生成补丁包

用apkpatch 工具对以上两个新老apk生成补丁包;apkpatch下载点这里

githtb上也是有的,我这里把它传上去了,下载完解压,打开cmd命令行,cd到apkpatch.bat所在的目录:

具体命令可以参考github上,这里我引用下来:

apkpatch -f ‘新apk路径’ -t‘ 旧apk的路径’ -o ‘生成的补丁包的输出目录’ -k‘ 打包签名的keystore文件路径’ -p ‘签名文件密码’ -a‘ keystore别名’ -e ’keyStore entry的密码‘

(输命令的时候单引号不要哦!!)

命令输好后执行就生成了相应的补丁包了,将补丁包重命名成MyApplication中定义的output.apatch放到MyApplication中指定好的路径下就可以了

注意:Application的oncreate方法、xml绑定的方法、构造方法不能修复

总结:

至此andfix的使用就全部完了,用起来还是挺简单的,原理还是值得深究

demo下载地址http://download.csdn.net/detail/shubing521/9512028

时间: 2024-10-08 14:09:09

andfix 热补丁修复的相关文章

热修复干货| AndFix热补丁动态修复框架使用教程

本篇文章会与大家一起学习使用阿里的AndFix热修复框架,可以说AndFix是国内热修复技术的开山始祖,尽管现在阿里已经放弃了对这个项目的维护,但是后来很多的热修复技术都借鉴了这一框架的实现思路. 1.什么是AndFix?AndFix是阿里巴巴出的一个专门针对Android的热修复框架,那什么是热修复呢?就是不需要重新安装APK而达到修复bugs的目的.看看阿里巴巴官方对AndFix的描述:英文好的可以看官网说明文档(有翻译不妥欢迎指出)1.AndFix是一个Android库,它是在线解决bug

Android热补丁动态修复技术(完结篇):自动生成打包带签名的补丁,重构项目

一.关于前面四篇博文 Android热补丁动态修复技术(一):从Dex分包原理到热补丁 Android热补丁动态修复技术(二):实战!CLASS_ISPREVERIFIED问题! Android热补丁动态修复技术(三)-- 使用Javassist注入字节码,完成热补丁框架雏形(可使用) Android热补丁动态修复技术(四):自动化生成补丁--解决混淆问题 前两篇博文主要是介绍热补丁修复技术的一些原理和实现方案. 而后面两篇博文主要是介绍如何使用代码实现整个热补丁框架,但是框架写的真的很糟糕,很

Android 热补丁实践之路

大约在15年下半年开始,热补丁方案开始大量涌现,一时间热补丁修复技术在 Android 圈非常火爆,比较有代表性的开源实现有 Dexposed.AndFix.Nuwa 以及前段时间微信开源的 Tinker,至于他们的原理以及优缺点比较并不是本文要讲的,网上已经有一大堆资料进行介绍了,感兴趣的可以看下这几篇文章: 安卓App热补丁动态修复技术介绍 Android热补丁之AndFix原理解析 Instant Run工作原理及用法中文翻译稿 从Instant run谈Android替换Applicat

Android热补丁动态更新实践

前言 好几个月之前关于Android App热补丁修复火了一把,源于QQ空间团队的一篇文章安卓App热补丁动态修复技术介绍,然后各大厂的开源项目都出来了,本文的实践基于HotFix,也就是QQ空间技术团队那篇文章所应用的技术,笔者会把整个过程的细节和思路在文章中详说,研究这个的出发点也是为了能紧急修复app的bug,而不需要重复发包,不需要用户重新下载app就能把问题解决,个人觉得这个还是蛮有价值的,虽然老板不知道-.. 项目结构 这里笔者创建一个新的项目"HotFixDemo",带大

[硬货分享] Linux 4.1 内核热补丁成功实践

好久不见的干货重现江湖!今日的内容是基于UCloud运维同学反馈的个别宿主机上存在进程CPU峰值使用率异常现象问题进行的相关阐述.本文详细介绍了该问题的完整分析思路和用热补丁的方式成功解决此问题的实践分享,如果觉得还不错,欢迎点赞分享!正文开始~ 最开始公司运维同学反馈,个别宿主机上存在进程CPU峰值使用率异常的现象.而数万台机器中只出现了几例,也就是说万分之几的概率.监控产生的些小误差,不会造成宕机等严重后果,很容易就此被忽略了.但我们考虑到这个异常转瞬即逝.并不易被察觉,可能还存在更多这样的

Android 热补丁技术——资源的热修复

前言 今年真是热补丁框架的洪荒之力爆发的一年,短短几个月内,已经出现了好几个热修复的框架了,基本上都是大同小异,这里我就不过多的去评论这些框架.只有自己真正的去经历过,你才会发现其中的 大写的坑 事实上,现在出现的大多数热修复的框架,稳定性和兼容性都还达不到要求,包括阿里的Andfix,据同事说,我们自己的app原本没有多少crash,接入了andfix倒引起了一部分的crash,这不是一个热修复框架所应该具有的"变态功能".虽然阿里百川现在在大力推广这套框架,我依旧不看好,只是其思路

阿里资深工程师分享支付宝热补丁技术—— AndFix原理

本文由嵌入式企鹅圈原创团队成员.阿里资深工程师Hao分享. 上次我们介绍了用dexposed方案实施热补丁的原理,它本质上就是hook要修改的函数,这样一来在正式版本发布时就不能直接拿热补丁的代码集成进去了,因为热补丁是按hook的思路,并且按照实现XC_MethodReplacement类的方式写的,正式的补丁还需要重新包装一边.更重要的是dexposed对art的支持并不好,大大限制了它的使用范围. 今天我们介绍的是AndFix方案:https://github.com/alibaba/An

Andfix热修复框架原理及源码解析-上篇

热补丁介绍及Andfix的使用 Andfix热修复框架原理及源码解析-上篇 Andfix热修复框架原理及源码解析-下篇 1.不知道如何使用的同学,建议看看我上一篇写的介绍热补丁和Andfix的使用,这样你才有一个大概的框架.通过使用Andfix,其实我们心中会有一个大概的轮廓,它的工作原理,大概就是,所谓的补丁文件,就是通过打包工具apkpatch比对新的apk和旧的apk之间的差异.然后让我们的旧包运行的时候,就加载它,把以前的一些信息替换掉.我们现在就抱着这个大方向去深入源码探个究竟!!首先

Andfix热修复框架原理及源码解析-下篇

热补丁介绍及Andfix的使用 Andfix热修复框架原理及源码解析-上篇 Andfix热修复框架原理及源码解析-下篇 如果没有看过上篇的建议从上篇看起.先大概回忆下,上一篇分析了mPatchManager.init("1.0"),addPatch()方法.还有通过分析打补丁工具,了解补丁文件是怎么生成的.下面就来讲讲我们如何去读它.思绪回到Application的loadPatch()方法. 这个方法就是遍历mPatchs,就是上篇介绍的存储patch的一个集合.根据补丁名找到对应的