Android進階之路 - Stetho真機查看數據庫

起因:維護老項目,需查看本地數據庫數據,起初使用了DDMS調試,但使用時發現真機需Root、而我又不想使用模擬器,在此基礎下我發現了Stetho三方框架能實現我的需求,故在使用真實有效的基礎下總結此篇,包括遇到的每一個問題~

stetho基本瞭解

stetho爲facebook於2015年開發的Android調試工具,Github顯示在2019年依舊有代碼更新,故此可以看出目前這個框架依舊有團隊在進行維護 ~ 同時在Github有很明白的框架使用描述,不過爲了兼顧像我一樣英文不太好的還是看我寫的吧,畢竟在我大白話的介紹下差不多可以滿足基本使用了 ~

內置功能
  • Elements:查看界面的視圖結構
    開發中我一般使用 Component Tree、Layout Inspector、Hierarchy Viewer 或直接通過 DDMS調試 查看視圖結構

  • Network:監控網絡請求,包含請求狀態、請求參數、返回參數等等
    開發中我一般使用 Fiddler抓包,既能抓到請求,又可以模擬弱網環境,從而優化我們的用戶體驗;對了,DDMS 也可以抓請求,不過我還是用fiddler居多 ~

  • Resources:查看本地數據,比如sqlite數據庫,sharepreference等;同時也可以執行sql語句

  • Console:在這裏執行js語句,可以在APP上彈出一個Toast

  • dumpapp: 目前只可在linux/mac上使用的命令行交互接口工具(都不能在Windows用,所以沒去研究)

監控Network

除了攔截Network之外,其餘功能直接操作,攔截Network還需要根據官網描述簡單配置一下 ~

  • 添加對應依賴
implementation 'com.facebook.stetho:stetho-okhttp3:1.5.1'

or

implementation 'com.facebook.stetho:stetho-urlconnection:1.5.1'
  • 添加攔截器

stetho開發團隊在此部分配置階段,有下面這樣一段原話,供大家參閱下:
請注意,okhttp 2.x也可以使用,但是語法略有不同,因此必須使用stetho-okhttp工件(不是stetho-okhttp3)。
由於攔截器可以修改請求和響應,因此請在所有其他攔截器之後添加Stetho攔截器,以準確瞭解網絡流量。
如果您使用HttpURLConnection,則可以使用StethoURLConnectionManager 來輔助集成,儘管您應該意識到這種方法有一些注意事項。特別是,您必須顯式添加 Accept-Encoding: gzip到請求標頭並手動處理壓縮的響應,以便Stetho報告壓縮的有效負載大小

如果你項目中的網絡框架是基於okhttp開發的,那麼在自己封裝的網絡基層內加入類似OkHttp 3.x 攔截配置中 .addNetworkInterceptor(new StethoInterceptor()) 的代碼,應該就可以實現攔截了 ~

OkHttp 2.x

    OkHttpClient client = new OkHttpClient();
    client.networkInterceptors().add(new StethoInterceptor());

OkHttp 3.x

個人覺得應該基本都是3.0的了,因爲官網現在都已經不顯示2.0這樣的配置了 - -

new OkHttpClient.Builder()
    .addNetworkInterceptor(new StethoInterceptor())
    .build()
dumpapp插件

這部分沒去研究,有想看的這裏跳轉這裏,這位朋友講的也還行,雖然不是很細 ~

配置方式

Stetho.initialize(Stetho.newInitializerBuilder(context)
    .enableDumpapp(new DumperPluginsProvider() {
      @Override
      public Iterable<DumperPlugin> get() {
        return new Stetho.DefaultDumperPluginsBuilder(context)
            .provide(new MyDumperPlugin())
            .finish();
      }
    })
    .enableWebKitInspector(Stetho.defaultInspectorModulesProvider(context))
    .build())
console配置

個人感覺對於app是個雞肋功能…

  • 添加依賴(啓用JavaScript控制檯)
implementation 'com.facebook.stetho:stetho-js-rhino:1.5.1'
  • 配置方式
    啓動 app,在 Chrome 開發者工具的 Console 輸入下面代碼使 app 打印一個Toast
importPackage(android.widget);
importPackage(android.os);
var handler = new Handler(Looper.getMainLooper());
handler.post(function() { Toast.makeText(context, "hello", Toast.LENGTH_LONG).show() });

Andorid項目配置

以下倆步的實現只是爲了讓stetho的遊覽器工具可以識別到我們的手機

依賴注入

build.gradle

implementation 'com.facebook.stetho:stetho:1.5.1'

<dependency>
  <groupId>com.facebook.stetho</groupId>
  <artifactId>stetho</artifactId>
  <version>1.5.1</version>
</dependency>
Application 註冊

但凡一個正常的Android項目都有屬於自己的Application,首先他是程序執行的第一個入口,同時兼顧很多的配置;所以不論是三方的的配置,還是說Android本身的兼容問題都會使用到Application!關於Application的一些問題,我也會在本文後半場說明 ~

  • Application 的 onCreate()生命週期內加入下方代碼
    Stetho.initializeWithDefaults(this);
  • 如此這般
 	@Override
    public void onCreate() {
        super.onCreate();
        Stetho.initializeWithDefaults(this);
    }

遊覽器工具

喚出工具

在此過程中你可能會遇到遊覽器 報404、識別不到設備、無inspect按鈕等問題,但無須擔心,在本文後半場都有解決方式 ~

將下方鏈接copy到谷歌遊覽器中(劃重點”谷歌遊覽器“,要考的 - - ~)

chrome://inspect/#devices

在Google遊覽器打開的正確效果如下 > < ~
在這裏插入圖片描述

使用工具

喚出DevTools工具後如Element可顯示佈局結構,那麼恭喜你成功第一步了
在這裏插入圖片描述

完美狀態

這裏你可能會遇到 WebSql 打開空白界面的情況,莫擔心本文後半場有詳解

菜單欄Resources下查看WebSql,打開內部的data - data 你就可以看到想念已久的數據庫信息了 ~

哦,對了,如果想同步查看手機中項目的當前效果,可直接點右上角的手機 ,同居會同步效果的 ~
在這裏插入圖片描述

崎嶇道路一路錯

無法打開 chrome://inspect/#devices

我曾嘗試使用baidu、360、火狐等遊覽器請求該鏈接,但是結果有的直接報404錯誤、有的直接空白界面等,反正就是各種打不開 ~

首先確定當前使用的遊覽器是否爲Chrome (谷歌),如果不是請及時下載Chrome ,下載之後使用Chrome 重新請求即可;

使用Chrome後依舊無法打開 chrome://inspect/#devices

這個原因請私信我 > <

不顯示手機型號、包名、項目名等數據

1.查看Android項目是否配置完畢
2.查看手機是否已經打開App
3.這個原因請私信我

Inspect點擊之後出現空白界面

1.確定是否爲Chrome 瀏覽器
2.查看Chrome 是否爲最新版本
3.這個原因請私信我(第一次需要這樣,後面不需要)

Elements正常顯示,但Resources顯示空白

1.確定遊覽器爲Chrome
2.切入到Resources後,稍等倆分鐘,最多倆分鐘,即使數據傳輸慢,但是倆分鐘後還沒加載出來,那麼肯定是有問題
3.刷新當前界面 - F5
4.嘗試切換爲網絡環境(這個原因請私信我)
5.操作右上角手機圖標,同步顯示手機當前狀態
6.開啓一個新的Chrome 瀏覽器窗口,然後根據 chrome://inspect/#devices → inspect → Resources 操作,我是重複嘗試到第三次的時候成功獲取到了Resources內存的數據信息 ~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章