访问 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– 将指定文件从您的计算机推送到 Android
- adb 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, 八进制值: 6
- rwx: 二进制值:- 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 日:初始版本

