stetho使用介紹

原文首發(fā)于我的個人博客胧砰,歡迎訪問(_)唉匾,轉載請注明出處凄硼。

介紹

stetho是facebook開發(fā)的Android調試工具铅协。它可以通過chrome的開發(fā)者工具來輔助安卓開發(fā)。
總的來說摊沉,提供了以下幾個功能:

  • 通過Elements標簽查看界面的視圖結構狐史。
  • 通過Network標簽觀察網絡請求。
  • 通過Resources標簽查看本地數(shù)據(jù)说墨,比如sqlite數(shù)據(jù)庫骏全,sharepreference等等。同時可以在這里執(zhí)行sql語句尼斧。
  • 通過Console標簽姜贡,在這里執(zhí)行js語句,可以在APP上彈出一個Toast棺棵。
  • dumpapp 是linux/mac上使用的命令行工具楼咳,可以修改app內部資源,暫時未詳細了解烛恤。

準備

在使用之前需要先引用需要的包母怜。
通過語句

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

來引用stetho。

底層的網絡請求可以通過兩種方式來實現(xiàn)缚柏。分別是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頁面一樣×常可以通過這個功能優(yōu)化布局铐然,防止view嵌套過深蔬崩。或者在編寫自定義控件的時候
也能提供幫助搀暑。

觀察網絡請求

之前進行網絡調試的時候沥阳,都是通過斷點查看數(shù)據(jù),或者通過設置代理自点,然后用Fiddler抓包來觀察桐罕。
Stetho也提供了一種觀察網絡請求的方法。
首先要調用
mOkHttpClient.networkInterceptors().add(new StethoInterceptor());
來監(jiān)聽網絡請求桂敛。然后開始調用接口功炮。
這里我選擇調用 圖靈機器人 的聊天接口來測試網絡調用,數(shù)據(jù)傳輸用的是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();
            }
        }
    });
}

發(fā)送請求之后,可以在Network標簽看到所有通過okhttp發(fā)送的請求粗仓。但是如果APP中如果有不通過okhttp進行的請求嫁怀,比如使用Glide加載圖片,就無法監(jiān)聽這次加載圖片的請求了借浊。應該可以通過配置將okHttp作為Glide通信框架塘淑,然后監(jiān)聽。

在這里還可以觀察到數(shù)據(jù)的大小蚂斤,加載時間存捺。




本地數(shù)據(jù)

以前想要觀察手機上的sqlite數(shù)據(jù)庫,都是通過命令行使用adb shell來操作曙蒸,或者把數(shù)據(jù)庫拷貝到電腦上然后再通過sqlite工具打開捌治,非常不方便。現(xiàn)在可以直接通過stetho的Resources標簽查看逸爵。

為了方便具滴,我直接使用lite-orm來進行數(shù)據(jù)庫操作凹嘲。

    @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表格师倔,然后每次執(zhí)行writeToDB都會向表格中插入一條數(shù)據(jù)。



另外周蹭,還可以在這里直接執(zhí)行sql語句進行查詢或者插入等操作趋艘。


除了sqlite數(shù)據(jù)庫,stetho還能觀察本地sharedPreference數(shù)據(jù)
測試代碼如下:

    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腳本動態(tài)執(zhí)行java代碼搓萧。
這個我能想到的使用場景就是在運行過程中直接查看內部數(shù)據(jù)杂数,但是通過斷點也能直接查看。




下面是rhino的簡介

Rhino 是一種使用 Java 語言編寫的 JavaScript 的開源實現(xiàn)瘸洛,原先由Mozilla開發(fā)揍移,現(xiàn)在被集成進入JDK 6.0。與其他很多語言一樣反肋,Rhino 是一種動態(tài)類型的那伐、基于對象的腳本語言,它可以簡單地訪問各種 Java 類庫石蔗。Rhino 從 JavaScript 中借用了很多語法罕邀,讓程序員可以快速編寫功能強大的程序。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末养距,一起剝皮案震驚了整個濱河市诉探,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棍厌,老刑警劉巖阵具,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異定铜,居然都是意外死亡阳液,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門揣炕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帘皿,“玉大人,你說我怎么就攤上這事畸陡∮チ铮” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵丁恭,是天一觀的道長曹动。 經常有香客問我,道長牲览,這世上最難降的妖魔是什么墓陈? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮第献,結果婚禮上贡必,老公的妹妹穿的比我還像新娘。我一直安慰自己庸毫,他們只是感情好仔拟,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著飒赃,像睡著了一般利花。 火紅的嫁衣襯著肌膚如雪科侈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天炒事,我揣著相機與錄音兑徘,去河邊找鬼。 笑死羡洛,一個胖子當著我的面吹牛挂脑,可吹牛的內容都是我干的。 我是一名探鬼主播欲侮,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼崭闲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了威蕉?” 一聲冷哼從身側響起刁俭,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎韧涨,沒想到半個月后牍戚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡虑粥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年如孝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娩贷。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡第晰,死狀恐怖,靈堂內的尸體忽然破棺而出彬祖,到底是詐尸還是另有隱情茁瘦,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布储笑,位于F島的核電站甜熔,受9級特大地震影響,放射性物質發(fā)生泄漏突倍。R本人自食惡果不足惜腔稀,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赘方。 院中可真熱鬧烧颖,春花似錦弱左、人聲如沸窄陡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跳夭。三九已至涂圆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間币叹,已是汗流浹背润歉。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留颈抚,地道東北人踩衩。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像贩汉,于是被迫代替她去往敵國和親驱富。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,846評論 25 707
  • What is Stetho ? Stetho 是一個功能強大的 Android 應用調試橋,起到橋梁的作用赐稽,連接...
    奧利奧龍卷風閱讀 1,770評論 0 5
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理叫榕,服務發(fā)現(xiàn),斷路器姊舵,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • 《雀兒山游記》 雀山之間晰绎,臨水之旁,雖值已立冬括丁,然南國花木蒼翠依舊寒匙。 偶陣林風吹過,落落數(shù)葉躏将,紛紛灑灑锄弱,聞林間雀鳥...
    刀狼閱讀 259評論 0 0
  • 當冬天來的時候会宪,把冬裝從衣柜里面翻出來,摸包包的時候蚯窥,發(fā)現(xiàn)有十塊錢掸鹅。一時無法想起具體什么時候放進去的了,但是記得大...
    Ched的小本本閱讀 167評論 0 0