关于Android Device Monitor有关问题
如何使用Android Device Monitor工具
我使用Android studio 3.6版本工具开发Android,在需要使用Android Device Monitor工具时,我却没有找到Android Device Monitor,去官网搜索才知道,谷歌把Android studio 3.x版本开始就弃用了,所以我只能到配置的SDK的工具里找Android Device Monitor。
打开Android Device Monitor
首先打开自己配SDK的目录里找到tools目录下的monitor.bat
如果打开monitor.bat出错,则可能是你的jdk版本过低,把jdk版本升级。
如果无法打开adb shell,则是你的SDK环境没有配好,需要到环境变量的path里添加
所有都弄好了则能够打开Android Device Monitor
在打开Android Device Monitor时出现:
一般是8700端口被qq或者其他程序占用才提示,想要知道的话就使用netstat命令去查看是那个程序占用端口,然后再将程序关掉就行了。
设备 Offline, File Explorer 空空如也
打开 Android Device Monitor 之后,发现里面什么都没有,左边的面板上显示了一台模拟器,但出于 offline 状态,不对呀,我的模拟器命名开着的呀,它正在运行我刚刚写的 app 呢,怎么这里会显示离线状态呢?于是我试着 Google 去找解决方案。
在 StackOverflow 上我发现了有人和我一样也碰到了这个问题,不过底下的回答寥寥无几,我找到了一个最高赞的答案(其实也就一个赞…),如下图所示,他的意思是他也不明白其中的具体原理,但是他发现如果先打开 Android Device Monitor,然后再运行模拟器,就可以解决这个问题。
于是我按照这个方法尝试,先打开 Android Device Monitor,里面什么也没有,然后打开模拟器,随着模拟器的启动,Monitor 左侧面板出现了 offline 的模拟器,然后再相继启动很多服务,最后就显示为 online 了,如下图所示,这样我们就可以通过 Monitor 中的 File Explorer 标签访问模拟器中的文件了。
文件导入
如果选择的目录它的权限不够,无法打开或者导入文件,openFileOutput() 方法生成的文件存放在一个默认路径,即 /data/data/(package name)/files 下。由于我的包名是 com.knightaoko.filepersistencetest,所以在下文的叙述中,大家看到这个陌生的字符串不要惊讶,实际操作下替换成你自己的包名即可。(这期间还碰到个问题,好像 Android Device Monitor 不能和 Instant Run 同时运行,所以在此需要把 Instant Run 功能关闭,怎么关闭大家自行 Google,很简单的。)于是,下一步当然是打开这个路径了,找到 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 shell 是打开 adb 外壳程序。
su 是获取 root 权限,只有 root 权限才能修改文件的访问权限。
但是我们使用su获取root权限时,则无法获取:
经过查阅,是系统镜像的原因,需要选择target栏中为(Google APIs)的镜像才能使用root用户
通过 adb shell 获取文件访问权限
底下一堆 chmod 777 是把对应的文件或文件夹的访问权限的后 9 位设置成 rwxrwxrwx,777 就三个二进制 111, 喝起来就是 111111111(9 个 1),即相当于把后 9 位访问权限都置 1,于是就成了 rwxrwxrwx,即所有用户都具有该文件的全部访问权限。我们来看看结果:
文件导出
可以看到这些目录都能访问了,可以在包名目录下看到生成的 data 文件了,下一步我们想把这个文件复制到我们的电脑里,怎么操作呢?选中该文件,点击右上角的 pull 图标即可,如下图所示:
点击之后,选好保存路径。结果我们发现文件并没有保存下来,在 Console 窗口还提示了错误:
意思就是拉取文件失败,因为你无权进行该操作。又是一脸懵逼,怎么办?还能怎么办,继续 Google 呗!这里我找了很久,终于发现了解决方案:adb root 。没错,在命令行输入这条语句,完美解决!(注意是在 windows 下的命令行,而不是 adb shell 里,当然前提是你添加了 adb 的目录到你的环境变量里)
然后我们再来 pull 一下,卧槽,崩溃了,又发现问题了:Failed to pull selection。这个问题是因为我们没有选中。我们重新选择一下 Android Device Monitor 左侧面板的设备即可,没错!就是把下图红框中国的玩意儿点一下。