65.9K
CodeProject 正在变化。 阅读更多。
Home

访问 Android 设备上的内部数据

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (11投票s)

2014年10月4日

CPOL

9分钟阅读

viewsIcon

107243

本文将介绍如何使用 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 命令实现中使用八进制值,但如果您愿意,可以轻松将其更改为符号表示。

步骤

  1. 在 _[SDK location]\platform-tools_ 目录中打开 CMD,如我之前所述。
  2. 输入 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 日:初始版本
© . All rights reserved.