如何为DebugKit扩展自己的预置函数?仿照DumpSharedPreferences源码实现实战
【免费下载链接】debugkitEver hid debug functions in your UI? Here is now a clean way to do it!项目地址: https://gitcode.com/gh_mirrors/de/debugkit
DebugKit 是一款轻量级 Android 调试工具库:在应用内悬浮一个可拖动的调试面板,上面有 F1、F2 等功能按钮和实时日志控制台,点击按钮即可在运行时触发动作并直接看到文字反馈。本文将带你拆解内置函数DumpSharedPreferences的源码,从零实战一个属于自己的预置调试函数,全程只需几十行代码。🛠️
先看懂 DebugKit 的函数机制
DebugKit 的核心只有三个源码文件,分工非常清晰:
| 文件 | 职责 |
|---|---|
| debugkit/src/main/java/com/hulab/debugkit/DebugFunction.java | 调试函数抽象类,所有预置函数都继承它 |
| debugkit/src/main/java/com/hulab/debugkit/DevTool.java | Builder,负责注册函数、设置主题并弹出面板 |
| debugkit/src/main/java/com/hulab/debugkit/DevToolFragment.java | 面板 UI:按钮渲染、控制台日志、拖拽与折叠 |
工作机制可以用一句话概括:每注册一个DebugFunction,面板就生成一个按钮;点击按钮时框架自动调用call(),把返回的字符串打印到控制台。框架还给你准备了 4 个趁手的工具方法:
| 方法 | 作用 |
|---|---|
call() | 必写!按钮点击时执行,返回值自动写入控制台 |
log(String) | 过程中分步打印日志(带时间戳) |
clear() | 清空控制台 |
getContext() | 获取宿主 Activity 的 Context |
💡 所以"扩展一个预置函数"本质上只有三件事:继承
DebugFunction→ 构造器里传按钮标题 → 实现call()返回结果字符串。
第一步:拆解 DumpSharedPreferences 源码
内置的"导出 SharedPreferences"函数是官方给出的标准范例,位于 DebugFunction.java,结构非常典型:
public static class DumpSharedPreferences extends DebugFunction { private String FILE_NAME; private int mode = Context.MODE_PRIVATE; public DumpSharedPreferences(String title, String fileName) { super(title); // ① 把按钮标题传给父类 this.FILE_NAME = fileName; // ② 私有字段保存参数 } @Override public String call() { // ③ 实现唯一必写的入口 return dumpSharedPreferences(this.getContext()); } private String dumpSharedPreferences(Context context) { // ④ 具体逻辑抽成私有方法:遍历所有键值对拼成字符串 } }拆解出四个要点,照抄即可复刻这个模式:
- 继承 + 静态内部类:写成
DebugFunction的静态子类,调用方可以像new DebugFunction.DumpSharedPreferences("标题", "文件名")一样一行注册; - 构造器传 title:父类构造器接收标题,按钮就显示自定义文字而不是默认的 F1/F2(面板渲染逻辑见 DevToolFragment.java);
- 参数用私有字段持有:不同业务实例可以传不同参数,互不干扰;
call()只负责返回值:真正的逻辑放进私有方法,返回值就是最终显示在控制台的文本;返回null则不打印。
第二步:仿写实战——扩展 DumpAppVersion 函数
仿照上面的结构,我们写一个"一键打印应用版本号"的预置函数,放进DebugFunction里即可:
public static class DumpAppVersion extends DebugFunction { public DumpAppVersion() { super("Version"); // 固定标题,也可以像范例一样做成带参构造 } @Override public String call() throws Exception { PackageManager pm = getContext().getPackageManager(); PackageInfo info = pm.getPackageInfo(getContext().getPackageName(), 0); return "当前版本:" + info.versionName; } }对照一下范例,四个要点全部命中:继承DebugFunction、构造器调super(title)、实现call()、通过getContext()拿到系统服务。就这么简单。✨
第三步:注册到 DevTool.Builder 验证效果
函数写好后,在任意 Activity 里通过 Builder 链式注册(完整示例见 ExampleActivity.java):
DevTool.Builder builder = new DevTool.Builder(this); builder.addFunction(new DebugFunction.DumpAppVersion()) .addFunction(new DebugFunction.Clear("Clear")) .addFunction(new DebugFunction.DumpSharedPreferences("Shared prefs", "preferences")) .setTheme(DevToolFragment.DevToolTheme.DARK) .displayAt(50, 200) .build();build()内部会把DevToolFragment作为 Fragment 添加到当前 Activity(实现见 DevTool.java)。运行后你会看到面板上出现Version按钮,点击一下,控制台立刻显示类似12:05:33 > Version: 当前版本:1.0.0的日志。
新手必看的 4 个避坑清单
| 现象 | 原因 | 解决方式 |
|---|---|---|
| 按钮显示 F1/F2 而不是自定义文字 | 构造器没传 title | super("标题")别忘 |
| 点了按钮控制台没输出 | call()返回了null | 返回有意义的结果字符串 |
控制台提示Error: see logcat | call()抛了异常 | 框架会捕获异常并打印到 logcat(见 DevToolFragment.java),按提示查日志 |
getContext()拿到null | 函数没经过addFunction()注册 | 必须走 Builder 注册,框架会在注册时注入 Fragment(见 DevTool.java) |
小结:三步扩展 DebugKit 预置函数
- 仿写类:继承
DebugFunction,构造器super(title),实现call()返回结果字符串; - 抽逻辑:具体代码放进私有方法,像
DumpSharedPreferences一样保持call()干净; - 注册:
DevTool.Builder.addFunction(...).build(),按钮即刻生效。
想动手试试的话,先克隆仓库到本地跑一遍示例工程:
git clone https://gitcode.com/gh_mirrors/de/debugkit再打开 app 模块的 ExampleActivity.java,照着本文的三步走一遍,你就能把自己的调试面板玩出各种花样了。🚀
【免费下载链接】debugkitEver hid debug functions in your UI? Here is now a clean way to do it!项目地址: https://gitcode.com/gh_mirrors/de/debugkit
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考