原文链接:
http://www.jianshu.com/p/c03a8959d1a5#

转载请注明来源,尊重作者成果

介绍

stetho是facebook开发的Android调试工具。它可以通过chrome的开发者工具来辅助安卓开发。
总的来说,提供了以下几个功能:

  • 通过Elements标签查看界面的视图结构。
  • 通过Network标签观察网络请求。
  • 通过Resources标签查看本地数据,比如sqlite数据库,sharepreference等等。同时可以在这里执行sql语句。
  • 通过Console标签,在这里执行js语句,可以在APP上弹出一个Toast。
  • dumpapp 是linux/mac上使用的命令行工具,可以修改app内部资源,暂时未详细了解。

准备

在使用之前需要先引用需要的包。
通过语句

compile 'com.facebook.stetho:stetho:1.2.0'

来引用stetho。

底层的网络请求可以通过两种方式来实现。分别是okhttp和urlconnection。我这里使用了okhttp进行网络请求。
引用方式:

 compile 'com.facebook.stetho:stetho-okhttp:1.2.0'

如果使用urlconnection,则需要添加

compile 'com.facebook.stetho:stetho-urlconnection:1.2.0'

然后需要在使用自定义的Application添加 Stetho.initializeWithDefaults(this);

    public class MyApplication extends Application {
public void onCreate() {
super.onCreate();
Stetho.initializeWithDefaults(this);
}
}

观察视图结构

在chrome的地址栏输入chrome://inspect, 可以看到当前连接的设备,然后点击inspect按钮。
然后可以在Elements标签中观察视图结构,当选中某个view时,手机上对应的控件也会加上一层蓝色蒙版
,就像调试web页面一样。可以通过这个功能优化布局,防止view嵌套过深。或者在编写自定义控件的时候
也能提供帮助。

观察网络请求

之前进行网络调试的时候,都是通过断点查看数据,或者通过设置代理,然后用Fiddler抓包来观察。
Stetho也提供了一种观察网络请求的方法。
首先要调用
mOkHttpClient.networkInterceptors().add(new StethoInterceptor());
来监听网络请求。然后开始调用接口。
这里我选择调用 图灵机器人 的聊天接口来测试网络调用,数据传输用的是json格式。
请求示例:

http://www.tuling123.com/openapi/api?key=KEY&info=你漂亮么

返回结果:

{

"code":100000,

"text":"恩恩,害羞ing……"

}

具体的调用代码:

mOkHttpClient = new OkHttpClient();
mOkHttpClient.networkInterceptors().add(new StethoInterceptor()); public void talk(View view) {
String msg = etSource.getText().toString();
Request request = new Request.Builder().url(API_URL + API_KEY + "&info=" + msg).build();
Call call = mOkHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) { } @Override
public void onResponse(Response response) throws IOException {
try {
final JSONObject res = new JSONObject(response.body().string());
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
textView.setText(res.getString("text"));
} catch (JSONException e) {
e.printStackTrace();
}
}
});
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}

发送请求之后,可以在Network标签看到所有通过okhttp发送的请求。但是如果APP中如果有不通过okhttp进行的请求,比如使用Glide加载图片,就无法监听这次加载图片的请求了。应该可以通过配置将okHttp作为Glide通信框架,然后监听。

在这里还可以观察到数据的大小,加载时间。

本地数据

以前想要观察手机上的sqlite数据库,都是通过命令行使用adb shell来操作,或者把数据库拷贝到电脑上然后再通过sqlite工具打开,非常不方便。现在可以直接通过stetho的Resources标签查看。

为了方便,我直接使用lite-orm来进行数据库操作。

    @Table("person ")
public class Person {
@PrimaryKey(AssignType.AUTO_INCREMENT)
@Column("_id")
public long id; @Column("sex")
public String sex; @Column("age")
public int age; @Column("name")
public String name;
} public void writeToDB(View view) {
Person person = new Person();
person.age = 1;
person.sex = "male";
person.name = "233";
liteOrm.save(person);
textView.setText(String.format("There are %d datas in db", liteOrm.queryCount(Person.class)));
}

上面的代码定义了一个person表格,然后每次执行writeToDB都会向表格中插入一条数据。

另外,还可以在这里直接执行sql语句进行查询或者插入等操作。

除了sqlite数据库,stetho还能观察本地sharedPreference数据
测试代码如下:

    SharedPreferences sharedPreferences;
SharedPreferences.Editor editor;
sharedPreferences = this.getSharedPreferences("sp", Activity.MODE_PRIVATE);
editor = sharedPreferences.edit(); public void writeToSP(View view) {
editor.putString("test_key", "test_value");
editor.apply();
textView.setText(sharedPreferences.getString("test_key", "null"));
}

控制台调试

如果想要开启js控制台的功能,还需要添加引用

compile 'com.facebook.stetho:stetho-js-rhino:1.2.0'

然后Stetho的初始化要使用enableWebKitInspector

 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());

设置完成后,在console中输入

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() });

可以看到app上弹出了一个toast。
这个是Stetho集成了开源项目Rhino,可以用js脚本动态执行java代码。
这个我能想到的使用场景就是在运行过程中直接查看内部数据,但是通过断点也能直接查看。

