stetho使用介绍

原文首发于我的个人博客,欢迎访问(_),转载请注明出处。

介绍

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 中借用了很多语法,让程序员可以快速编写功能强大的程序。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,848评论 25 707
  • What is Stetho ? Stetho 是一个功能强大的 Android 应用调试桥,起到桥梁的作用,连接...
    奥利奥龙卷风阅读 1,770评论 0 5
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • 《雀儿山游记》 雀山之间,临水之旁,虽值已立冬,然南国花木苍翠依旧。 偶阵林风吹过,落落数叶,纷纷洒洒,闻林间雀鸟...
    刀狼阅读 259评论 0 0
  • 当冬天来的时候,把冬装从衣柜里面翻出来,摸包包的时候,发现有十块钱。一时无法想起具体什么时候放进去的了,但是记得大...
    Ched的小本本阅读 167评论 0 0