一
大概是在今年 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居扒,謝謝大家概漱。
如果想要學習 Kotlin 和最新的 Android 知識,可以參考我的新書《第一行代碼 第 3 版》喜喂,點擊此處查看詳情瓤摧。