直接修改Android软件数据库来改变软件设置实例一则
昨天把K860i刷了机,刷到了最新的CyanogenMod
10.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和Mac
OSX都已经自带了这个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里面的adb
shell进入到手机的终端,直接进入对应的目录便可以直接用sqlite3(Android也自带了这个)更新数据库文件,这样到底是更方便了还是更麻烦了,大家自己可以尝试一下。
本文仅做抛砖引玉,类似的直接修改数据库的还有很多方案,遇到有些问题实在无法解决时,可以尝试用这个来试试看。
直接修改Android软件数据库来改变软件设置实例一则的更多相关文章
- Android系统移植与调试之------->如何修改Android默认字体大小和设置里面字体大小比例
因为我修改 ro.sf.lcd_density的值,将它从160修改 为120,所以导致整个系统的字体都变得很小.因此需要将整个字体变大,并且在设置-->显示-->字体大小的4个选项的值都 ...
- android开发之-软件设置保存-快速学会使用SharedPreferences篇-实测
我们在设计软件的时候,需要记录软件设置的基本信息,那么怎么来保存他们呢?我们可以使用SharedPreferences. SharedPreferences是一个xml文件,用来存储软件的常规设置 ...
- 修改Android中strings.xml文件, 动态改变数据
有些朋友可能会动态的修改Android中strings.xml文件中的值,在这里给大家推荐一种简单的方法.strings.xml中节点是支持占位符的,如下所示: <string name=&qu ...
- 【转】修改Android解锁界面
背景 先说说背景吧,这是本人从WinCE系统转到Android之后,接到的第一个任务就是修改Android原生的解锁界面,之前看了两个星期的书和网络博客,Java的也有.Android应用开 ...
- Android ListView的item背景色设置以及item点击无响应等相关问题
Android ListView的item背景色设置以及item点击无响应等相关问题 在Android开发中,listview控件是非常常用的控件,在大多数情况下,大家都会改掉listview的ite ...
- Android系统移植与调试之------->如何修改Android手机NFC模块,使黑屏时候能够使用NFC
我们都知道在不修改源代码的情况下,只能是解锁之后才能使用NFC功能.而在锁屏和黑屏2个状态下是没办法用NFC的,但是最近有个客户要求手机在黑屏状态下能够使用NFC,因此我们需要去修改Android源代 ...
- iTOP4418开发板7寸屏幕Android系统下横竖屏设置
Android系统屏幕旋转设置 平台: iTOP4418开发板+7寸屏幕 1. Androd4.4源码可以编译成手机模式和平板模式,讯为iTop4418 开发平台的Android系统默认编译为平板模式 ...
- 修改Android源码实现原生应用双开,应用多开
1. 准备 把某系统双开的两个app的信息进行对比 1.1 目录的对比 1.1.1 data目录对比 原应用: /data/user/0/com.luoyesiqiu.crackme/files 被复 ...
- Android Studio(五):修改Android Studio项目包名
Android Studio相关博客: Android Studio(一):介绍.安装.配置 Android Studio(二):快捷键设置.插件安装 Android Studio(三):设置Andr ...
随机推荐
- spring中操作mysql数据库
就是在spring中,对mysql数据库进行增删改查的样例,很easy. 文件结构 maven的pom.xml文件,里面用到的几个很重要的jar包都有 <project xmlns=" ...
- 轻松学习JavaScript二十二:DOM编程学习之节点操作
DOM编程不只能够查找三种节点,也能够操作节点.那就是创建,插入,删除.替换和复制节点.先来看节点 操作方法: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQ ...
- CMD应用 qtp/winshell/cmd的交互
=================================================================== '採用windows.shell的 sendkeys 方式: s ...
- 【Unity】近期整理Unity4.x 项目升级Unity5.0 过程中出现的各种常见问题,与大家共享。
近期整理Unity4.x 项目升级Unity5.0 过程中出现的各种常见问题,与大家共享. 1:Unity4.x 项目中3D模型其材质丢失,成为"白模"? 解决方式:手 ...
- android取高度
Rect rect = new Rect(); getWindow().getDecorView().getWindowVisibleDisplayFrame(rect); int top = r ...
- OpenGL编程逐步深入(八)伸缩变换
准备知识 伸缩变换非常简单,它的目的是增大或者缩小对象的尺寸.例如:你可能希望用同一个模型创建不同大小的对象(例如形状相同,但大小不同的树木)或者你想改变对象的大小使它和游戏场景匹配.这些例子中你可能 ...
- Servlet监听器及在线用户
Servlet中的监听器分为三种类型Ⅰ 监听ServletContext.Request.Session作用域的创建和销毁 (1)ServletContextListener (2)HttpSessi ...
- 51Nod 天堂里的游戏
多年后,每当Noder看到吉普赛人,就会想起那个遥远的下午. Noder躺在草地上漫无目的的张望,二楼的咖啡馆在日光下闪着亮,像是要进化成一颗巨大的咖啡豆.天气稍有些冷,但草还算暖和.不远的地方坐着一 ...
- 洛谷 P2147 [SDOI2008]洞穴勘测 LCT
Code: #include <cstdio> #include <algorithm> #include <string> #include <cstrin ...
- Https个人总结
花了一个星期终于搞懂了.. HTTPS个人总结: 一.RSA算法 公钥:可以分发给任意的钥匙 私钥:自己保留起来,不分发给别人的钥匙 RSA算法: 找出质数p.q n = p*q Φ(n)=(p-1) ...