码迷,mamicode.com
首页 > 其他好文 > 详细

andfix 热补丁修复

时间:2016-05-07 08:28:34      阅读:377      评论:0      收藏:0      [点我收藏+]

标签:

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

andfix 热补丁修复

标签:

原文地址:http://blog.csdn.net/shubing521/article/details/51331971

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!