读《第一行代码——Android(第 2 版)》的时候遇到了这样一个问题,在数据持久化方法之文件存储的章节,代码通过 Context
类中提供的 openFileInput()
和 openFileOutput()
方法以及 Java 的各种流来进行读写操作。
然后系统会在 /data/data/<package name>/files/
目录下创建一个名为「data」的文件,我们可以通过『Android Studio』中的『Android Device Monitor』去查看。
那么问题来了,与书上的介绍不同,我所使用的『Android Studio』并没有『Android Device Monitor』,难道是我打开的方式不对?
我的「Tools」里根本就没有『Android Device Monitor』啊!
后来从 Google 官方文档得知,自『Android Studio』Version 3.0 开始就已弃用了『Android Device Monitor』。
However, most components of the Android Device Monitor are deprecated in favor of updated tools available in Android Studio 3.0 and higher.
但是,大多数 Android Device Monitor 组件已弃用,以支持『Android Studio』Version 3.0 和更高版本中提供的更新工具。
那没有『Android Device Monitor』,要怎么继续下一步呢?
其实进入 Android SDK 的目录看一下可以发现,即使弃用,但 SDK 里面还是提供了『Android Device Monitor』。
可以在命令行中进入 /AndroidSDK/tools/
目录,然后输入 monitor
即可打开。
也可以直接进入到该目录双击文件「monitor.bat」打开。
本以为打开『Android Device Monitor』就可以继续后面的学习了,这未免也太顺利?
按照步骤,我需要进入「File Explorer」标签页到 /data/data/<package name>/files/
目录下去寻找这个名为「data」的文件,但是却发现 /data/
目录根本打不开。
又进入了知识的盲区,赶紧去补了补课。
可以看到,/data
文件夹的 Permissions
是 drwxrwx--x
,这是什么意思?相信学过 Linux 的同学就非常清楚了。因为 Android 的底层是 Linux,所以每个文件夹都是有权限控制的。
具体是什么意思?
这一个字符串一共有 10 个字符,第一个字符表示的是文件类型。d
表示是文件夹,l
表示连接文件,-
表示文件。
后面 9 个字符又可以分为三个元组,每 3 个字符为一个元组。第一个组表示文件所有者(user
)的权限,第二个组表示同组用户(group
)的权限,第三个组表示所有其他用户(other
)的权限。
元组内字符的顺序是 rwx
。
r :read,可读
w :write,可写
x :execute,可执行
- :无该权限
所以,drwxrwx--x
的意思是,没有 r
和 w
,说明 /data
文件夹对其他人来说是不可读不可写的。因此我们则需要修改其对应的权限。
需要用到的是 Android SDK 中的 adb
。
adb
在 /AndroidSDK/platform-tools/
目录下,但是我们不能够通过双击来运行它。
而是需要将 /AndroidSDK/platform-tools/
这个目录添加到环境变量,执行下一步。
接着直接在 CMD
中输入命令:
➜ adb shell
然后按照下图命令继续操作。
解释一下这几个命令:
adb shell :打开 adb 外壳程序
su :切换为超级管理员,即获取 root 权限,只有 root 权限才能修改文件的访问权限
chmod <权限> <文件夹> :为文件夹设置权限
还需要提的是,#
是超级管理员的意思,也就是说可以访问模拟器中的一切数据,而 $
则表示是普通管理员,输入 su
命令的作用就是切换成超级管理员。
命令的前面两项好理解,关于文件夹权限,这一堆 chmod 777
又是什么意思?
是把对应的文件或文件夹的访问权限的后 9 位设置成 rwxrwxrwx
,777
就三个二进制 111
, 合起来就是 111111111
(9 个 1
),即相当于把后 9 位访问权限都置 1
,于是就成了 rwxrwxrwx
,即所有用户都具有该文件的全部访问权限。
按道理到这里就已经获取了权限可以访问对应的文件了,但事情并没有我想象中的那么顺利,文件夹依旧打不开…
我就纳闷了…
不知怎么的突然有个想法,手机可以通过获取 root
权限然后在『RE文件管理器』中查看本地数据库,那么我可不可以直接 root
呢,虽然上面的 su
也是获取 root
权限。
抱着试一试的心态,我在 CMD
中输入了:
➜ adb root
结果,文件夹就真的畅通无阻的被我打开了…
事实上,使用 adb root
并没有修改其 rwx
权限,它只是获取了最高级的操作权,可以看到在执行了 adb root
后,adb shell
中的 $
就已经变成 #
了,无需执行 su
。
如果从一开始就执行 adb root
的话,adb shell
中的相关操作则无需执行,也可以查看到 /data/
目录下的文件。
其他关于『Android Device Monitor』基本可以通过「Reset Perspective」操作或重启解决。
还需要提醒的是,『Android Device Monitor』在『Android Studio』Version 3.1 中已弃用,并在『Android Studio』Version 3.2 中移除了,并提供了新的功能来替代。