[轉]stetho使用介紹

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

轉載請註明來源,尊重做者成果java

 

介紹

stetho是facebook開發的Android調試工具。它能夠經過chrome的開發者工具來輔助安卓開發。
總的來講,提供瞭如下幾個功能:linux

  • 經過Elements標籤查看界面的視圖結構。
  • 經過Network標籤觀察網絡請求。
  • 經過Resources標籤查看本地數據,好比sqlite數據庫,sharepreference等等。同時能夠在這裏執行sql語句。
  • 經過Console標籤,在這裏執行js語句,能夠在APP上彈出一個Toast。
  • dumpapp 是linux/mac上使用的命令行工具,能夠修改app內部資源,暫時未詳細瞭解。

準備

在使用以前須要先引用須要的包。
經過語句android

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

來引用stetho。程序員

底層的網絡請求能夠經過兩種方式來實現。分別是okhttp和urlconnection。我這裏使用了okhttp進行網絡請求。
引用方式:web

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

若是使用urlconnection,則須要添加sql

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

而後須要在使用自定義的Application添加 Stetho.initializeWithDefaults(this);chrome

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

觀察視圖結構

在chrome的地址欄輸入chrome://inspect, 能夠看到當前鏈接的設備,而後點擊inspect按鈕。
而後能夠在Elements標籤中觀察視圖結構,當選中某個view時,手機上對應的控件也會加上一層藍色蒙版
,就像調試web頁面同樣。能夠經過這個功能優化佈局,防止view嵌套過深。或者在編寫自定義控件的時候
也能提供幫助。shell

觀察網絡請求

以前進行網絡調試的時候,都是經過斷點查看數據,或者經過設置代理,而後用Fiddler抓包來觀察。
Stetho也提供了一種觀察網絡請求的方法。
首先要調用
mOkHttpClient.networkInterceptors().add(new StethoInterceptor());
來監聽網絡請求。而後開始調用接口。
這裏我選擇調用 圖靈機器人 的聊天接口來測試網絡調用,數據傳輸用的是json格式。
請求示例:數據庫

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

返回結果:json

{

"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 中借用了不少語法,讓程序員能夠快速編寫功能強大的程序。

相關文章
相關標籤/搜索