美文网首页
一步步教你实现Android HotFix热更新

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

作者: cff70524f5cf | 来源:发表于2019-01-28 19:27 被阅读57次

    这篇文章是手把手教你如何实现热更新的

    我先简要介绍一下实现热更新的一些要点: 

    (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

    以上是一步步教你实现Android HotFix热更新的内容,更多 步步 Android 实现 更新 hotfix 的内容,请您使用右上方搜索功能获取相关信息。

    这里是一些关于当前Android前沿技术的思维导图,提供给大家方便学习。

    需要这些资料的大伙关注+点赞+加群:185873940 免费获取!

    群内还有许多免费的关于高阶安卓学习资料,包括高级UI、性能优化、架构师课程、 NDK、混合式开发:ReactNative+Weex等多个Android技术知识的架构视频资料和各种电子书籍阅读,需要的加群、加群、加群:185873940 免费获取!

    相关文章

      网友评论

          本文标题:一步步教你实现Android HotFix热更新

          本文链接:https://www.haomeiwen.com/subject/gvtzjqtx.html