我又開發(fā)了一個非常好用的開源庫垄开,調(diào)試Android數(shù)據(jù)庫有救了

大概是在今年 5 6 月份的時候剃幌,我曾經(jīng)在公眾號中透漏過聋涨,今年打算再開發(fā)一個新的開源項目。那個時候基本思路其實已經(jīng)都想得差不多了负乡,但是因為同時還要維護 LitePal 和 PermissionX 這兩個開源項目牍白,時不時還要寫些原創(chuàng)文章,所以我很不確定今年是否真的可以完成這個新開源項目抖棘。

而在今年的最后一個月茂腥,很高興地告訴大家狸涌,這個新項目我已經(jīng)基本完成了。雖然還有許多不足的地方最岗,但是我相信目前已經(jīng)可以將第一個測試版本發(fā)布出來了帕胆。當然第一個版本一定會存在不少 bug,我會根據(jù)大家的反饋不斷繼續(xù)完善代碼般渡,這也將是另一個我會長期支持下去的開源項目惶楼。

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

其實做了 Android 開發(fā)這么多年诊杆,一直以來都有一個我認為非常不人性化的地方歼捐,就是開發(fā)人員沒有辦法簡單直接地查看當前應用程序中的數(shù)據(jù)庫文件,這個問題導致 Android 數(shù)據(jù)庫的開發(fā)與調(diào)試工作一直都比較困難晨汹。

舉個例子豹储,我們編寫了一段代碼去查詢數(shù)據(jù)庫當中的某條數(shù)據(jù),但是卻沒能查出來淘这。那么到底是因為查詢語句寫錯了剥扣?還是因為這條數(shù)據(jù)根本就不存在?要如何定位及解決這種問題是比較頭疼的铝穷,因為我們無法直觀地看到當前數(shù)據(jù)庫中實際的數(shù)據(jù)钠怯。

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

這個真的是八仙過海曙聂,各顯神通了晦炊。像我個人比較習慣的方式是直接用 SQL 命令查看,借助 adb shell 進入控制臺宁脊,然后使用 sqlite3 命令打開某個數(shù)據(jù)庫文件断国,再接下來用傳統(tǒng)的 SQL 語句就能查看該數(shù)據(jù)庫當中的數(shù)據(jù)了。只可惜這種方式自 Android 7.0 之后被禁止使用榆苞,主要還是考慮數(shù)據(jù)的安全性問題吧稳衬。

另外也有一些朋友可能會借助一些第三方的工具,比如說 SQLite Expert坐漏。這種工具是在電腦上用來查看數(shù)據(jù)庫文件的薄疚,因此需要先想辦法將手機中的數(shù)據(jù)庫文件導出到電腦上(這一步也并不容易,因為內(nèi)置存儲空間的文件很難導出)赊琳,然后再用 SQLite Expert 打開該文件即可查看其中的數(shù)據(jù)街夭。

不管使用哪種方式,看上去都不是一件簡單的事情慨畸。有的時候我在開發(fā)過程中遇到一些數(shù)據(jù)庫的問題莱坎,一想到要用這么繁瑣的步驟才能查看到數(shù)據(jù)庫當中的數(shù)據(jù),我寧愿換一種解決問題的思路寸士。

Google 在過去一直沒有針對數(shù)據(jù)庫調(diào)試這方面提供了一個簡便的解決方案檐什,這是我認為非常不人性化的一點。

好消息是弱卡,最新的 Android Studio 4.1 當中終于內(nèi)置了 Database Inspector 這個工具乃正,在很大程度上解決了數(shù)據(jù)庫調(diào)試困難的問題。并且我認為婶博,Google 早就應該提供這個工具了瓮具。

而我新開發(fā)的這個開源項目同樣也是為了解決這個問題。

最開始想到去做這樣一個開源項目凡人,主要是受到 LeakCanary 的啟發(fā)名党。LeakCanary 相信很多朋友都用過,我們只需要將 LeakCanary 的庫集成到項目當中挠轴,LeakCanary 就能自動檢測當前項目的內(nèi)存泄漏情況传睹,并通過可視化的界面將內(nèi)存泄漏問題展示給開發(fā)者。

然后我就想到岸晦,我是不是也可以開發(fā)一個開源庫欧啤,當任何項目集成了這個開源庫后,就自動掃描當前項目的內(nèi)置和外置存儲空間启上,把所有的數(shù)據(jù)庫文件都掃描出來邢隧,然后同樣提供一個可視化的界面以方便開發(fā)者隨時查看數(shù)據(jù)庫中的數(shù)據(jù)。