下面是rhino的简介

Rhino 是一种使用 Java 语言编写的 JavaScript 的开源实现,原先由Mozilla开发,现在被集成进入JDK 6.0。与其他很多语言一样,Rhino 是一种动态类型的、基于对象的脚本语言,它可以简单地访问各种 Java 类库。Rhino 从 JavaScript 中借用了很多语法,让程序员可以快速编写功能强大的程序。

[转]stetho使用介绍的更多相关文章

  1. android-------- 常用且应该学习的框架

    今天来分享一下一些常用的库,在Github 上 star数也是很高的,开发中也是很常用的: 简单的分享一下,一起学习. http://www.xiufm.com/blog-1-944.html 框架名 ...

  2. 2017年Android百大框架排行榜

    框架:提供一定能力的小段程序 >随意转载,标注作者"金诚"即可 >本文已授权微信公众号:鸿洋(hongyangAndroid)原创首发. >本文已经开源到Gith ...

  3. android 优秀框架整理

    程序员界有个神奇的网站,那就是github,这个网站集合了一大批优秀的开源框架,极大地节省了开发者开发的时间,在这里我进行了一下整理,这样可以使我们在使用到时快速的查找到,希望对大家有所帮助! 1. ...

  4. 2017年Android百大框架排行榜(转)

    一.榜单介绍 排行榜包括四大类: 单一框架:仅提供路由.网络层.UI层.通信层或其他单一功能的框架 混合开发框架:提供开发hybrid app.h5与webview结合能力.web app能力的框架 ...

  5. GitHub上排名前100的Android开源库介绍(来自github)

    本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍,至于排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果,然后过滤了 ...

  6. OkHttp+Stetho+Chrome调试android网络部分

    如果要达到上面的效果,你需要改造你的网络请求模块,使用Chrome浏览器和android程序之间的中间件来连接,这就是本篇要介绍的主题:OkHttp+Stetho+Chrome进行网络调试. okht ...

  7. GitHub 上排名前 100 的 Android 开源库进行简单的介绍

    若有任何疑问可通过邮件或微博联系我 项目名称 项目简介 1. react-native 这个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开 ...

  8. GitHub开源库排名一百的简单介绍,值得收藏!

    GitHub Android Libraries Top 100 简介 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitHub ...

  9. Android必知必会-Stetho调试工具

    一.背景 Stetho是 Facebook 出品的一个强大的 Android 调试工具,使用该工具你可以在 Chrome Developer Tools查看APP的布局, 网络请求(仅限使用Volle ...

随机推荐

  1. Mac 安装HL-340 usb转串口驱动

    下载地址: http://www.wch.cn/download/CH341SER_MAC_ZIP.html 安装,重启. 开机之前按住 command + r 进入recovery模式 终端输入:c ...

  2. Link1123:转换到COFF期间失败:文件无效或损坏

        当在编译VS项目时,出现如下错误:         这个错误,表明在连接阶段出错.COFF为Common Object File Format,通用对象文件格式,它的出现为混合语言编程带来方便 ...

  3. 【转】Gulp入门基础教程

    Gulp入门基础教程 原文在此 前言最近流行前端构建工具,苦于之前使用Grunt,代码很难阅读,现在出了Gulp, 真是摆脱了痛苦.发现了一篇很好的Gulp英文教程,整理翻译给大家看看. 为什么使用G ...

  4. iOS模拟(糟糕的)网络环境

    有时候为了模拟在糟糕的网络环境下app的表现,会故意拔网线(断wifi),苹果其实提供了专门的工具来精确地模拟你在几个预设的场景下的网络连接情况:Network Link Conditioner 点击 ...

  5. 各大公司Java面试题超详细总结

    ThreadLocal(线程变量副本)Synchronized实现内存共享,ThreadLocal为每个线程维护一个本地变量.采用空间换时间,它用于线程间的数据隔离,为每一个使用该变量的线程提供一个副 ...

  6. struts2危险漏洞解决方法

    原创,bgy编写.2013-07-24 前文: 随着苹果开发者网站的沦陷,已经曝光一周的Apache Struts2漏洞再次成为热门话题,今天有消息称由于该漏洞被利用,淘宝的数据库已经被盗,尽管淘宝官 ...

  7. 超分辨率论文CVPR-Kai Zhang

    深度学习与传统方法结合的超分辨率:Kai Zhang 1. (CVPR, 2019) Deep Plug-and-Play Super-Resolution for Arbitrary https:/ ...

  8. [Err] 1231 - Variable 'sql_mode' can't be set to the value of 'NULL

    在MYSQL还原语句的时候,报: [Err] - Variable 'sql_mode' can't be set to the value of 'NULL 解决办法:打开SQL语句,把里面的注释给 ...

  9. iOS6 中 Smart App Banners介绍和使用(转自COCOACHINA.COM)

    转自:http://www.cocoachina.com/applenews/devnews/2012/0924/4842.html iOS 6新增Smart App Banners,也就是“智能Ap ...

  10. jrMz and angles(水题)

    jrMz and angles Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...