该文是去年年尾的文章,现是搬运到掘金上来,跟大家一起分享。
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,谢谢大家。
如果想要学习 Kotlin 和最新的 Android 知识,可以参考我的新书 《第一行代码 第 3 版》,点击此处查看详情。
关注我的技术公众号“郭霖”,优质技术文章推送。