为什么在使用adb时会拒绝访问数据文件夹?

我使用adb和以下命令连接到了现场设备:

C:\>adb -s HT829GZ52000 shell $ ls ls sqlite_stmt_journals cache sdcard etc system sys sbin proc logo.rle init.trout.rc init.rc init.goldfish.rc init default.prop data root dev $ cd data cd data $ ls ls opendir failed, Permission denied 

我很惊讶地发现我拒绝了。 我怎么不能像这样使用命令行浏览目录?

我如何在手机上获得root权限?

有两件事情要记住,如果你想浏览设备上的一切。

  1. 您需要拥有具有root用户权限的手机才能浏览Android手机上的数据文件夹。 这意味着要么有一个开发人员设备( ADP1或来自Google I / O的ION ),要么您已经find了一种方法来以其他方式“root”您的手机。
  2. 您需要以root模式运行ADB,通过执行: adb root来执行此操作

从API级别8(Android 2.2)开始,对于可debugging应用程序(由Android Studio构build的应用程序,除非需要发布构build版本),则可以使用shell run-as命令来运行特定命令或可执行文件用户/应用程序或只是切换到您的应用程序的UID ,以便您可以访问其数据目录。

列出yourapp的目录内容:

 run-as com.yourapp ls -l /data/data/com.yourapp 

切换到com.yourapp的 UID并使用该uid运行所有进一步的命令(直到您调用exit ):

 run-as com.yourapp cd /data/data/com.yourapp ls -l exit 

注1 :一些HTC Desire手机有一个已知的问题 。 由于/data/data目录的非标准所有者/权限, run-as命令无法在这些电话上运行。

注2 :正如@Avio的评论所指出的那样: run-as在运行Cyanogenmod的任何版本(从7到10.1)的三星Galaxy S手机中也存在问题,因为在这个平台上/data/data/datadata的符号链接。 解决这个问题的一种方法是用实际的目录replace符号链接(不幸的是,这通常需要root权限)。

在我们开始之前,你有一个根深蒂固的电话? 如果不是的话,我强烈build议你跳转的时间到了。 99%的帮助你做到这一点的教程要求你有一个根深蒂固的手机(我知道B / C我花了大约一个小时寻找一种方式来做到这一点,没有一个根深蒂固的手机..找不到任何.. )如果你考虑一下,你的iPhone也必须根植于做同样的事情。 所以这是完全合理的。 更多关于生根的答案。

从你的命令行input:

 adb shell 

这将把你带到你的android shell命令行(你应该看到这样的东西: shell@android:/ $ now type:

 shell@android:/ $run-as com.domain.yourapp 

这应该直接带你到com.domain.yourapp的数据目录:

 shell@android:/data/data/com.domain.yourapp $ 

如果没有(例如,如果出现错误),那么您可能没有固定电话,或者您没有使用root用户权限。 要使用root用户权限,请在adb命令行键入su并查看会发生什么情况,如果出现错误,则说明您的电话没有根。 如果不是,请先根据它,然后继续这些说明。

从那里你可以键入ls ,你会看到所有的目录,包括dbs:

 shell@android:/data/data/com.domain.yourapp $ ls cache databases lib shared_prefs 

之后,你可以使用sqlite3来浏览dbase ..如果你没有安装它(你可以通过键入sqlite3find它,如果你command not found那么你将不得不安装它。说明在这里 。

关于生根:如果你之前从来没有植根过你的手机,而且你担心这个问题,那么我可以充满信心地告诉你,没有什么可担心的。 有很多快速和容易的手机生根教程,几乎所有的新旧模式, 即使你有一个mac (我根据我的s3我的mac), 你可以根植你的手机

我尝试在根植的三星Galaxy S上运行时遇到了类似的问题。从计算机shell发出命令

 > adb root 

失败并显示消息“无法在生产版本中作为root运行”。 这是一个简单的方法,允许成为根。

而不是以前,一个接一个地发出以下两个命令

 > adb shell $ su 

在第一个命令之后,如果提示符从'>'更改为'$',如上所示,这意味着您已经进入了adb shell环境。 如果随后在发出第二个命令后提示已经改为“#”,这意味着你现在是root。 现在,作为根,你可以做任何你想要的设备。

要切换回“安全”的shell,问题

 # exit 

您将看到提示符“$”再次出现,这意味着您作为用户而不是root用户在adb shell中。

$ adb shell

$ cd / data

$ ls

opendir失败,权限被拒绝


你应该做这个:

 $ adb shell $ cd /data shell@android:/data $ run-as com.your.package shell@android:/data/data/com.your.package $ ls 

好!

我也遇到了很多麻烦。 我仍然不完全理解权限和root运行,但是这对我(以前的部分答案之一)是从/ data / data / [package name] /databases/my_db.db复制数据库文件。 由于某种原因,运行shell根su在shell中不起作用,也没有复制数据库文件(我可以导航到目录),也没有sqlite3

所以,这工作! 在DOS命令提示符下:

 C:\Program Files\Android\android-sdk\platform-tools>adb shell 1|shell@android:/ $ run-as de.vogella.android.locationapi.maps run-as de.vogella.android.locationapi.maps 1|shell@android:/data/data/de.vogella.android.locationapi.maps $ cd /data cd /data shell@android:/data $ cd data cd data shell@android:/data/data $ cd de.vogella.android.locationapi.maps cd de.vogella.android.locationapi.maps shell@android:/data/data/de.vogella.android.locationapi.maps $ cd databases cd databases shell@android:/data/data/de.vogella.android.locationapi.maps/databases $ ls ls bus_timetable_lines.db bus_timetable_lines.db-journal shell@android:/data/data/de.vogella.android.locationapi.maps/databases $ cat bus _timetable_lines.db > /sdcard/db_copy.db bus_timetable_lines.db > /sdcard/db_copy.db < shell@android:/data/data/de.vogella.android.locationapi.maps/databases $exit ^ exit shell@android:/ $ exit exit C:\Program Files\Android\android-sdk\platform-tools> 

现在进入SDCARD目录并获取文件db_copy.db。 即使这是隐藏的,但我设法给它发电子邮件。 回到Windows,我可以用SQLite数据库浏览器打开数据库文件。 🙂

以下是获取root访问权限的两个步骤:

  1. 你的android设备必须被植入。
  2. 在ADB shell中inputsu,android设备会提示y / n? 你select允许。

问题可能是我们需要在最新的CM中的开发选项中明确给出adb root权限。以下是我所做的。

abc @ abc-L655:〜$ sudo adb kill-server
abc @ abc-L655:〜$ sudo adb root start-server *守护程序没有运行。 从端口5037开始* *守护程序启动成功*系统设置禁用根访问 – 在设置中启用 – >开发选项

在改变发展select之后…

 abc@abc-L655:~$ sudo adb kill-server abc@abc-L655:~$ sudo adb root start-server * daemon not running. starting it now on port 5037 * * daemon started successfully * restarting adbd as root abc@abc-L655:~$ adb shell root@android:/ # ls /data/ .... good to go.. 

生产版本无法进入/数据/应用程序

 drwxrwx--- system cache 1970-01-01 08:00 cache drwxrwxr-x root system 1970-01-01 08:00 mnt drwxrwx--x system system 1970-01-01 08:15 data 

可能需要改变权利人来操作它。

如果你知道应用程序包,你可以直接cd到该文件夹​​..

例如cd data/data/com.yourapp

这将使您进入一个read/writable的目录,以便您可以根据需要更改文件。 由于emulator上的文件夹相同,因此可以使用该文件夹来获取文件夹path。

如果没有root设备,可以通过以下命令访问文件:cmd截图:

  1. 根据您的用户使用platform-tools文件夹中的cmd启动adb

     cd C:\Users\YourUserName\AppData\Local\Android\sdk\platform-tools 

    它可以在另一个文件夹取决于你在哪里安装它。

  2. 显示工作设备。

     adb devices 

    比如说命令的响应

     List of devices attached 0123456789ABCDEF device 
  3. 编写命令

      adb -s 0123456789ABCDEF shell "su" 

    它会打开

      root@theDeviceName:/ # 

4.访问文件,列出所有文件

 ls 

所以在chang目录中的任何其他地方像数据文件夹

 cd data/data 

当你在设备的shell目录下。 赶紧跑

 su - root 

那么你应该可以访问数据/文件夹。