有了這個庫冈在,當我們在開發(fā)過程中再次遇到數(shù)據(jù)庫問題時倒慧,直接通過可視化界面查看一下數(shù)據(jù)庫當中真實的數(shù)據(jù)是什么樣的,哪里出了問題就一目了然了包券。

雖然聽上去和 Database Inspector 的功能有點重疊迫靖,但其實它們的目標場景是完全不同的。Database Inspector 需要手機連到電腦上兴使,然后在 Android Studio 里查看數(shù)據(jù)庫當中的數(shù)據(jù)系宜。而我開發(fā)的這個開源庫不需要連接電腦,只需在手機上即可查看(有點類似于 Profiler 和 LeakCanary 之間的關系)发魄。

我給這個開源庫起名為:Glance盹牧,意為一瞥的意思。我希望能讓開發(fā)者們通過快速一瞥即可定位開發(fā)當中遇到的數(shù)據(jù)庫問題励幼,所以起了這樣一個名字汰寓。

確定了項目名和設計思路之后,接下來我就開始動手開發(fā)了苹粟。事實上有滑,Glance 的開發(fā)過程一路都比較順利,可能主要是因為之前開發(fā)過 LitePal嵌削,所以在數(shù)據(jù)庫方面積累了很多經(jīng)驗毛好。

并且望艺,我對 Glance 的定位不僅僅只是一個協(xié)助查看數(shù)據(jù)庫內(nèi)容的工具,同時也是一個非常好的學習項目肌访。在編寫 Glance 的時候找默,我特意使用了許多 Google 目前最推薦使用的各項新技術,包括 Kotlin吼驶、協(xié)程惩激、Paging3、App Startup蟹演、MVVM 等等等等风钻,基本都是按照最標準的項目開發(fā)規(guī)范去實現(xiàn)的。所以酒请,學習這個項目的源碼相信也會對你的開發(fā)水平有非常大的幫助骡技。

我大概是從 8 月中旬的時候開始著手編寫的這個項目,到 11 月份的時候基本就將所有主要的功能都開發(fā)完成了蚌父。期間還進行了一輪小范圍的內(nèi)部測試茎辐,幾位熱心群友幫我發(fā)現(xiàn)了好幾個頗為嚴重的 bug褪猛,我又對此一一進行了修復。

那么現(xiàn)在,我認為這可以算是一個相對比較穩(wěn)定的版本了冬三。但是由于畢竟是全新的開源庫意述,我還不敢直接發(fā)布 1.0.0 版本喘落,因此這次發(fā)布的是 1.0.0-alpha01 版本懈叹。大家如果在使用的過程中發(fā)現(xiàn)了任何問題,很正常缤削,反饋給我即可窘哈,我會盡快進行修復。

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

dependencies {? ? debugImplementation 'com.glance.guolindev:glance:1.0.0-alpha01'}復制代碼

然后就結(jié)束了帅刀。

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

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

這是一種最為安全的做法锌云,因為如果 release 版中引入了 Glance 庫荠医,相當于給你的應用程序留了個后門吁脱,是有可能引起數(shù)據(jù)庫安全問題的。

接下來就像平常那樣運行你的程序就可以了彬向,你會發(fā)現(xiàn)兼贡,你的手機桌面上將會多出一個 Glance 的圖片,如下圖所示娃胆。

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

在這里凿蒜,Glance 會自動開始掃描當前應用程序的內(nèi)置和外置存儲空間,將所有的數(shù)據(jù)庫文檔全部搜索到胁黑,并一一列出废封。

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

點擊 demo1.db漂洋,即可打開這個數(shù)據(jù)庫文件,并將該數(shù)據(jù)庫中的所有表羅列出來力喷,如下圖所示刽漂。

當然這里列出的表并不全部都是由我們自己創(chuàng)建的,比如 android_metadata弟孟、sqlite_sequence 這些表就是自動生成的贝咙。但 Glance 并不會對此進行區(qū)分,而是會把它們?nèi)苛_列出來拂募。

接下來點擊 magazine 表庭猩,我們即可查看表中的數(shù)據(jù)。橫向滾動可以查看所有的列没讲,縱向滾動可以查看所有的行眯娱,如下圖所示。

這里對表中的數(shù)據(jù)進行加載使用了分頁技術爬凑,所以即使你的表中有上百萬條數(shù)據(jù)徙缴,也會非常快速地加載出來。而 Glance 的分頁技術是使用 Paging3 實現(xiàn)的于样,對 Paging3 感興趣的朋友可以參考參考這部分的源碼疏叨。

