我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android中怎么手写热修复dex

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android中怎么手写热修复dex

这篇“Android中怎么手写热修复dex”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android中怎么手写热修复dex”文章吧。

什么是双亲委托机制

  • 当前ClassLoader首先从自己已经加载的类中查询是否此类已经加载,如果已经加载则直接返回原来已经加载的类。 每个类加载器都有自己的加载缓存,当一个类被加载了以后就会放入缓存,等下次加载的时候就可以直接返回了。

  •  当前classLoader的缓存中没有找到被加载的类的时候,委托父类加载器去加载,父类加载器采用同样的策略,首先查看自己的缓存,然后委托父类的父类去加载,一直到bootstrp ClassLoader.

  • 当所有的父类加载器都没有加载的时候,再由当前的类加载器加载,并将其放入它自己的缓存中,以便下次有加载请求的时候直接返回。

突破口来了,看1(如果已经加载则直接返回原来已经加载的类) 对于同一个类,如果先加载修复的类,当后续在加载未修复的类的时候,直接返回修复的类,这样bug不就解决了吗?

Nice ,多看源码和jvm 许多问题可以从framework和底层去解决

话不多说,提出了解决方法,下面着手去实现

public class InitActivity extends FragmentActivity {    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //这里默认在SD卡根目录,实际开发过程中可以把dex文件放在服务器,在启动页下载后加载进来        //第二次进入的时候可以根据目录下是否已经下载过,处理,避免重新下载        //最后根据当前app版本下载不同的修复dex包 等等一系列处理        String dexFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/fix.dex";        DexFile dexFile = null;        try {            dexFile = DexFile.loadDex(dexFilePath, null, Context.MODE_PRIVATE);        } catch (IOException e) {            e.printStackTrace();        }        patchDex(dexFile);        startActivity(new Intent(this, MainActivity.class));    }        public void patchDex(DexFile dexFile) {        if (dexFile == null) return;        Enumeration<String> enumeration = dexFile.entries();        String className;        //遍历dexFile中的类        while (enumeration.hasMoreElements()) {            className = enumeration.nextElement();            //加载修复后的类,只能修复当前Activity后加载类(可以放入Application中执行)            dexFile.loadClass(className, getClassLoader());        }    }}

方法很简单在启动页,或者Application中提前加载有bug的类

这里写的很简单,只是展示核心代码,实际开发过程中,dex包下载的网络请求,据当前app版本下载不同的修复dex,文件存在的时候可以在Application中先加载一次,启动页就不用加载,等等,一系列优化和判断处理,这里就不过多说明,具体一些处理看github上的代码

###ok 代码都了解了,这个 fix.dex 文件哪里来的呢 熟悉Android apk生成的小伙伴都知道了,跳过这个步骤,不懂的小伙伴继续往下看

上面的InitActivitystartActivity(new Intent(this, MainActivity.class)); 启动了一个MainActivity 看看我的MainActivity

public class MainActivity extends FragmentActivity {    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //0不能做被除数,这里会报ArithmeticException异常        Toast.makeText(this, "结果" + 10 / 0, Toast.LENGTH_LONG).show();    }}

哎呀不小心,写了一个bug 0 咋能做除数呢,app已经上线了,这里必崩啊,咋办 不要急,按照以下步骤:

  • 我们要修复这个类MainActivity,先把bug解决

 Toast.makeText(this, "结果" + 10 / 2, Toast.LENGTH_LONG).show();

把修复类生成.class文件(可以先run一次,之后在 build/intermediates/javac/debug/classes/com开的的文件夹,找到生成的class文件,也可以通过javac 命令行生成,也可以通过右边的gradle Task生成)

Android中怎么手写热修复dex

  • 把修复类.class文件 打包成dex (其他.class删除,只保留修复类) 打开cmd命令行,输入下面命令

D:\Android\sdk\build-tools\28.0.3\dx.bat --dex --output C:\Users\pei\Desktop\dx\fix.dex C:\Users\pei\Desktop\dx\

D:\Android\sdk 为自己sdk目录 28.0.3build-tools版本,可以根据自己已经下载的版本更换 后面两个目录分别是生成.dex文件目录,和.class文件目录

切记 .class文件的目录必须是包名一样的,我的目录是 C:\Users\pei\Desktop\dx\com\pei\test\MainActivity.class,不然会报 class name does not match path

  • 这样dx文件夹下就会生成fix.dex文件了,把fix.dex放进手机根目录试试吧

再次打开App,完美Toast 结果5,完美解决

以上就是关于“Android中怎么手写热修复dex”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android中怎么手写热修复dex

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android中怎么手写热修复dex

这篇“Android中怎么手写热修复dex”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android中怎么手写热修复dex
2023-07-05

Android 手写热修复dex实例详解

这篇文章主要为大家介绍了Android 手写热修复dex实现示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-06

Android热修复技术原理中的代码热修复技术是什么

本篇内容主要讲解“Android热修复技术原理中的代码热修复技术是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android热修复技术原理中的代码热修复技术是什么”吧!一、底层热替换原理1
2023-06-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录