本文参考自CSDN文档《Android Device Monitor 文件管理的常见问题》
最近在看《第一行代码》(第二版)中关于数据存储方案的介绍。数据的状态分为两种:瞬时状态和持久状态,一般保存在内存中的数据随着活动的关闭,数据也就销毁了,如果我们想保存这些数据,该怎么办呢?书中介绍了三种实现数据持久化的方法,分别是:文件存储,SharedPreference 存储以及数据库存储。
在学习第一种数据持久化方法文件存储的时候,我们通过 Context 类中的 openFileOutput() 方法创建一个指定了保存路径的 FileOutputStream 对象 out,然后用这个 out 对象去创建一个 OutputStreamWriter 对象,之后再用这个 OutputStreamWriter 对象创建一个 BufferedWriter 对象 writer,我们就是通过这个 writer 的 write() 方法向文件输出流写入我们想要保存的数据的。文件写入数据之后默认保存在 /data/data/(package name)/files 目录下。我们可以通过 Android Studio 中的 Android Device Monitor 去查看,Android Device Monitor 的打开方法如下所示。
openFileOutput() 方法生成的文件存放在一个默认路径,即 /data/data/(package name)/files 下,
于是,下一步当然是打开这个路径了,找到 data,点击,没反应,再点击,还是没反应。又遇到问题了,我无法访问 data 目录,通过 Google 搜索可以知道了 File Explorer 中的每个文件和文件夹都是有访问权限的,如下图红框中标识的就是 data 文件夹的访问权限。
访问权限是 drwxrwx--x,这玩意是什么意思呢?我相信,学过 Linux 的同学肯定一眼就知道这是什么意思。这一个字符串一共有 10 个字符,第一个字符表示是文件夹还是目录,如果第 1 个字符是 d,则表示是文件夹。后面 9 个字符可以分为三组,第一组 rwx 表示所有者(user)对文件的访问权限,r 表示可读(read),w 表示可写(write),x 表示可被执行,- 表示没有该权限;第二组 rwx 表示组群(group)对文件的访问权限;第三组 --x 表示其他人(other)对文件的访问权限,可以看到,没有 r 和 w,说明 data 对其他人来说是不可读不可写的,怪不得我们不能打开它呢,那怎么办呢?于是我又网上搜啊搜,发现可以通过一定的方法修改文件的访问权限的,对,这个方法就是 adb shell。
adb shell 是 Android SDK 中的一个工具,你可以在你的 Android SDK 目录下的 platform-tools 找到它,下图就是我电脑上的该目录:
我们需要将这个目录添加到环境变量,为的是后面在命令行直接调用 adb 中的命令。比如在此我将 D:\AndroidSDK\platform-tools 添加到环境变量(具体怎么添加可以看百度教程——如何添加环境变量)。随后可以根据参考文档进行操作便可以了。
注意这里不能加分号!!!
并且点击确定之后即可生效,无需重启PC!!
这里主要说一下几个问题:
1.如图,adb版本不匹配:
从报错的原因来看应该是版本不一致导致的,大概的意思是说你现在的adb版本是39,但是你client端的却是36.
总是就是版本不对了不能好好玩耍了,于是我凭借一句关键词“adb工具包官方下载”在百度上翻越山河大海(唉查阅了好多论文和博客,花费了太多时间了,沧桑啊。。。),意识到我们的adb应该要换个版本了!!!
皇天不负有心人终于让我在联想中国的论坛中找到了adb工具包最新2017Google官方版下载地址,这里感谢联想大大了~
下载之后,选中压缩包中的如图的四个文件,覆盖在自己本地的platf-tools目录上对应的文件,在此运行,就没毛病了。。。
2.关于访问/data/data/..的权限问题,其实如果没有特定的必要的话,可以通过genymotion平台,使用版本在Android6.0以下的手机,即可规避各种权限问题(adb shell直接为root,同时也可直接访问/data/data/.. 路径!!!无须前面各种繁琐的操作了):
可见CSDN某参考文档
一开始采用的Android Studio安卓模拟器的版本是根据所学习的教程推荐的Android 7.0。
但是,Android 7.0的模拟器是没有root权限的!
所以只需要重新安装一个非Android 7.0版本的模拟器(可以通过genymotion平台,使用版本在Android6.0以下的手机),如Android 6.0,或者连接一台获得了root权限的安卓设备
运行后会发现,当进入adb shell后,命令提示符里前缀就已经变成了:
root@generic_x86:/ #
带有root权限的adb shell
那也就不需要su命令了,可以直接访问所有的文件,问题就解决了。