到這里為止,我們就可以非常方便地隨時查看當前應用程序數(shù)據(jù)庫中的數(shù)據(jù)了穿剖。相比于之前還要想辦法導出數(shù)據(jù)庫文件蚤蔓,發(fā)送到電腦上,再借助第三方工具進行查看糊余,是不是簡單了千百倍秀又?

即使相比于 Database Inspector,我認為 Glance 也是有很大優(yōu)勢的贬芥,畢竟你不需要借助電腦吐辙,也不需要打開 Android Studio 才能查看。

另外蘸劈,假如你的數(shù)據(jù)庫文件發(fā)生了變化昏苏,Glance 也可以迅速地感知到。比如我們向當前應用程序的外置存儲空間當中添加一個新的數(shù)據(jù)庫文件威沫,如下圖所示贤惯。

可以看到,當回到 Glance 的可視化界面之后棒掠,迅速就能發(fā)現(xiàn)新增了一個 demo2.db孵构,external storage 表示它是存放在空間存儲空間下的。

然后我們就可以立刻查看 demo2.db 當中的全部數(shù)據(jù)了句柠。

那么關于 Glance 的用法介紹到這里大概就差不多了浦译。因為畢竟它的主要功能就是一個輔助型的工具,并不是什么需要去開發(fā)和對接的庫溯职,所以整體用法是非常簡單的精盅。

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

首先,Glance 只提供對數(shù)據(jù)庫進行查看的功能僻族,并不提供修改和刪除的功能粘驰。當然之所以不支持修改和刪除,并不是因為什么其他特殊的原因述么,純粹只是因為我沒時間蝌数。為了能趕在今年內(nèi)上線第一個版本,我選擇了只開發(fā)了最核心的查看功能度秘。

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

第二,Glance 只支持使用 AndroidX 架構(gòu)的項目唆貌,并且未來也只會支持 AndroidX 架構(gòu)滑潘。如果你的項目還在使用 Support Library 架構(gòu),那么很遺憾锨咙,你將無法使用 Glance语卤。

關于這個限制我其實思考了很久,因為本身查看數(shù)據(jù)庫功能和 AndroidX 架構(gòu)一點關系都沒有酪刀。但是我在 Glance 當中使用了大量最新的 Google 技術粹舵,如協(xié)程、Paging3蓖宦、App Startup 等等齐婴,這些新技術都是只支持 AndroidX 架構(gòu)的油猫。那么到底是為了更好的兼容性而不使用這些新技術稠茂,還是為了讓 Glance 更具有學習意義而使用這些新技術,我最終選擇了后者情妖。

另外我相信睬关,AndroidX 終將是趨勢,即使現(xiàn)在還在使用 Support Library 的項目毡证,在不久的將來也必然會轉(zhuǎn)換到 AndroidX 架構(gòu)上电爹,所以對此我并不是很擔心。

好了料睛,關于 Glance 第一個版本的所有介紹就到這里丐箩。也很高興我將今年定下的最后一個小目標也實現(xiàn)了,這一年真的可以說是收獲滿滿恤煞。

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

github.com/guolindev/G…

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市玉吁,隨后出現(xiàn)的幾起案子照弥,更是在濱河造成了極大的恐慌,老刑警劉巖进副,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件这揣,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機曾沈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門这嚣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人塞俱,你說我怎么就攤上這事姐帚。” “怎么了障涯?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵罐旗,是天一觀的道長。 經(jīng)常有香客問我唯蝶,道長九秀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任粘我,我火速辦了婚禮鼓蜒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘征字。我一直安慰自己都弹,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布匙姜。 她就那樣靜靜地躺著畅厢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪氮昧。 梳的紋絲不亂的頭發(fā)上框杜,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音袖肥,去河邊找鬼咪辱。 笑死,一個胖子當著我的面吹牛昭伸,可吹牛的內(nèi)容都是我干的梧乘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼庐杨,長吁一口氣:“原來是場噩夢啊……” “哼选调!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起灵份,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤仁堪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后填渠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弦聂,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡鸟辅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了莺葫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匪凉。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖捺檬,靈堂內(nèi)的尸體忽然破棺而出再层,到底是詐尸還是另有隱情,我是刑警寧澤堡纬,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布聂受,位于F島的核電站,受9級特大地震影響烤镐,放射性物質(zhì)發(fā)生泄漏蛋济。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一炮叶、第九天 我趴在偏房一處隱蔽的房頂上張望碗旅。 院中可真熱鬧,春花似錦悴灵、人聲如沸扛芽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至登下,卻和暖如春茫孔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背被芳。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工缰贝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人畔濒。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓剩晴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親侵状。 傳聞我的和親對象是個殘疾皇子赞弥,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容