10

我又开发了一个非常好用的开源库,调试Android数据库有救了

 3 years ago
source link: https://blog.csdn.net/guolin_blog/article/details/111120730
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

我又开发了一个非常好用的开源库,调试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的图片,如下图所示。

20201213152744819.png

这个图标就是引入了Glance库之后自动生成的,点击该图标即可打开Glance的可视化界面,如下图所示。

20201213152816574.png

在这里,Glance会自动开始扫描当前应用程序的内置和外置存储空间,将所有的数据库文档全部搜索到,并一一列出。

比如上图中的demo1.db就是我当前项目工程中的一个数据库文件,internal storage表示它是存放在内置存储空间下的。

点击demo1.db,即可打开这个数据库文件,并将该数据库中的所有表罗列出来,如下图所示。

20201213152834145.png

当然这里列出的表并不全部都是由我们自己创建的,比如android_metadata、sqlite_sequence这些表就是自动生成的。但Glance并不会对此进行区分,而是会把它们全部罗列出来。

接下来点击magazine表,我们即可查看表中的数据。横向滚动可以查看所有的列,纵向滚动可以查看所有的行,如下图所示。

20201213152856818.gif

这里对表中的数据进行加载使用了分页技术,所以即使你的表中有上百万条数据,也会非常快速地加载出来。而Glance的分页技术是使用Paging3实现的,对Paging3感兴趣的朋友可以参考参考这部分的源码。

到这里为止,我们就可以非常方便地随时查看当前应用程序数据库中的数据了。相比于之前还要想办法导出数据库文件,发送到电脑上,再借助第三方工具进行查看,是不是简单了千百倍?

即使相比于Database Inspector,我认为Glance也是有很大优势的,毕竟你不需要借助电脑,也不需要打开Android Studio才能查看。

另外,假如你的数据库文件发生了变化,Glance也可以迅速地感知到。比如我们向当前应用程序的外置存储空间当中添加一个新的数据库文件,如下图所示。

20201213152918392.gif

可以看到,当回到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版》点击此处查看详情

关注我的技术公众号,每个工作日都有优质技术文章推送。

微信扫一扫下方二维码即可关注:

20181224140138240.jpg


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK