Hotfix API 参考:HotFix.patch() 方法完整用法与参数说明
【免费下载链接】HotfixThe Hotfix tool can dynamically fix online bugs for Android without republishing an app.项目地址: https://gitcode.com/gh_mirrors/hot/Hotfix
Hotfix 是一款免费开源的 Android 热修复工具,可以让你不重新发版 App 就动态修复线上 Bug。本文是一份完整的 Hotfix API 参考,带你快速看懂HotFix.patch()方法的用法、三个参数的含义,以及它在不同 Android 版本上的注入原理。
为什么需要热修复?
线上 Bug 修复通常要走完整的发版流程,周期长、成本高。Hotfix 的思路是:把修复好的代码编译成一个小 dex 文件,App 启动时通过反射把它"注入"到运行中的类加载器里,从而覆盖出问题的类。
整个功能的核心入口只有一个方法:HotFix.patch(),源码位于app/src/main/java/com/lyr/hotfix/Hotfix.kt。
HotFix.patch() 方法签名
方法定义在 Kotlin 单例对象HotFix中(Hotfix.kt):
fun patch(context: Context, patchDexFile: String?, patchClassName: String)三个参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
context | Context | 是 | 传入 ApplicationContext,用于获取类加载器和 dex 输出目录 |
patchDexFile | String? | 是(可为 null) | 补丁 dex 文件的绝对路径。传 null 或文件不存在时,方法静默跳过,不会崩溃 |
patchClassName | String | 是 | 要注入的补丁类的全限定类名(如com.example.MyClass),方法会主动加载该类 |
几个新手容易踩的坑 🚨:
patchDexFile传空字符串不会报错,但补丁也不会生效——内部会先检查File(patchDexFile).exists(),文件不存在就直接返回(见 Hotfix.kt)。patchClassName必须写全限定名,只写类名会导致ClassNotFoundException。- 该方法不抛异常:内部用
try/catch包住全部逻辑,失败时只打印堆栈。所以调用后建议自行验证补丁类是否真正加载成功。
标准调用姿势:App 启动时注入
官方示例在Application子类中、用协程异步加载,源码见 HotfixApp.kt:
override fun onCreate() { super.onCreate() GlobalScope.launch { HotFix.patch(applicationContext, "补丁dex绝对路径", "com.example.PatchClass") } } `Application` 类已在 [AndroidManifest.xml](https://link.gitcode.com/i/dacfc41aedbba3353ec339d141fd8d83) 中注册,补丁会随 App 启动自动生效。 ## 内部原理速览:不同 API 版本两条注入路径 `patch()` 会先探测系统是否存在 `dalvik.system.BaseDexClassLoader` 类,据此走两条不同分支: | Android 版本 | 分支方法 | 注入方式 | | --- | --- | --- | | API 14 及以上 | `injectAboveEqualApiLevel14` | 反射读取 `PathClassLoader` 的 `pathList`,把补丁 dex 的 `dexElements` 拼接到最前面([Hotfix.kt](https://link.gitcode.com/i/889b1c044fcfd4a0432ced3874c8b1d7)) | | API 14 以下 | `injectBelowApiLevel14` | 反射改写 `PathClassLoader` 的 `mPaths`、`mFiles`、`mZips`、`mDexs` 四个字段([Hotfix.kt](https://link.gitcode.com/i/bb372fd4dc62e5a176916f0f6d5f2cd1)) | 关键点:补丁的 `dexElements` 被**拼接在原数组前面**,意味着补丁类优先于主 dex 中的同名类被加载——这正是"覆盖修复"生效的原因。dex 文件会被解压到应用的 `getDir("dex", 0)` 目录,无需额外申请存储权限。 ## 快速上手清单 ✅ 1. 把修复后的类编译成独立 dex 文件,下载到设备可读的绝对路径; 2. 在 `Application.onCreate()` 中调用 `HotFix.patch(applicationContext, dexPath, 补丁类全限定名)`; 3. 确认 `patchClassName` 与 dex 中的类名完全一致; 4. 启动 App,通过日志中 `loadClass` 是否成功来验证补丁生效。 ## 相关文件速查 - 核心 API 实现:`app/src/main/java/com/lyr/hotfix/Hotfix.kt` - 启动加载示例:`app/src/main/java/com/lyr/hotfix/HotfixApp.kt` - 组件声明:`app/src/main/AndroidManifest.xml` - 单元测试入口:`app/src/test/java/com/lyr/hotfix/ExampleUnitTest.kt` 掌握 `HotFix.patch()` 这三个参数后,你就可以把它接入自己的项目,实现不发版修复线上 Bug 的能力了。【免费下载链接】HotfixThe Hotfix tool can dynamically fix online bugs for Android without republishing an app.项目地址: https://gitcode.com/gh_mirrors/hot/Hotfix
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考