访问 Android 设备上的内部数据






4.92/5 (11投票s)
本文将介绍如何使用 adb 和 Linux 命令从 Eclipse DDMS 的角度探索 Android 内部数据。
前言
在本教程中,我将解释如何使用 Eclipse DDMS 视角查看您的 Android 内部文件。
我将简要介绍 Linux 文件权限以及 **adb** 工具的基本用法,并为 Windows 用户提供图示示例;然而,其他操作系统的用户也可以从中受益,因为概念是相同的。
风险
如果您不清楚自己在做什么,更改文件权限可能会非常危险。一旦将文件/目录对“所有人”开放,其他人就可以查看甚至修改它(取决于权限类型)。
我鼓励您仅对您的应用程序包目录进行更改。完成后,请将您更改的所有文件的默认权限恢复。
注意安全。
Eclipse DDMS
要在 Eclipse 中查看 Android 内部设备文件,您需要打开 DDMS 视角。
如果您还没有“Java”和“Debug”选项卡旁边的“DDMS”选项卡,请按照以下步骤操作:
(在 Eclipse 主菜单栏中)
Window -> Open Perspective -> DDMS
文件浏览器
在 DDMS 中,转到“File Explorer”选项卡,单击后您应该会看到文件夹列表。
有一个名为 _data_ 的目录是我们要关注的。
如果您无法在 Eclipse 中打开 _data_ 文件夹,则意味着您没有相应的权限。
因此,我们需要获取此权限才能访问它。
使用 Android adb
什么是 Android adb?
Android **adb** (Android Debug Bridge) 是 ADT (Android Development Tools) 的一部分,它是一个命令行工具,可让您与已连接的 Android 设备通信;它可以是模拟器或真实硬件设备。
打开 adb
**adb** 工具位于您的 SDK 位置下的 _platform-tools_ 目录中。
[您的 SDK 目录路径]\platform-tools
以我为例
C:\android_sdk\platform-tools
为了开始与 **adb** 集成,您需要在该目录中打开一个 CMD(Windows 命令提示符)。
您可以简单地按 [SHIFT + 右键单击] 并从菜单中选择 [在此处打开命令窗口] 选项,或者导航到您的路径。
adb 的基本集成
所有 **adb** 命令都将通过 **adb shell** 前缀执行,这表明我们将使用 Linux shell 功能。
最基本的命令是查看已连接设备的列表。
只需键入“adb devices
”。
如果您没有连接任何设备或启动模拟器,您将收到一个空响应。
但是,如果您连接了设备或启动了模拟器,您将收到一个与我的类似的响应。
输出格式如下:
[序列号] [状态]
其他常用 adb 命令
adb kill-server
- 停止集成端口守护进程adb start-server
- 启动集成端口守护进程adb pull
– 从 Android 获取指定文件到您的计算机adb push
– 将指定文件从您的计算机推送到 Androidadb install
– 在您的 Android 设备上安装软件包adb uninstall
– 从您的 Android 设备卸载软件包
还有许多其他 **adb** 命令和功能,例如 sqlite 命令等。
理解 Linux 文件权限
如果您查看 Eclipse 中的“File Explorer”选项卡,您会注意到每个文件都有一个权限值。
Linux 文件权限约定
如您所见,每个文件的权限值由 10 个字符表示,这实际上是 10 位。
第一个字符标识文件类型。
Linux 文件类型编码
d
– 目录文件c
– 字符设备b
– 块设备s
– 本地域套接字p
– 命名管道l
– 符号链接-
– 普通文件
这些是 Linux 文件类型;您不需要全部理解它们。在本教程中,我们将只检查普通文件类型(用‘-
’字符表示)和目录类型(用‘d
’字符表示)。
文件权限概述
权限值中的第一个字符是文件类型;接下来的 9 个字符表示文件权限。
例如,我们有一个文件,其权限值为:-rwxrwxrwx
我们可以立即得知它是一个普通文件,因此第一个字符是(-
)。
其余 9 个符号分为 3 部分:
- 用户权限 – 这是文件创建者(文件所有者)的权限。
- 组权限 – 在 Linux 中,每个文件或目录都属于一个组。属于该组的任何人对该文件都具有这些权限。
- 所有人权限 – 此权限授予所有人。
在我们的示例中,该特定文件对所有者、组和所有人(即所有人)都具有 rwx
(读/写/执行)权限。
文件权限值
正如我们已经说过的,权限值由 3 组构成。
DDMS 中看到的数值是人类可读格式,但其背后是二进制值。
---
: 二进制值:000
, 八进制值:0
--x
: 二进制值:001
, 八进制值:1
-w-
: 二进制值:010
, 八进制值:2
-wx
: 二进制值:011
, 八进制值:3
r--
: 二进制值:100
, 八进制值:4
r-x
: 二进制值:101
, 八进制值:5
rw-
: 二进制值:110
, 八进制值: 6rwx
: 二进制值:111
, 八进制值:7
如果您对文件具有 rwx
(读/写/执行)权限,实际标识该权限的位将是二进制值 111
,在八进制系统中为 7
(如上表所示)。
data/data 目录
名为 _data_ 的目录包含您的 Android 操作系统的主要数据。
再往下一级,有一个名为 _data/data_ 的目录,所有已安装的应用程序都位于此处,以及它们的内部文件,例如数据库等。
使用 adb 更改文件权限
在我的例子中,如果您查看我从 DDMS 文件浏览器截取的快照,_data_ 目录的权限是:drwxrw—x
drwxrw—x
意味着:
- 文件类型:
d
(目录), - 所有者权限:
rwx
(读/写/执行), - 组权限:
rwx
(读/写/执行), - 所有人权限:
--x
(仅执行),不能读取目录的内部数据,或写入其中。
当我们使用 Eclipse DDMS 时,我们被视为具有所有人权限的用户。这就是为什么我们需要获取 _data_ 目录的读写权限才能访问它或进行更改。
使用 chmod 命令
chmod
是一个 Linux 命令,它根据传递的模式更改指定文件或目录的模式(文件权限)位,该模式可以是符号值或八进制值,代表新模式的位模式。
* 在本教程中,我们将在 chmod
命令实现中使用八进制值,但如果您愿意,可以轻松将其更改为符号表示。
步骤
- 在 _[SDK location]\platform-tools_ 目录中打开 CMD,如我之前所述。
- 输入
chmod
命令。adb shell su -c "chmod 777 /data"
如果从 adb 收到“Permission denied
”,请确保您已在开发者选项菜单中允许 adb 与设备交互。
如果您的设备已 root 并已连接,您现在将看到 _data_ 文件夹的权限已更改为 –rwxrwxrwx
。
让我们看看我们刚才做了什么。
我们输入的命令:adb shell su -c "chmod 777 /data"
su
- 告诉 adb shell 我们正在以 root 用户身份执行命令。-c
– 是su
命令选项,它告诉su
在同一行执行紧随其后的命令。“chmod 777 /data”
– 告诉为 _data_ 目录授予777
权限,777
是一个八进制数,代表所有三个部分(所有者、组、所有人)的rwx
(读/写/执行)权限。
就是这样!现在我们可以从 Eclipse 的 DDMS 访问 _data_ 目录了。
我们需要访问 _data/data_ 目录,所以还有一个级别需要授予权限。
请注意,_data/data_ 的权限是 drwxrwx--x
。现在我们将为 _data/data_ 目录授予 rwx
的所有人权限。
输入:adb shell su -c "chmod 777 /data/data"
现在我们可以看到 data/data 的权限已更改为 –rwxrwxrwx
值,并且我们可以进入。
在此(_data/data_ 目录中),您可以看到设备上已安装的所有应用程序目录,它们以软件包名称显示。
例如
如果您在设备上安装了 Mozilla Firefox,列表中将有一个名为 _com.mozilla.firefox_ 的目录。
如果您启动了名为“net.tutorial.crypto
”的应用程序,您也会在列表中看到该目录。
由于下面的权限是 drwxr—x
,您需要为每个文件夹及其内部文件执行相同的 chmod
命令。
访问特定应用程序的内部文件
假设我安装的应用程序的软件包名称为 net.tutorial.crypto
,默认权限值为 drwxrwx—x
。
为了访问它,我将运行此命令:
adb shell su -c "chmod 777 /data/data/net.tutorial.crypto"
这将把权限更改为 drwxrwxrwx
值。
为了访问文件文件夹,我将在 chmod
命令中指定所需的目录名称。
adb shell su -c "chmod 777 /data/data/net.tutorial.crypto/files".
现在您可以看到文件目录中有一个名为 classified_file.txt 的文件,其权限为 –rw-------
。为了获取相应的权限,我将执行 chmod
命令,如下所示:
adb shell su -c "chmod 777 /data/data/net.tutorial.crypto/files/classified_file.txt".
由于 classified_file.txt 的权限已更改为 –rwxrwxrwx
,我可以将其从设备拉取并在我的 PC 上进行探索。
Pull 命令
约定:adb pull <远程路径> <本地路径>
(将文件从 Android 设备复制到本地计算机)
我决定将其拉取到我的 _Download_ 文件夹。
adb pull /data/data/net.tutorial.crypto/files/classified_file.txt C:\Users\Pavel\Downloads
您也可以使用 Eclipse GUI 按钮“Pull a file from the device”,该按钮具有相同的功能。只需选择所需文件并单击按钮。然后选择目标,最后保存。
摘要
Android 是一个基于 Linux 的操作系统,因此要访问其内部文件,您需要对这些文件拥有相应的权限。
我们使用 **adb** 工具,通过该工具使用 chmod
Linux 命令授予了我们所需文件的权限,并在 Eclipse DDMS 中进行了探索。
**adb** 是我在开发 Android 平台时遇到的有用工具之一。利用它的功能可以为您节省大量时间和精力。请考虑进一步阅读 Android 文档。
希望它有所帮助。
历史
- 2014 年 10 月 4 日:初始版本