
开发工具移动开发【免费下载链接】stethoStetho is a debug bridge for Android applications, enabling the powerful Chrome Developer Tools and much more.项目地址https://gitcode.com/gh_mirrors/st/stetho点击查看免费下载Stetho 是面向 Android 应用的调试桥debug bridge接入后开发者可以在 Chrome 桌面浏览器的开发者工具中原生查看应用的视图层级、网络请求、SQLite 数据库、SharedPreferences 等运行时内部状态并通过可选的dumpapp命令行工具以脚本化方式操作应用内部数据。本文以仓库根目录的 README.md 为主线结合 Stetho.java 等核心源码与 scripts/dumpapp 等配套脚本完整讲解从依赖接入、初始化配置到网络检查、自定义 dumpapp 插件与内存快照的实战全流程。Stetho 是什么Android 应用的调试桥Stetho 是一个面向 Android 应用的调试桥。启用后开发者可以直接使用 Chrome 桌面浏览器原生自带的 Chrome Developer Tools 功能对应用进行调试无需在应用内集成任何自定义 UI。同时开发者还可以选择启用可选的dumpapp工具——它提供了一个功能强大的命令行接口用于访问应用内部状态。完成下述设置步骤后只需启动应用然后在电脑浏览器中打开chrome://inspect点击 Inspect 按钮即可开始调试。Chrome 设备发现页面从架构上看Stetho 在应用进程内启动了一个基于 Android LocalSocket 的本地服务其 socket 地址以_devtools_remote结尾Chrome 识别该魔法后缀即会启动设备发现流程见 Stetho.java。adb 将设备端该 abstract socket 转发到宿主机后Chrome 与 dumpapp 客户端即可通过该通道与应用的调试服务通信。快速接入下载与依赖配置获取依赖可以从发布页下载最新 JAR也可以通过构建工具直接依赖。主模块坐标如下implementation com.facebook.stetho:stetho:1.6.0或使用 Mavendependency groupIdcom.facebook.stetho/groupId artifactIdstetho/artifactId version1.6.0/version /dependency只有主stetho依赖是严格必需的根据功能需要还可以选择引入以下网络辅助模块implementation com.facebook.stetho:stetho-okhttp3:1.6.0或implementation com.facebook.stetho:stetho-urlconnection:1.6.0如需在 Chrome 的 Console 面板中启用 JavaScript 控制台可以额外引入implementation com.facebook.stetho:stetho-js-rhino:1.6.0关于如何定制 JavaScript 运行时详见 stetho-js-rhino 说明文档。组合使用stethostetho-okhttp3OkHttp 3.x 网络检查最简路径见下文stethostetho-urlconnectionHttpURLConnection网络检查存在 gzip 相关的注意事项stethostetho-js-rhinoConsole 面板 JavaScript 交互全部模块可由 stetho-sample 示例项目 综合演示。初始化Application 类与 AndroidManifest 注册Stetho 的接入设计为对绝大多数现有 Android 应用“无缝且直接”。集成发生在Application类的onCreate()中最简单的初始化只需一行调用public class MyApplication extends Application { public void onCreate() { super.onCreate(); Stetho.initializeWithDefaults(this); } }同时必须确保MyApplication已在AndroidManifest.xml中注册为应用入口否则chrome://inspect/#devices中不会出现 Inspect 按钮manifest xmlns:androidhttp://schemas.android.com/apk/res/android ... application android:nameMyApplication ... /application /manifest需要注意initializeWithDefaults会启用大部分默认配置但不会启用一些额外钩子其中最重要的是网络检查network inspection需要按下一节的方式单独启用。从源码看Stetho.initializeWithDefaults(Context)内部构造了一个Initializer分别通过DefaultDumperPluginsBuilder与DefaultInspectorModulesBuilder装配默认的 dumpapp 插件与 DevTools 协议模块见 Stetho.java。Stetho.initialize(...)会先尝试通过ActivityTracker自动追踪 Activity在较低 API 级别上不可用时会在日志中提示需要手动调用ActivityTracker方法见 Stetho.java随后启动本地监听服务。服务的创建采用了懒加载机制LazySocketHandler大部分初始化工作延迟到第一个 socket 连接到达时才执行因此即使低端机型也能安全地用于 debug 构建而不明显影响性能见 Stetho.java 的类注释。启用网络检查方式一OkHttp 3.x推荐如果使用 OkHttp 3.x 系列可以通过 Interceptors 机制自动挂接现有请求栈。这是当前最简单直接的网络检查开启方式new OkHttpClient.Builder() .addNetworkInterceptor(new StethoInterceptor()) .build()需要注意两点OkHttp 2.x 也可以工作但语法略有不同且必须使用stetho-okhttp构件而非stetho-okhttp3。Interceptor 添加顺序由于拦截器可以修改请求与响应请将 Stetho 拦截器放在所有其他拦截器之后以获得对网络流量的准确视图。从 StethoInterceptor.java 的源码可以看到它的工作方式每次请求生成唯一requestId调用NetworkEventReporter.requestWillBeSent(...)上报请求请求完成后通过responseHeadersReceived(...)上报响应头再用interpretResponseStream(...)包装响应体并配合DefaultResponseHandler将响应体内容含解压后的实体上报给 DevTools 端见 StethoInterceptor.java。源码中还显式检查了chain.connection()是否为 null——如果为 null 会抛出IllegalStateException并提示 “did you use addInterceptor instead of addNetworkInterceptor?”这正是必须使用addNetworkInterceptor而非addInterceptor的原因见 StethoInterceptor.java。Chrome DevTools 网络面板中的 Stetho 网络检查方式二HttpURLConnection如果使用HttpURLConnection可以通过StethoURLConnectionManager辅助完成集成但这种方式存在一些注意事项必须显式在请求头中添加Accept-Encoding: gzip并手动处理压缩响应Stetho 才能正确上报压缩后的负载大小。StethoURLConnectionManager的核心实现StethoURLConnectionManagerImpl提供了preConnect(...)、postConnect()、httpExchangeFailed(...)、interpretResponseStream(...)四个关键钩子分别对应请求发送前、响应头接收、交换失败与响应体解析等阶段见 StethoURLConnectionManagerImpl.java。源码注释特别指出现代 Android 上的HttpURLConnection底层由 OkHttp 驱动在透明处理解压时会剥掉Content-Encoding头此时将无法正确上报压缩后的大小调用方可以禁用该透明行为让 Stetho 重新拿到原始Content-Encoding以正确处理。更完整的网络集成示例参见 stetho-sample 示例项目。使用 dumpapp 命令行工具dumpapp是 Stetho 提供的命令行接口通过 adb 转发通道与应用内运行的 dumpapp 服务通信。仓库内置了配套的 Python 客户端脚本 scripts/dumpapp可直接运行./scripts/dumpapp常用参数与环境变量参数 / 环境变量作用说明-p process/--process process指定目标进程对应应用包名脚本会将其格式化为stetho_process_devtools_remote的 abstract socket 名称并连接见 stetho_open.pySTETHO_PROCESS指定目标进程环境变量形式未传-p时的回退方案见 scripts/dumpappANDROID_SERIAL指定目标设备未设置时回退到 adb 的任意传输host:transport-anyANDROID_ADB_SERVER_PORT/ADB_SERVER_SOCKET指定 adb 服务端口默认端口5037仅支持tcp:形式的 socket 规范见 stetho_open.py与 dumpapp 服务的协议交互dumpapp客户端与设备端服务采用帧协议通信见 scripts/dumpapp首先发送DUMP魔数与协议版本大端序!l整数当前为1随后发送enter帧! 参数个数4 字节大端序 每个参数的长度与 UTF-8 内容之后循环读取结果帧帧码1stdout 数据块帧码2stderr 数据块帧码-stdin 数据请求客户端从标准输入读取指定字节数后回传帧码x退出码客户端以该码退出。这与设备端 Stetho.java 中ProtocolDetectingSocketHandler的按魔法字节分发机制对应DUMP魔数命中 dumpapp 处理器GET/POST /dumpapp命中旧版 HTTP 兼容处理器其余请求交给 DevTools socket 处理器。默认插件通过Stetho.initializeWithDefaults初始化时内置的DefaultDumperPluginsBuilder.finish()会自动装配四个默认插件见 Stetho.java插件类命令名含义用途HprofDumperPluginhprof生成 Dalvik 格式堆转储hprof命令SharedPreferencesDumperPlugin查看与编辑 SharedPreferences 数据对应dumpapp-prefs脚本交互CrashDumperPlugin触发/查看崩溃信息用于注入与复现崩溃场景FilesDumperPlugin文件系统访问查看应用文件目录在dumpapp中执行--list可以列出当前所有可用插件。dumpapp 查看 SharedPreferences 的运行效果DumperPlugin接口本身非常轻量见 DumperPlugin.java实现getName()返回命令名实现dump(DumperContext)完成具体输出。接口注释给出了命名建议——命令名属于 CLI 一部分应易于输入与记忆避免下划线、大写字母和复数倾向使用network、logging这类简短名称。编写自定义 dumpapp 插件自定义插件是扩展 dumpapp 系统的首选方式可以在配置阶段轻松加入。将初始化步骤替换为Stetho.initialize(Stetho.newInitializerBuilder(context) .enableDumpapp(new DumperPluginsProvider() { Override public IterableDumperPlugin get() { return new Stetho.DefaultDumperPluginsBuilder(context) .provide(new MyDumperPlugin()) .finish(); } }) .enableWebKitInspector(Stetho.defaultInspectorModulesProvider(context)) .build())其中enableDumpapp传入自定义的DumperPluginsProvider返回的插件集合会替换/扩展默认插件——DefaultDumperPluginsBuilder.provide(...)是在默认四个插件基础上追加而remove(name)可以移除指定插件见 Stetho.java。enableWebKitInspector则负责启用 Chrome DevTools 协议侧的模块集合。一个真实的插件示例stetho-sample 示例项目 中的 HelloWorldDumperPlugin.java 完整展示了插件的编写规范public class HelloWorldDumperPlugin implements DumperPlugin { private static final String NAME hello; Override public String getName() { return NAME; } Override public void dump(DumperContext dumpContext) throws DumpException { PrintStream writer dumpContext.getStdout(); IteratorString args dumpContext.getArgsAsList().iterator(); String helloToWhom ArgsHelper.nextOptionalArg(args, null); if (helloToWhom ! null) { doHello(dumpContext.getStdin(), writer, helloToWhom); } else { doUsage(writer); } } // ... }要点总结通过dumpContext.getStdout()向调用方输出结果通过dumpContext.getArgsAsList()获取命令行参数配合ArgsHelper解析可选参数参数缺失时输出用法说明name为-时从 stdin 读取名字演示了标准输入的交互遇到非法输入抛出DumpUsageException其消息会直接展示给用户且脚本以非零码退出插件名hello遵循“简短、小写、易输入”的命名约定。该示例工程还提供了APODDumperPlugin以及通过ContentProviderDatabaseDriver将系统日历 ContentProvider 暴露到 Chrome Database 面板的扩展用法见 SampleDebugApplication.java。深入Stetho 的默认初始化装配Stetho.initializeWithDefaults背后的默认装配可以从 Stetho.java 的源码确认。默认 DevTools 模块DefaultInspectorModulesBuilder.finish()会按顺序装配以下 Chrome DevTools 协议域模块见 Stetho.javaConsole、Debugger、Runtime默认使用RhinoDetectingRuntimeReplFactory自动探测是否引入了stetho-js-rhinoDOM、CSS基于Document模型默认文档提供者为 Android View 层级AndroidDocumentProviderFactory要求 API 级别达到 AndroidDocumentConstants.MIN_API_LEVELDOMStorage、Network、Page、HeapProfiler、Inspector、Profiler、WorkerDatabase在满足最低 API 级别时启用默认注入SqliteDatabaseDriver数据库文件定位默认使用DefaultDatabaseFilesProvider连接管理使用DefaultDatabaseConnectionProvider并通过provideDatabaseDriver(...)支持追加自定义驱动如示例中的ContentProviderDatabaseDriver通过excludeSqliteDatabaseDriver(true)可禁用默认 SQLite 驱动。Chrome DevTools 中查看应用 SQLite 数据库进程与 socket 命名初始化时创建的 LocalSocketServer 使用AddressNameHelper.createCustomAddress(_devtools_remote)构造地址最终形式为stetho_process_devtools_remote见 stetho_open.py 中对该格式的正则解析与拼接逻辑。这也解释了 dumpapp 脚本为什么需要-p 包名adb 通过localabstract:stetho_包名_devtools_remote精确转发到目标进程的调试服务见 stetho_open.py。内存快照hprof 转储脚本仓库还提供了 scripts/hprof_dump.sh 一键式堆转储脚本其完整流程为在设备上调用dumpapp hprof -生成 Dalvik 格式的 hprof 并通过 stdout 流式下载到本地临时文件使用hprof-conv将 Dalvik 格式转换为标准 hprof 格式默认输出到当前目录的out.hprof可通过第一个参数自定义输出文件名生成的 hprof 可以用 Eclipse MAT 等标准内存分析工具深入分析。./scripts/hprof_dump.sh [OUTFILE]JavaScript 控制台stetho-js-rhino引入stetho-js-rhino依赖后Stetho 会自动检测并在 Console 面板启用 JavaScript 运行时基于 Mozilla Rhino 的解释执行模式因为 Android 运行 Dalvik 字节码无法使用 Rhino 的 JVM 字节码即时生成优化。默认作用域包含console.log()、importClass、importPackage等内建能力也可以通过JsRuntimeReplFactoryBuilder绑定变量、类、包与函数详见 stetho-js-rhino/README.md。参与贡献与许可Stetho 遵循 MIT 许可证见 LICENSE。如果希望为项目贡献力量请参阅 CONTRIBUTING.md 中的贡献指南。小结本文以 README.md 为骨架完整梳理了 Stetho 的接入路径通过一行Stetho.initializeWithDefaults(this)即可获得 Chrome DevTools 对视图、数据库、网络等维度的原生调试能力通过Stetho.newInitializerBuilder(...)可以按需装配 dumpapp 自定义插件与 DevTools 模块通过 scripts/dumpapp 与 scripts/hprof_dump.sh 可以在命令行完成状态查看、数据注入与堆转储等操作。无论是快速接入还是深度定制stetho-sample 示例项目 都是最直接的参考实现。赞分享开发工具移动开发【免费下载链接】stethoStetho is a debug bridge for Android applications, enabling the powerful Chrome Developer Tools and much more.项目地址https://gitcode.com/gh_mirrors/st/stetho点击查看免费下载相关推荐MNN MnnLlmChat dumpapp 命令指南基于 Stetho 的 Android LLM 应用调试工具箱MNN MnnLlmChat dumpapp 命令指南基于 Stetho 的 Android LLM 应用调试工具箱 dumpapp 是 MnnLlmChat人工智能大模型推理引擎深度学习本地部署模型量化模型优化多模态计算机视觉嵌入式stetho-js-rhino为 Stetho 注入 Rhino JavaScript 控制台在 Chrome DevTools 里实时调试 Android 应用stetho js rhino为 Stetho 注入 Rhino JavaScript 控制台在 Chrome DevTools 里实时调试 Android开发工具移动开发Boostnote 调试实战指南使用 Chrome DevTools 与 VS Code 调试 Electron 应用Boostnote 调试实战指南使用 Chrome DevTools 与 VS Code 调试 Electron 应用 导读 Boostnote 是一款基于知识管理桌面应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考