轉載請註明來源,尊重做者成果java
stetho是facebook開發的Android調試工具。它能夠經過chrome的開發者工具來輔助安卓開發。
總的來講,提供瞭如下幾個功能:linux
在使用以前須要先引用須要的包。
經過語句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 中借用了不少語法,讓程序員能夠快速編寫功能強大的程序。