昨天把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软件数据库来改变软件设置实例一则的更多相关文章

  1. Android系统移植与调试之------->如何修改Android默认字体大小和设置里面字体大小比例

    因为我修改 ro.sf.lcd_density的值,将它从160修改 为120,所以导致整个系统的字体都变得很小.因此需要将整个字体变大,并且在设置-->显示-->字体大小的4个选项的值都 ...

  2. android开发之-软件设置保存-快速学会使用SharedPreferences篇-实测

    我们在设计软件的时候,需要记录软件设置的基本信息,那么怎么来保存他们呢?我们可以使用SharedPreferences.   SharedPreferences是一个xml文件,用来存储软件的常规设置 ...

  3. 修改Android中strings.xml文件, 动态改变数据

    有些朋友可能会动态的修改Android中strings.xml文件中的值,在这里给大家推荐一种简单的方法.strings.xml中节点是支持占位符的,如下所示: <string name=&qu ...

  4. 【转】修改Android解锁界面

    背景      先说说背景吧,这是本人从WinCE系统转到Android之后,接到的第一个任务就是修改Android原生的解锁界面,之前看了两个星期的书和网络博客,Java的也有.Android应用开 ...

  5. Android ListView的item背景色设置以及item点击无响应等相关问题

    Android ListView的item背景色设置以及item点击无响应等相关问题 在Android开发中,listview控件是非常常用的控件,在大多数情况下,大家都会改掉listview的ite ...

  6. Android系统移植与调试之------->如何修改Android手机NFC模块,使黑屏时候能够使用NFC

    我们都知道在不修改源代码的情况下,只能是解锁之后才能使用NFC功能.而在锁屏和黑屏2个状态下是没办法用NFC的,但是最近有个客户要求手机在黑屏状态下能够使用NFC,因此我们需要去修改Android源代 ...

  7. iTOP4418开发板7寸屏幕Android系统下横竖屏设置

    Android系统屏幕旋转设置 平台: iTOP4418开发板+7寸屏幕 1. Androd4.4源码可以编译成手机模式和平板模式,讯为iTop4418 开发平台的Android系统默认编译为平板模式 ...

  8. 修改Android源码实现原生应用双开,应用多开

    1. 准备 把某系统双开的两个app的信息进行对比 1.1 目录的对比 1.1.1 data目录对比 原应用: /data/user/0/com.luoyesiqiu.crackme/files 被复 ...

  9. Android Studio(五):修改Android Studio项目包名

    Android Studio相关博客: Android Studio(一):介绍.安装.配置 Android Studio(二):快捷键设置.插件安装 Android Studio(三):设置Andr ...

随机推荐

  1. EularProject 42:单词解码出来的三角形数

    Coded triangle numbers Problem 42 The nth term of the sequence of triangle numbers is given by, tn = ...

  2. 【LeetCode】Longest Palindromic Substring 解题报告

    DP.KMP什么的都太高大上了.自己想了个朴素的遍历方法. [题目] Given a string S, find the longest palindromic substring in S. Yo ...

  3. Swift中NSDictionaryOfVariableBindings的替代方案

    有日子没写东西了,抽点时间练练笔头子,业精于勤荒于嬉~ 近期从OC转到了Swift2,因为Swift一直没有正经学正经用,所以对这门语言的理解基本算是个球...不得不感慨苹果的动作之快.Swift还没 ...

  4. ios xcode真机调试获取屏幕截屏

    非常多时候我们须要在调试的过程中把手机屏幕截图发给其它人看,在android开发中我们能够非常方便的截图保存.而xcode开发ios的时候发现这个需求却如此困难.网上大部分都是介绍的以下这个方案.可是 ...

  5. Hadoop - YARN NodeManager 剖析

    一 概述         NodeManager是执行在单个节点上的代理,它管理Hadoop集群中单个计算节点,功能包含与ResourceManager保持通信,管理Container的生命周期.监控 ...

  6. poj_2187凸包,暴力解法

    #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #i ...

  7. 41.AngularJS 服务(Service)

    转自:https://www.cnblogs.com/best/tag/Angular/ 什么是服务? 在 AngularJS 中,服务是一个函数或对象,可在你的 AngularJS 应用中使用. A ...

  8. 23.STL容器小结

  9. sql的系统关键字的概述

    create proc proc_B as SELECT * FROM [ZkbTest].[dbo].[T_ZKB] exec sp_helptext proc_B select * from sy ...

  10. 归档备份被删,GoldenGate无法抽取数据

    发生错误如下,源端EXTRACT进程异常中止,查看日志,发现如下错误. 2014-07-23 01:32:13  ERROR   OGG-00446  Oracle GoldenGate Captur ...