Android Device Monitor--File Explorer 中的/data/data/..无法访问的问题
本文参考自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 添加到环境变量(具体怎么添加可以看百度教程——如何添加环境变量)。随后可以根据参考文档进行操作便可以了。
这里主要说一下几个问题:
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命令了,可以直接访问所有的文件,问题就解决了。
需要注意的是:
我们要
先打开Android Device Monitor,随后再打开Genymotion的模拟器,
那样模拟器的相关信息才会在Android Device Monitor 中显示出来,不然还是会出现各种奇奇怪怪的错误的!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android测量View宽和高的一般通用方法
Android测量View宽和高的一般通用方法 众所周知Android在onCreate里面如果直接对一个View进行getWidth,getHeight时候,得到到的值全部是0,这样拿不到View的宽和高的值,但有时候又必须在初始化阶段获取一个View的宽和高,现在给出一个基本的通用方法: int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); mAndroidView.measure(w, h); int width = text.getMeasuredWidth(); int height = text.getMeasuredHeight(); mAndroidView即为一般的Android View。 最终测算出来的width和height均为pix值。
- 下一篇
Android谷歌官方的自适应TextView字体大小的解决方案
Android谷歌官方的自适应TextView字体大小的解决方案 有时候UI限定了TextView宽度或者布局的控件空间尺寸不足,而此时的TextView里面的文本就无法完全正常显示。自适应TextView文本大小字体以适应限定宽度的TextView有不少方法,现在给出一种Android官方的自适应字体方法,直接在xml即可自适应。 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="80dp" android:layout_height="wrap_content" android:background="@andr...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS关闭SELinux安全模块
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Windows10,CentOS7,CentOS8安装Nodejs环境
- 设置Eclipse缩进为4个空格,增强代码规范