返回顶部
首页 > 资讯 > 精选 >Android中怎么手写热修复dex
  • 859
分享到

Android中怎么手写热修复dex

2023-07-05 09:07:42 859人浏览 八月长安
摘要

这篇“Android中怎么手写热修复dex”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“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”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: Android中怎么手写热修复dex

本文链接: https://lsjlt.com/news/350761.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android中怎么手写热修复dex
    这篇“Android中怎么手写热修复dex”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android中怎么手写热修复dex...
    99+
    2023-07-05
  • Android 手写热修复dex实例详解
    目录现有的热修复框架很多,尤以AndFix 和Tinker比较多今天就来探讨,如何手写一个热修复的功能什么是双亲委托机制话不多说,提出了解决方法,下面着手去实现总结现有的热修复框架很...
    99+
    2023-03-06
    Android 手写热修复dex Android dex
  • Android热修复技术原理中的代码热修复技术是什么
    本篇内容主要讲解“Android热修复技术原理中的代码热修复技术是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android热修复技术原理中的代码热修复技术是什么”吧!一、底层热替换原理1...
    99+
    2023-06-20
  • Android怎么实现手写板功能
    今天小编给大家分享一下Android怎么实现手写板功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。具体代码如下:packa...
    99+
    2023-07-02
  • windows 0xc000021a怎么手动修复
    这篇“windows 0xc000021a怎么手动修复”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“windows...
    99+
    2023-07-01
  • 怎么修改Android手机的Hosts文件
    这篇文章主要讲解了“怎么修改Android手机的Hosts文件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么修改Android手机的Hosts文件”吧!修改Android手机的Hosts...
    99+
    2023-07-01
  • Android Studio中layout怎么写代码
    在Android Studio中,可以使用XML语言编写layout代码。以下是一个基本的layout代码示例:``````在上面的...
    99+
    2023-09-21
    Android
  • win7写入注册表出错怎么修复
    这篇文章主要介绍“win7写入注册表出错怎么修复”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“win7写入注册表出错怎么修复”文章能帮助大家解决问题。修复方法:按win+r打开运行窗口,输入rege...
    99+
    2023-06-28
  • Sybase 中怎么实现复制与热切换数据
    这期内容当中小编将会给大家带来有关Sybase 中怎么实现复制与热切换数据,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 复制服务器的工作方...
    99+
    2024-04-02
  • react.js中怎么从零开始手写redux
    这篇文章主要讲解了“react.js中怎么从零开始手写redux”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“react.js中怎么从零开始手写redux”...
    99+
    2024-04-02
  • sql中的修改语句怎么写
    sql 中的修改语句包括 update、delete 和 insert into,用于更新、删除和插入数据库中的数据。update 语句更新表中现有记录,delete 语句删除...
    99+
    2024-05-07
  • Android中怎么检测屏幕手势
    Android中怎么检测屏幕手势,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。layout/activity_gesture_detector.xml界面布局代码如下:&l...
    99+
    2023-05-30
    android
  • Android中同步更新代码怎么写
    在Android中同步更新代码可以通过以下步骤实现:1. 打开Android Studio,并打开你的项目。2. 确保你的项目已连接...
    99+
    2023-09-13
    Android
  • win10怎么手动修复系统引导文件
    这篇文章主要介绍了win10怎么手动修复系统引导文件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇win10怎么手动修复系统引导文件文章都会有所收获,下面我们一起来看看吧。重复强制关机进入Win10系统的故障修...
    99+
    2023-06-27
  • 怎么在html5中使用canvas手写签名
    怎么在html5中使用canvas手写签名?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。window.onload = function()...
    99+
    2023-06-09
  • sql中的修改语句怎么写的
    sql 修改语句用于更改数据库数据,包括更新、插入和删除。类型有:1)update:更新现有记录;2)insert:插入新记录;3)delete:删除记录。 SQL 修改语句...
    99+
    2024-05-12
  • sql中查询重复数据怎么写
    在 sql 中,查询重复数据的两种方法是:使用 group by 子句将数据分组并计算每组的重复次数。使用 except 子句从包含所有数据的子查询中排除包含重复数据的子查询。 SQL...
    99+
    2024-04-28
    聚合函数
  • Linux中怎么修复inittab文件
    Linux中怎么修复inittab文件,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。第一种修复办法如下(有备份的情况下):事先将/etc/inittab备份为/...
    99+
    2023-06-13
  • Android中怎么实现手势翻页效果
    这篇文章将为大家详细讲解有关Android中怎么实现手势翻页效果,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。activity_main.xml布局界面代码:<xml ver...
    99+
    2023-05-30
    android
  • Android应用中怎么截取手机屏幕
    今天就跟大家聊聊有关Android应用中怎么截取手机屏幕,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。方法1:首先想到的思路是利用SDK提供的View.getDrawingCache...
    99+
    2023-05-31
    android roi
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作