天天看点

andfix 热补丁修复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文件导入进去如图:

andfix 热补丁修复andfix 热补丁修复

三:代码实现

  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