Android开发调试神器 - Stetho

428 阅读3分钟

这是我参与8月更文挑战的第30天,活动详情查看:8月更文挑战

有坑吗?

关于网络监控的有一些需要注意的字段的含义,详细的内容可以去精读一遍Chrome开发者工具官方文档

这里只详细解释下上面图中个字段的含义。

  • Name/Path 网络资源的名称和URL路径,比如www.xxx.org/img/logo.jp… 这个网络资源,Name是logo.jpg Path是www.xxx.org/img
  • Method HTTP协议规定的请求方法,比如GET POST
  • Status/Text HTTP协议规定的返回码和这个返回码对应的含义解释文字 ,比如200/OK
  • Type 请求资源的MIME类型,比如application/json image/jpeg image/png等等
  • Initiator 发起请求的对象,可以是Parser/Redirect/Script/Other,详见上面的官方文档
  • Size/Content Size表示HTTP响应的头和数据体的和,由远程服务端返回;Content是返回的资源解码后的大小
  • Time/Latentcy Time是总的时间间隔,从发起请求开始到接收到服务端返回的最后一个字节为止;Latency是指的接收到服务端返回的第一个字节消耗的时间
  • Timeline 显示了所有网络请求的瀑布流

还可以做什么

除了监控网络,查看/修改数据之外,还可以做很多事情,因为Stetho预留了两种接口,为了可持续的发展

自定义dumpapp插件

自定义插件是让老司机dumpapp get新技能的首选方法,可以很容易地在配置过程中添加。只需如下代码即可添加自定义插件:

Stetho.initialize(Stetho.newInitializerBuilder(context)
        .enableDumpapp(new DumperPluginsProvider() {
          @Override
          public Iterable<DumperPlugin> get() {
            return new Stetho.DefaultDumperPluginsBuilder(context)
                .provide(new HelloWorldDumperPlugin())
                .provide(new APODDumperPlugin(context.getContentResolver()))
                .finish();
          }
        })
        .enableWebKitInspector(new ExtInspectorModulesProvider(context))
        .build());

其中HelloWorldDumperPlugin和APODDumperPlugin是自定义的插件,具体内容可以参考Stetho提供的sample程序 执行dumpapp命令需要先从git取下最新的代码,然后找到dumpapp脚本,并执行

$ git clone https://github.com/facebook/stetho.git
$ cd stetho
// 列举出支持的命令(插件)
$ ./scripts/dumpapp -p com.facebook.stetho.sample -l

参照sample代码编写dumpapp插件,然后用dumpapp命令验证插件的效果

Stetho对于JavaScript的支持

目前Stetho对于JavaScript脚本的支持是采用内嵌Mozilla研发的 Rhino

第一种采用dumpapp的插件扩展方式虽然功能强大,无所不能,但是完成一件事情需要一定的技术和时间成本,必须经历一系列的编写,编译,构建,安装,调试,修改代码,再下一个轮回,迭代几次后才能形成产出,这其实是类c/c++/java这种非动态语言的一个缺陷,软件的研发周期太长。那么,如果有一种写完即发布的脚本语言能够支持起来,其实对于研发效率来说,是有很大提升的,比如lua/javascript/perl/python/groovy等等,这样的语言轻巧,无需编译,写完就可以发布验证,甚至可以边写边调试边上线。

Chrome开发者工具原生支持JavaScript,所以Stetho也提供了JavaScript的支持。

Rhino是一个可以运行在Java程序内部的JavaScript实现,由Mozilla开发并发布为一个开源的项目

下面说说集成和使用方式

如果要让APP支持Rhino, 首先是gradle配置

dependencies { 
    compile 'com.facebook.stetho:stetho-js-rhino:1.3.1' 
} 

然后就可以通过开发机上Chrome浏览器提供的开发者工具的"Console"老司机(任何工具都有老司机console)来发射JavaScript代码了,参考代码如下:

importPackage(android.widget);
importPackage(android.os);
var handler = new Handler(Looper.getMainLooper());
handler.post(function() { Toast.makeText(context, "Hello from JavaScript", Toast.LENGTH_LONG).show() });

运行效果如下:

image.png 如果你想通过APP传递一些变量,类,闭包和函数给JavaScript运行环境中,那么你可以在Stetho初始化的时候添加如下代码:

Stetho.initialize(Stetho.newInitializerBuilder(context)
        .enableWebKitInspector(new InspectorModulesProvider() {
          @Override
          public Iterable<ChromeDevtoolsDomain> get() {
            return new DefaultInspectorModulesBuilder(context).runtimeRepl(
                new JsRuntimeReplFactoryBuilder(context)
                    // Pass to JavaScript: var foo = "bar";
                    .addVariable("foo", "bar")
                    .build()
            ).finish();
          }
        })
        .build());

更多玩法请移步官网