一步步教你实现Android HotFix热更新

这篇文章是手把手教你如何实现热更新的,对于热更新的原理这里不涉及,若有疑问的请参考下面几篇文章:
1、安卓App热补丁动态修复技术介绍
https://mp.weixin.qq.com/s?__biz=MzI1MTA1MzM2Nw==&mid=400118620&idx=1&sn=b4fdd5055731290eef12ad0d17f39d4a&scene=1&srcid=1106Imu9ZgwybID13e7y2nEi#wechat_redirect
2、MultiDex与热修复实现原理
http://blg.csdn.net/hp910315/article/details/51681710
3、Android 热修复其实很简单
http://blog.csd.net/qq_31530015/article/details/51785228?locationNum=11
4、Android热修复:Andfix和Hotfix,两种方案的比较与实现
http://blog.csdn.net/yuankundong/article/details/51360798
5、Android热修复框架HotFix分析拓展
http://m.blog.csdn.net/article/details?id=51201593#
我先简要介绍一下实现热更新的一些要点:
(1)如何防止类被打上CLASS_ISPREVERIFIED的标志
(2)如何制作补丁包
(3)如何动态加载需要修复的类
下面是我实现热修复的步骤:
1、新建一个工程 HotFixDemo(包路径:com.jxnu.hotfixdemo)
2、新建module HackDex,并创建一个java文件AntiLazyLoad(包路径:com.jxnu.hackdex)
3、新建mudule HotFixLib,并将HotFix.java拷贝到HotFixLib中,并将HotFixLib添加为HotFixDemo的依赖、将Utils拷贝到项目中
4、我们在HackDex的intermediates文件夹下找到AntiLazyLoad的class文件
5、将AntiLazyLoad.class放在E盘的com—>jxnu —>hackdex目录下【目录名与AntiLazyLoad.java所在的包名一致】
6、接着执行控制台命令命令jar cvf hack.jar com,然后我们就在e盘下得到了一个hack.jar文件
这里写图片描述
7、接着就是把这个jar做成dex的jar了,由于要用到dx,而这个dx在我们的sdk工具包里,所以我把这个path.jar拷贝到sdk工具包,利用dx命令 dx –dex –output=hack_dex.jar hack.jar生成hack_dex.jar补丁包
这里写图片描述
8、将hack_dex.jar文件放入项目的assets目录下
9、新建HotFixApplication

@Override
    public void onCreate() {
        super.onCreate();
        File dexPath = new File(getDir("dex", Context.MODE_PRIVATE), "hack_dex.jar");
        Log.e("mainHHH","dexPath = " + dexPath.getAbsolutePath());
        Utils.prepareDex(this.getApplicationContext(), dexPath, "hack_dex.jar");
        HotFix.patch(this, dexPath.getAbsolutePath(), "com.jxnu.hackdex.AntiLazyLoad");
        try {
            this.getClassLoader().loadClass("com.jxnu.hackdex.AntiLazyLoad");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

10、新建BugClass文件

public class BugClass {

    public String getInfo(){
        return "I have been fixed";
    }
}

11、接着运行项目,得到BugClass的class文件,按照上面生成hack_dex的方法将BugClass做成path_dex.jar文件,并放入到assets文件夹下
12、将BugClass改为

public class BugClass {

    public String getInfo(){
        return "I am a bug class";
    }
}

13、接着我们来进行测试,下面是MainActivity类

private TextView tv_info;
    private Button btn_test,btn_patch;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_info = (TextView) findViewById(R.id.tv_info);
        btn_test = (Button) findViewById(R.id.btn_test);
        btn_patch = (Button) findViewById(R.id.btn_patch);
        btn_test.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                tv_info.setText(new BugClass().getInfo());
            }
        });
        btn_patch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                File dexPath = new File(getDir("dex", Context.MODE_PRIVATE), "path_dex.jar");
                Utils.prepareDex(MainActivity.this, dexPath, "path_dex.jar");
                HotFix.patch(MainActivity.this, dexPath.getAbsolutePath(), "");
            }
        });
    }

14、没有热更新之前,点击“测试”按钮显示I am a bug class
这里写图片描述
15、接着测试打补丁,重启应用,先点击“打补丁”按钮,然后再点击“测试”按钮,然后就显示I have been fixed 了,说明补丁打成功了
这里写图片描述
项目源码地址:https://github.com/DaiQing-Zha/HotFixDemo.git

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章