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

来源:互联网 发布:龙华行知实验学校 编辑:程序博客网 时间:2024/05/29 19:36

这篇文章是手把手教你如何实现热更新的,对于热更新的原理这里不涉及,若有疑问的请参考下面几篇文章:
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

原创粉丝点击