原文首發(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 中借用了很多語法罕邀,讓程序員可以快速編寫功能強大的程序。