直接修改Android软件数据库来改变软件设置实例一则

昨天把K860i刷了机,刷到了最新的CyanogenMod10.1,使用起来各种流畅舒服,不过却由于内外置SD卡的挂载点的改变,造成了一些困扰,现记录如下。

       

       平时里由于极少把手机连接到电脑上传文件,除非文件特别多特别大,一般都是通过WIFI网络来把需要的文件传到手机里。原理很简单,就是在手机上建一个FTP服务器,电脑上通过FTP工具把文件传过来即可。如上图就是我经常用的一个小米文件管理器,很简单好用。

       刷机之前用的是官方ROM,它把外置的SD卡挂载在了内置SD卡的某一个目录里,所以小米文件管理默认开启而且在其设置里面无法更新的/mnt/sdcard这个几乎100%的Android设备都存在的目录就在FTP上使用就完全没有问题,虽然麻烦些不过还是可以把文件传到外置SD卡上。

       但是刷机之后问题出现了,这个ROM把内外置SD卡分别挂载到了/storage/sdcard0和/storage/sdcard1上,而默认符号链接/mnt/sdcard到了/storage/sdcard0也就是内置卡,这样一来,直接通过小米文件管理的FTP功能就无法传文件到外置SD卡上了。

       要更改这个也很简单,都想的到直接把这个FTP的家目录更改一下不就得了,关键是这个软件的设置里面没有提供更改FTP家目录的设置。于是我就想到直接修改小米文件管理器的数据来修改FTP的家目录,当然这只是一个想法,尝试一下便知道可不可行,因为如果小米文件管理器没有使用生成的数据来控制FTP家目录而是直接强制指定/mnt/sdcard写在了软件的程序代码里面,那就无法了。后面的事实证明,其还是使用了用户数据写入数据库的方式来存储设置的,结果很完美。下面是解决的过程。


       一些必要的前提知识补充:
       Android系统对于每个安装的软件,都会分配空间,用于储存软件本身和软件数据,软件本身也就是apk文件了,所有用户安装的apk软件都位于/data/app目录,正常方法安装的apk都会在这里以包名显示,如com.tencent.qq.apk。而Android系统会给每个软件分配专用的文件夹用于存放软件运行所需要的数据,如软件设置,从internet上下载的用于显示的内容数据(如微博的内容)等等,每个软件的用户数据都是以包名为目录名,储存在/data/data目录里面。一般意义上的清除某个软件的数据,其实质也就是删除了对应的文件夹里面的内容。
       Android系统的所有数据存储,都使用的是sqlite3数据库,这是一种单文件型的数据库,体积小,提供的API使用方法灵活,所以Android在系统级集成了它,用于所有apk软件的数据存储。它完全符合SQL的ACID原则,一般的软件都会把设置项之类的东西存储在sqlite3数据库中,我们只要找到所需的键值,把它修改成我们所要值就算完成了。
       同时,由于使用的Linux内核,Android系统的文件权限自然是用的Linux的那一套,rwxrwxrwx,以及用户和用户组。对于每个安装的apk软件,系统都会给其分配唯一的用户名和用户组,当然在Android里面这些东西对用户都是透明的,不像桌面Linux系统那样会被用户注意到,所以一般用户也不需要知道这些。


       下面开始进行我们要的操作。

       1、首先就是要找到这个小米文件管理器的包名,因为只有找到了包名我们才能找到它的数据存放在哪里,直接查看它的应用信息,4.2系统很方便地在app名称下面就显示了包名(我记得4.1是没有这个的)。如下图。

       2、找到包名之后我们要进入到其用户数据目录里面,找到数据库文件。果然,在/data/data/com.android.mifileexplorer的database目录里面,我们找到了这个文件,就是它。如下图。


       3、把这个mifileexplorer这个文件拷到/sdcard目录,传到电脑上,以方便我们对其进行操作。

       4、去http://www.sqlite.org官网下载适合于Windows的sqlite3.exe,我们就会用它来对这个数据库文件进行修改。Windows并没有集成这个,Linux和MacOSX都已经自带了这个sqlite3的工具,不需要下载。

       5、下面开始修改(下面会用到标准SQL语句和sqlite3的特殊操作命令)。
       先看一下这个数据库里面有几个表:.tables。
       再看一下所有的表结构是怎么样的:.schema。
       再来看看表里面有没有我们想要的存储的FTP家目录的路径:select * from network。
       果然,从输出的结果,我们看到了remote列有一个值是/storage/sdcard0,我们只要把这个值修改成/storage/,自然FTP的家目录就修改了,那么我们就可以在FTP工具里面直接读写内外置卡了。
       尝试修改这个值:update network set remote='/storage/'。
       再看一下修改成功了没有:select * from network。可以看到,值已经发生了变化。

       到这里修改路径的工作已经完成了一大半了,当然我们看到了还有一个2121的值,这个是小米文件管理器的FTP的端口号,如果有需要的话也可以修改的。
  

       6、现在我们把这个修改好的数据库文件再要放回原处,以验证是否修改成功。
       这里要注意一个重要的地方,如果我们是直接用RE管理器把文件放回原处,一定要改权限和文件的所有者,特别是文件的所有者。上面说过,每个app都会有一个唯一的用户名和用户组,我们用RE管理器是必须在设备获取了ROOT权限之后,以root用户的身份把文件写回原路径的,这样肯定就会产生问题,最直接的表现就是app直接FC了。所以我们可以参照database目录里面其它文件的所有者和权限信息,用RE管理器改成一样的就可以了(图中是u0_a85用户和组)。如下图。



       7、把小米文件管理器从缓存的进程中清理掉,再重新打开它,开启FTP,会看到提示的信息已经变化了,这样就说明已经成功了,在FTP工具里面打开该FTP,可以看到已经可以正常读取到sdcard0和sdcard1了。如下图。

      


       至此,所有工作都已经完成。实际上还可以用一个更简单的方法,把手机连接到PC,用cmd里面的adbshell进入到手机的终端,直接进入对应的目录便可以直接用sqlite3(Android也自带了这个)更新数据库文件,这样到底是更方便了还是更麻烦了,大家自己可以尝试一下。



       本文仅做抛砖引玉,类似的直接修改数据库的还有很多方案,遇到有些问题实在无法解决时,可以尝试用这个来试试看。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章