我又開發了一個非常好用的開源庫,調試Android數據庫有救了

本文同步發表於我的微信公衆號,掃一掃文章底部的二維碼或在微信搜索 郭霖 即可關注,每個工作日都有文章更新。

2020年只剩下最後半個月了,你今年定下的目標都完成了嗎?

大概是在今年5 6月份的時候,我曾經在公衆號中透漏過,今年打算再開發一個新的開源項目。那個時候基本思路其實已經都想得差不多了,但是因爲同時還要維護LitePal和PermissionX這兩個開源項目,時不時還要寫些原創文章,所以我很不確定今年是否真的可以完成這個新開源項目。

而在今年的最後一個月,很高興地告訴大家,這個新項目我已經基本完成了。雖然還有許多不足的地方,但是我相信目前已經可以將第一個測試版本發佈出來了。當然第一個版本一定會存在不少bug,我會根據大家的反饋不斷繼續完善代碼,這也將是另一個我會長期支持下去的開源項目。

那麼接下來我們就具體聊一聊這個開源項目到底是什麼吧。

其實做了Android開發這麼多年,一直以來都有一個我認爲非常不人性化的地方,就是開發人員沒有辦法簡單直接地查看當前應用程序中的數據庫文件,這個問題導致Android數據庫的開發與調試工作一直都比較困難。

舉個例子,我們編寫了一段代碼去查詢數據庫當中的某條數據,但是卻沒能查出來。那麼到底是因爲查詢語句寫錯了?還是因爲這條數據根本就不存在?要如何定位及解決這種問題是比較頭疼的,因爲我們無法直觀地看到當前數據庫中實際的數據。

那麼過去大家都是如何解決的呢?

這個真的是八仙過海,各顯神通了。像我個人比較習慣的方式是直接用SQL命令查看,藉助adb shell進入控制檯,然後使用sqlite3命令打開某個數據庫文件,再接下來用傳統的SQL語句就能查看該數據庫當中的數據了。只可惜這種方式自Android 7.0之後被禁止使用,主要還是考慮數據的安全性問題吧。

另外也有一些朋友可能會藉助一些第三方的工具,比如說SQLite Expert。這種工具是在電腦上用來查看數據庫文件的,因此需要先想辦法將手機中的數據庫文件導出到電腦上(這一步也並不容易,因爲內置存儲空間的文件很難導出),然後再用SQLite Expert打開該文件即可查看其中的數據。

不管使用哪種方式,看上去都不是一件簡單的事情。有的時候我在開發過程中遇到一些數據庫的問題,一想到要用這麼繁瑣的步驟才能查看到數據庫當中的數據,我寧願換一種解決問題的思路。

Google在過去一直沒有針對數據庫調試這方面提供了一個簡便的解決方案,這是我認爲非常不人性化的一點。

好消息是,最新的Android Studio 4.1當中終於內置了Database Inspector這個工具,在很大程度上解決了數據庫調試困難的問題。並且我認爲,Google早就應該提供這個工具了。

而我新開發的這個開源項目同樣也是爲了解決這個問題。

最開始想到去做這樣一個開源項目,主要是受到LeakCanary的啓發。LeakCanary相信很多朋友都用過,我們只需要將LeakCanary的庫集成到項目當中,LeakCanary就能自動檢測當前項目的內存泄漏情況,並通過可視化的界面將內存泄漏問題展示給開發者。

然後我就想到,我是不是也可以開發一個開源庫,當任何項目集成了這個開源庫後,就自動掃描當前項目的內置和外置存儲空間,把所有的數據庫文件都掃描出來,然後同樣提供一個可視化的界面以方便開發者隨時查看數據庫中的數據。

有了這個庫,當我們在開發過程中再次遇到數據庫問題時,直接通過可視化界面查看一下數據庫當中真實的數據是什麼樣的,哪裏出了問題就一目瞭然了。

雖然聽上去和Database Inspector的功能有點重疊,但其實它們的目標場景是完全不同的。Database Inspector需要手機連到電腦上,然後在Android Studio裏查看數據庫當中的數據。而我開發的這個開源庫不需要連接電腦,只需在手機上即可查看(有點類似於Profiler和LeakCanary之間的關係)。

我給這個開源庫起名爲:Glance,意爲一瞥的意思。我希望能讓開發者們通過快速一瞥即可定位開發當中遇到的數據庫問題,所以起了這樣一個名字。

確定了項目名和設計思路之後,接下來我就開始動手開發了。事實上,Glance的開發過程一路都比較順利,可能主要是因爲之前開發過LitePal,所以在數據庫方面積累了很多經驗。

並且,我對Glance的定位不僅僅只是一個協助查看數據庫內容的工具,同時也是一個非常好的學習項目。在編寫Glance的時候,我特意使用了許多Google目前最推薦使用的各項新技術,包括Kotlin、協程、Paging3、App Startup、MVVM等等等等,基本都是按照最標準的項目開發規範去實現的。所以,學習這個項目的源碼相信也會對你的開發水平有非常大的幫助。

我大概是從8月中旬的時候開始着手編寫的這個項目,到11月份的時候基本就將所有主要的功能都開發完成了。期間還進行了一輪小範圍的內部測試,幾位熱心羣友幫我發現了好幾個頗爲嚴重的bug,我又對此一一進行了修復。

那麼現在,我認爲這可以算是一個相對比較穩定的版本了。但是由於畢竟是全新的開源庫,我還不敢直接發佈1.0.0版本,因此這次發佈的是1.0.0-alpha01版本。大家如果在使用的過程中發現了任何問題,很正常,反饋給我即可,我會盡快進行修復。

好了,接下來就向大家介紹Glance的具體用法吧。其實真的非常非常簡單,只需要使用如下語句將Glance引入到你的項目當中:

dependencies {
   
   
    debugImplementation 'com.glance.guolindev:glance:1.0.0-alpha01'
}

然後就結束了。

沒錯,就是這麼簡單,Glance沒有提供任何對外的API,所以也不需要你進行什麼代碼對接操作,只要將依賴庫引入到你的項目當中,就算是對接完成了。

注意上述的引用語句中我們使用的關鍵字是debugImplementation,這個關鍵字相信大家用的比較少,通常我們使用的都是implementation關鍵字。那麼debugImplementation是什麼意思呢?它表示只有在你的項目是debug版的時候,纔會將Glance引入到你的項目當中,而release版是不會包含Glance庫的。

這是一種最爲安全的做法,因爲如果release版中引入了Glance庫,相當於給你的應用程序留了個後門,是有可能引起數據庫安全問題的。

接下來就像平常那樣運行你的程序就可以了,你會發現,你的手機桌面上將會多出一個Glance的圖片,如下圖所示。

這個圖標就是引入了Glance庫之後自動生成的,點擊該圖標即可打開Glance的可視化界面,如下圖所示。

在這裏,Glance會自動開始掃描當前應用程序的內置和外置存儲空間,將所有的數據庫文檔全部搜索到,並一一列出。

比如上圖中的demo1.db就是我當前項目工程中的一個數據庫文件,internal storage表示它是存放在內置存儲空間下的。

點擊demo1.db,即可打開這個數據庫文件,並將該數據庫中的所有表羅列出來,如下圖所示。

當然這裏列出的表並不全部都是由我們自己創建的,比如android_metadata、sqlite_sequence這些表就是自動生成的。但Glance並不會對此進行區分,而是會把它們全部羅列出來。

接下來點擊magazine表,我們即可查看錶中的數據。橫向滾動可以查看所有的列,縱向滾動可以查看所有的行,如下圖所示。

這裏對錶中的數據進行加載使用了分頁技術,所以即使你的表中有上百萬條數據,也會非常快速地加載出來。而Glance的分頁技術是使用Paging3實現的,對Paging3感興趣的朋友可以參考參考這部分的源碼。

到這裏爲止,我們就可以非常方便地隨時查看當前應用程序數據庫中的數據了。相比於之前還要想辦法導出數據庫文件,發送到電腦上,再借助第三方工具進行查看,是不是簡單了千百倍?

即使相比於Database Inspector,我認爲Glance也是有很大優勢的,畢竟你不需要藉助電腦,也不需要打開Android Studio才能查看。

另外,假如你的數據庫文件發生了變化,Glance也可以迅速地感知到。比如我們向當前應用程序的外置存儲空間當中添加一個新的數據庫文件,如下圖所示。

可以看到,當回到Glance的可視化界面之後,迅速就能發現新增了一個demo2.db,external storage表示它是存放在空間存儲空間下的。

然後我們就可以立刻查看demo2.db當中的全部數據了。

那麼關於Glance的用法介紹到這裏大概就差不多了。因爲畢竟它的主要功能就是一個輔助型的工具,並不是什麼需要去開發和對接的庫,所以整體用法是非常簡單的。

接下來我想聊一聊Glance的限制,至少在目前第一個版本中,這些限制是需要提醒大家的。

首先,Glance只提供對數據庫進行查看的功能,並不提供修改和刪除的功能。當然之所以不支持修改和刪除,並不是因爲什麼其他特殊的原因,純粹只是因爲我沒時間。爲了能趕在今年內上線第一個版本,我選擇了只開發了最核心的查看功能。

在接下來的版本更新當中,修改和刪除數據庫的功能會有極大的概率被加入進去。

第二,Glance只支持使用AndroidX架構的項目,並且未來也只會支持AndroidX架構。如果你的項目還在使用Support Library架構,那麼很遺憾,你將無法使用Glance。

關於這個限制我其實思考了很久,因爲本身查看數據庫功能和AndroidX架構一點關係都沒有。但是我在Glance當中使用了大量最新的Google技術,如協程、Paging3、App Startup等等,這些新技術都是隻支持AndroidX架構的。那麼到底是爲了更好的兼容性而不使用這些新技術,還是爲了讓Glance更具有學習意義而使用這些新技術,我最終選擇了後者。

另外我相信,AndroidX終將是趨勢,即使現在還在使用Support Library的項目,在不久的將來也必然會轉換到AndroidX架構上,所以對此我並不是很擔心。

好了,關於Glance第一個版本的所有介紹就到這裏。也很高興我將今年定下的最後一個小目標也實現了,這一年真的可以說是收穫滿滿。

最後附上Glance的開源庫地址,想學習源碼的朋友不要錯過哦。另外也請幫我隨手點個star,謝謝大家。

https://github.com/guolindev/Glance



如果想要學習Kotlin和最新的Android知識,可以參考我的新書 《第一行代碼 第3版》點擊此處查看詳情


關注我的技術公衆號,每個工作日都有優質技術文章推送。

微信掃一掃下方二維碼即可關注:



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