Stetho — 由 Facebook(Meta)于 2014 年开发的 Android 应用调试库。该工具通过 Gradle 依赖集成到应用中,并通过 Chrome DevTools 开放对内部状态的访问。根据 facebook/stetho 仓库(2026),该库支持检查 SQLite、Network、SharedPreferences、View Hierarchy 和 Dumpapp 插件。
要点
Stetho — 一个 Java 库,它在 Android 应用内部启动本地 WebSocket 服务器。Chrome DevTools 通过 adb 端口连接到该服务器,从而访问应用的内部组件:数据库、网络请求、preferences 和 view 层级。所有通信都通过 Chrome DevTools Protocol 协议进行,因此可以使用浏览器的标准工具而无需安装额外软件。
该库由以下模块组成:stetho(核心)、stetho-okhttp(通过 OkHttp 拦截流量)、stetho-urlconnection(通过 HttpURLConnection 拦截)和 stetho-js-rhino(支持 JavaScript 插件)。核心打开一个 UNIX socket,Chrome 通过 adb forward 连接它。每个检查器都是独立的插件,在 Stetho 初始化时注册。
Stetho 支持 Android 4.4+(API 19),仅适用于 debug 构建。在 Android 11+ 设备上,需要在清单文件中声明显式的 INTERNET 权限。自 2020 年起 Facebook 不再官方支持该库,但代码仍然开放,并用于 legacy 项目。对于新项目,Google 推荐使用 Android Studio Profiler 和 Network Inspector。
连接通过带有 debugImplementation 标志的 Gradle 依赖完成,使 Stetho 仅工作在 debug 构建中。初始化在 Application.onCreate() 方法中通过一次调用 Stetho.initializeWithDefaults(this) 完成。Network Inspector 需要通过 Interceptor 与 OkHttp 集成。
// build.gradle(应用)— 连接 Stetho
dependencies {
debugImplementation 'com.facebook.stetho:stetho:1.6.0'
debugImplementation 'com.facebook.stetho:stetho-okhttp3:1.6.0'
}
// 在 Application 类中初始化
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
Stetho.initializeWithDefaults(this);
}
}
要通过 OkHttp 拦截网络请求,请将 StethoInterceptor 添加到拦截器链中。Stetho 会自动记录 URL、请求和响应头、状态码和执行时间。通过 chrome://inspect 连接到设备后,数据会显示在 Chrome DevTools 的 Network 选项卡中。
Stetho 的 Network Inspector 按时间顺序显示应用的所有 HTTP 请求。每个请求都包含:方法、URL、状态码、请求和响应头、请求和响应体(包括 JSON 和二进制数据)。Preview 选项卡以格式化形式显示响应体。
Chrome DevTools 支持按类型(XHR、JS、CSS、Doc)、状态码和域名过滤请求。搜索框按 URL 和内容过滤。对于移动开发,按 API 域名对请求进行分组,并在测试应用界面时检查调用顺序会很有用。
// 带 Stetho 拦截器的 OkHttp 客户端
OkHttpClient client = new OkHttpClient.Builder()
.addNetworkInterceptor(new StethoInterceptor())
.build();
// 执行请求
Request request = new Request.Builder()
.url("https://api.example.com/users")
.build();
client.newCall(request).enqueue(callback);
Stetho 的 Database Inspector 通过 Chrome DevTools 连接到应用的 SQLite 数据库。在 Resources → Web SQL 选项卡中显示所有打开的数据库、它们的表和内容。可以查看表结构、索引并执行任意 SQL 查询。
可以在 Chrome DevTools 控制台中直接对应用数据库执行 SQL 查询:SELECT、INSERT、UPDATE、DELETE。这在测试前清理数据、检查迁移正确性以及在无需重新构建应用的情况下手动修复错误记录时非常有用。所有更改都会立即在设备上显示。
Dumpapp — Stetho 的 shell 接口,允许通过 adb 执行自定义命令。Dumpapp 插件在 Stetho 初始化时注册,可以导出应用的任何状态:缓存、设置、DI 容器的状态。命令以 adb forward tcp:12345 localabstract:stetho_dumpapp 的形式执行。
该插件实现 DumperContext 接口,并通过 Stetho.initialize 与自定义的 InspectorModules 一起注册。下面的示例展示了用于导出 SharedPreferences 的插件:数据被序列化为 JSON,并通过 adb 命令输出到终端。
// 用于 SharedPreferences 的自定义 Dumpapp 插件
public class PrefsDumper implements DumperContext {
@Override
public String getName() {
return "prefs";
}
@Override
public void dump(DumperContext ctx) {
SharedPreferences sp = ctx.getContext()
.getSharedPreferences("app_prefs", Context.MODE_PRIVATE);
ctx.getStdout().println(sp.getAll().toString());
}
}
Android Studio 提供内置的剖析工具:Network Profiler、Database Inspector 和 View Inspector,它们在 Android Studio 4.1+ 中出现。Stetho 在这些工具推出之前很流行,对于使用 OkHttp 并需要与 Chrome DevTools 集成的项目仍然适用。
| 标准 | Stetho | Android Studio Inspector |
|---|---|---|
| 安装 | Gradle 依赖 | 内置于 IDE |
| Network | 通过 OkHttp Interceptor | API 26+ 自动支持 |
| SQLite | Chrome DevTools + SQL 查询 | 仅 Android Studio |
| SharedPreferences | 支持(Dumpapp 插件) | 不支持 |
| View Hierarchy | Chrome DevTools Elements | Layout Inspector |
| 支持 | Community(legacy) | Google 官方 |
Stetho 适用于已经使用 OkHttp 且团队习惯 Chrome DevTools 的 legacy 项目。对于新项目,Android Studio Inspector 覆盖了大多数调试场景。然而,Chrome DevTools 在执行 SQLite 查询时仍然更方便:内置的 SQL 自动补全控制台比在 IDE 中连续点击更快。
View Hierarchy 在 Stetho 中显示在 Chrome DevTools 的 Elements 选项卡中,呈现为类似 DOM 的树。每个 View 都以 HTML 元素形式表示,带有属性:id、layout_width、layout_height、padding、margin、visibility 和文本。屏幕旋转或 UI 更新时,树中的更改会实时同步。
在树中选择元素后,可以在 Styles 面板中查看其属性 — 与检查网页类似。Stetho 显示计算尺寸、间距、背景色和状态(pressed、focused、enabled)。在 DevTools 中修改某些属性会立即应用到应用上,从而无需重新构建即可快速调整 UI 参数。
Stetho 有助于发现与 View 相关的内存泄漏:如果 Activity 在 finish() 后未被销毁,其根 View 会留在树中。定期检查 Elements 选项卡可以发现幽灵 Activity,并找到泄漏源 — 通常是对 Context 的静态引用或未关闭的对话框。
Stetho 对于在发送到服务器之前检查 JSON 序列化非常有效。打开 Network Inspector,找到请求,以 Raw 模式查看请求体,以检查数据结构字段的正确性。
Stetho 显示所有通过 SQLiteOpenHelper 创建的数据库。如果数据库没有出现在 Chrome DevTools 中 — 请检查 getWritableDatabase() 是否已在应用代码中至少调用一次。
Stetho 必须是 OkHttp 链中的最后一个 interceptor,才能看到修改后的请求。正确顺序:AuthInterceptor first,然后是 LoggingInterceptor,最后是 StethoInterceptor。
Stetho 对于在发送到服务器之前检查 JSON 序列化的正确性非常有效。打开 Network Inspector,找到请求,以 Raw 模式查看请求体,以确保字段结构和数据类型正确。
Stetho 显示所有通过 SQLiteOpenHelper 创建的数据库。如果数据库没有出现在 Chrome DevTools 中 — 请检查 getWritableDatabase() 方法是否已在应用代码中至少调用一次。对于迁移,请通过 SQL 控制台执行 ALTER TABLE,并用 SELECT 查询验证结果。
Stetho 必须是 OkHttp 链中的最后一个 interceptor,以显示最终的修改后请求。正确顺序:AuthInterceptor 第一,然后是 LoggingInterceptor,最后是 StethoInterceptor 以进行正确记录。
常见问题
通过 USB 连接设备,执行 adb forward tcp:8080 localabstract:stetho_default,然后在 Chrome 中打开 chrome://inspect 页面。确保 Stetho 已在应用代码中初始化,并且设备已在 Remote Target 列表中检测到。
可以,Stetho 在 Android 12+ 上可以正常工作,但需要在清单文件中声明显式的 INTERNET 权限。在 Android 14+ 上可能需要更新 ADB。对于新项目,Google 推荐 Android Studio Inspector,但 Stetho 在所有版本上都仍然可用。
可以,SQLite Inspector、SharedPreferences 和 View Hierarchy 在无 OkHttp 时也能正常工作。Network Inspector 需要通过 stetho-okhttp3 或 stetho-urlconnection 模块与 OkHttp 或 HttpURLConnection 集成。Stetho 的基础核心不依赖任何网络库。
在 Gradle 中使用 debugImplementation:debugImplementation 'com.facebook.stetho:stetho:1.6.0'。在 release 构建中,Stetho 的代码不会被编译。如果初始化被放到单独的类中 — 请用 BuildConfig.DEBUG 检查包裹该调用。
主要替代方案:Chucker(应用内 HTTP 检查,带 UI)、Android Studio Profiler 和 Network Inspector 工具,以及 Flipper(Facebook 的模块化平台,功能更丰富)。Chucker 作为无需 Chrome DevTools 的 in-app 解决方案尤其受欢迎。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。