Android---class文件的热修复

该博客围绕Android热修复展开,采用QQ控件修复思路,介绍了热修复原理,即替换attachBaseContext相关内容。给出了ActivityThread等类中的源码,展示了获取类加载器、合并数组等代码实现,还提供了demo及使用方式,提及热修复使用场景和难点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

采用的是QQ控件的修复思路

参考了很多其他的博客,找不到地址了,抱歉

原理

替换attachBaseContext带来的context--->mClassLoader--->pathList---> dexElements

源码

ActivityThread中的performLaunchActivity ContextImpl中的getClassLoader BaseDexClassLoader中的findClass DexPathList中的findClass Android在线源码

代码

//获取应用内部的类加载器 PathClassLoader pathClassLoader = (PathClassLoader) appContext.getClassLoader(); //实例化dexClassLoader用于加载补丁dex DexClassLoader dexClassLoader = new DexClassLoader(patchPath, fileDir.getAbsolutePath(), null, pathClassLoader); try { //获取dexclassloader和pathclassloader的dexpathlist Object dexPathList = getPathList(dexClassLoader); Object pathPathList = getPathList(pathClassLoader); //获取补丁的elements数组 Object dexElements = getDexElements(dexPathList); //获取程序的elements Object pathElements = getDexElements(pathPathList); //合并两个数组 Object resultElements = combineArray(dexElements, pathElements); //将合并后的数组设置给PathClassLoader setField(pathPathList, pathPathList.getClass(), "dexElements", resultElements); } catch (ClassNotFoundException e) { e.printStackTrace(); } demo github.com/pgyCode/Hot…

demo使用方式

1.在main目录下已经生成了一个patch.dex 可以直接复制到 /storage/emulated/0/Download下直接使用

2.简单的一些命令行操作(你需要修改为你对应的路径)

javac -d /Users/haha/AndroidStudioProjects/HotFixClassDemo/app/src/main/patch /Users/haha/AndroidStudioProjects/HotFixClassDemo/app/src/main/java/com/github/pgycode/hotfixclassdemo/FixTest.java /Users/haha/Library/Android/sdk/build-tools/28.0.3/dx --dex --output=/Users/haha/AndroidStudioProjects/HotFixClassDemo/app/src/main/patch/patch.dex /Users/haha/AndroidStudioProjects/HotFixClassDemo/app/src/main/patch adb push /Users/haha/AndroidStudioProjects/HotFixClassDemo/app/src/main/patch/patch.dex /storage/emulated/0/Download 热修复使用场景 1.热修复

2.加速编译

难点 1.对于热修复---怎么更稳定

2.对于加速编译---怎么更快的打出dex

终于有人把 【移动开发】 从基础到实战的全套视频弄全了

转载于:https://juejin.im/post/5c8fa75d5188252da5594e39

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值