为啥我在使用 adb 时拒绝访问数据文件夹?

Posted

技术标签:

【中文标题】为啥我在使用 adb 时拒绝访问数据文件夹?【英文标题】:Why do I get access denied to data folder when using adb?为什么我在使用 adb 时拒绝访问数据文件夹? 【发布时间】:2010-11-05 19:29:10 【问题描述】:

我使用 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 访问权限?

【问题讨论】:

简单...确保您的手机屏幕已开启。当它询问您是否希望 Unknown 有权访问 root 时,单击“允许”。完成。 决定创建一个简单的 avd 来访问数据库。有没有人有任何指向指南的链接,没有为开发人员提供“自定义”耀斑和图形?只是如何在购买的设备上获得普通的香草 android 我的 Android 7.1.1 设备上没有出现这样的提示。但是 adb 继续并列出目录的内容。问题是,内容实际上并不存在。我正在使用 adb-sync 添加内容。这很奇怪。 【参考方案1】:

如果您想浏览设备上的所有内容,需要记住两件事。

    您需要拥有具有 root 访问权限的手机才能浏览 Android 手机上的数据文件夹。这意味着要么您拥有开发者设备(ADP1 或来自 Google I/O 的 ION),要么您已经找到了通过其他方式“root”手机的方法。 您需要在 root 模式下运行 ADB,执行以下操作:adb root

【讨论】:

而“adb root”需要自定义构建 adb,否则“adbd 无法在生产构建中以 root 身份运行” 自定义构建 adb?我可以从哪里得到它? 对@Gopinath 问题有任何答案吗? @Gopinath:我相信你必须为目标设备从源代码构建它,配置为允许 root 使用 ndk,然后将其连同二进制文件的映像一起闪存到设备上。 AFAIK,不需要自定义构建 adb。有必要让 adbd 支持以 root 身份运行,但是这个 adbd 在设备上 - 所以无论进行任何修改以使设备具有 root 访问权限就足够了。【参考方案2】:

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

例如cd data/data/com.yourapp

这会将您放入read/writable 的目录中,以便您可以根据需要更改文件。由于emulator上的文件夹是一样的,所以可以用它来获取文件夹路径。

【讨论】:

我可以直接cd到文件夹,但我仍然得到“opendir failed, permission denied”错误。 这是因为adb的“shell”用户对目录有执行权限,但没有读取权限。【参考方案3】:

生产版本无法进入 /data/app

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

可能需要更改为正确的所有者才能操作它。

【讨论】:

【参考方案4】:

从 API 级别 8 (Android 2.2) 开始,对于可调试应用程序(Android Studio 一直构建的应用程序,除非请求发布构建),您可以使用 shell run-as 命令运行命令或可执行文件作为特定用户/应用程序,或者只是切换到应用程序的 UID,以便您可以访问其 data 目录。

列出你的应用的目录内容:

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 手机有一个known issue。由于/data/data 目录的非标准所有者/权限,run-as 命令无法在这些手机上运行。

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

【讨论】:

这就像你在run-as com.mypackage 解释的那样工作。我遇到的问题是sqlite3 /data/data/com.mypackage/databases/mydb 说“sqlite3:权限被拒绝”。 sqlite3只能root运行吗? 在列出存储在内部存储中的文件时,效果非常好。 我必须更改文件的权限才能将其移动到我的 SD 卡,因为我无法将它作为我的应用程序运行。所以,1) 作为 com.package.example 运行,chmod 777 databasefile.db。 2)退出,进入sdcard,cp /data/data/com.package.example/databases/databasefile.db。第 3 步应该是恢复 777 权限 无论我在终端中拼写多么正确,我的包裹都是未知的:( 这应该是标记为正确的答案,因为这是用于无根手机的正确方法。【参考方案5】:

我在尝试在已root的三星 Galaxy S 上操作时遇到了类似的问题。从计算机外壳发出命令

> adb root

失败并显示消息“无法在生产构建中以 root 身份运行”。这是一个允许成为root的简单方法。

代替上一个,依次发出以下两个命令

> adb shell
$ su

在第一个命令之后,如果提示已经从'>'变成了'$',如上图,说明你进入了adb shell环境。如果随后在发出第二个命令后提示符变为“#”,则表示您现在是 root。现在,作为 root,您可以使用您的设备做任何您想做的事情。

要切换回“安全”外壳,请发出

# exit

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

【讨论】:

我收到一个错误,指出“adb root”在生产版本中不起作用。 非常感谢!顺便说一句,你需要有一个有根电话才能做到这一点。您可能还需要 SuperSU 或类似的东西?至少当我尝试使用“su”时,SuperSU 在我的手机上给了我一个对话框。 /system/bin/sh: su: 未找到 谢谢 :) adb shell + su 永远解决了烦人的权限问题。我在 Android 4.3 上遇到了关于 su: not found 的问题,但自从我升级到 4.4.2 后问题就消失了。 4.3好像有问题。 su 对我不可用,Nexus 5 / Android 5.1 - 有解决方法吗?【参考方案6】:

我也遇到了很多麻烦。我仍然不完全理解权限和 root 运行,但这对我有用(部分以前的答案之一)从 /data/data/[package name]/databases/my_db.db 复制数据库文件。出于某种原因在 shell 中运行 shell rootsu 不起作用,复制 db 文件也不起作用(我可以导航到目录),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 数据库浏览器打开 db 文件。 :)

【讨论】:

我试过 -> run-as 但是 adb 没有识别出我的 app_package_name。我使用了我在 AndroidManifest.xml 中指定的 package_name。有什么我想念的吗?【参考方案7】:

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

    您的 android 设备必须是 root。 在 ADB shell 中,输入 su,android 设备会提示 y/n?您选择允许。

【讨论】:

type su.. 将在移动设备上给出提示.. 通过超级用户请求超级权限.. 它有效【参考方案8】:

问题可能是我们需要在最新 CM 的开发选项中专门授予 adb root 访问权限。 这就是我所做的。

abc@abc-L655:~$ sudo adb kill-server abc@abc-L655:~$ sudo adb root start-server * 守护进程没有运行。现在在端口 5037 上启动它 * * 守护进程成功启动 * 系统设置禁用 root 访问 - 在设置中启用 -> 开发选项

更改开发选项后...

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.. 

【讨论】:

【参考方案9】:

在我们开始之前,你有root手机吗?如果没有,我强烈建议你是时候跳起来了。 99% 的教程可以帮助你做到这一点,要求你有一个 root 的手机(我知道 b/c 我花了大约一个小时寻找一种没有 root 手机的方法......找不到任何...... ) 此外,如果您考虑一下,您的 iPhone 也必须扎根才能执行相同的任务。所以这是完全合理的。更多关于在答案末尾生根的信息。

从您的命令行类型:

adb shell

这会将您带到您的 android shell 命令行(您应该会看到类似这样的内容:shell@android:/ $ 现在输入:

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

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

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

如果没有(即如果您收到错误),那么您可能没有 root 手机,或者您没有使用您的 root 用户权限。要使用您的 root 用户权限,请在 adb 命令行上键入 su 并查看会发生什么,如果出现错误,则说明您的手机没有 root。如果不是,请先将其 root,然后继续这些说明。

您可以从那里输入ls,您将看到所有目录,包括 dbs:

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

cache
databases
lib
shared_prefs   

之后,您可以使用 sqlite3 浏览 dbase.. 如果您没有安装它(您可以通过输入 sqlite3 找到它,如果您收到 command not found,那么您必须安装它。要安装 sqlite,请按照说明here。

关于root:如果您以前从未root过您的手机,并且您担心它会搞砸您的手机,我可以完全自信地告诉您,没有什么可担心的。几乎所有新旧型号都有大量快速简便的手机 root 教程,即使你有 mac,你也可以 root 手机(我用我的 mac 植根了我的 s3) .

【讨论】:

run-as 不需要root 手机即可工作。我刚刚在生产型 Galaxy Nexus S 上尝试过。 @TedHopp 等等 b/c 它可以在您的生产型 Galaxy Nexus S 上正常工作。它可以在所有安卓手机上正常工作,对吧? 首先,我的手机是一个反例,它表明root 手机不是必需的。其次,是的,它应该适用于所有至少为 Android 2.2 的非 root 设备(不是因为它适用于我的手机,而是因为它应该是这样工作的;请参阅 the answer by Idolon)。 @TedHopp 就我个人而言,我不是一个 Android 开发人员。所以像 build the application as debuggable (either by building it with the Eclipse, or ant debug command) 这样的指令对你来说可能听起来微不足道,但它们有点吓到我了。我想我的答案更适合那些对 android 手机扎根但不精通 android 开发世界的人。但我很高兴我们正在讨论这个问题。我希望我的答案的读者了解其他非生根替代方案 很好的回答人。我在这里使用了一些不同的手机(MotoX、nexus4、LG G3、SGIII),这对所有人来说都很好。【参考方案10】:

当您在设备的 shell 目录中时。跑吧

su - root

那么你应该可以访问 data/ 文件夹了。

【讨论】:

【参考方案11】:

$ adb shell

$ cd /数据

$ ls

opendir 失败,权限被拒绝


你应该这样做:

$ adb shell

$ cd /data

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

shell@android:/data/data/com.your.package $ ls

好的!

【讨论】:

这行得通!在执行任何命令之前需要做几件事。在手机上启用开发者选项后,我们还需要启用 USB 调试。我还在我的手机 (HTC M8) 上启用了名为 Select debug app 的功能并选择了我的应用程序。可能是所有手机的标准配置......应该是。【参考方案12】:

无需root设备即可通过以下方式访问文件 cmd截图:

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

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

    它可以在另一个文件夹中,具体取决于您的安装位置。

    显示工作设备。

    adb devices
    

    说响应操作系统的命令是

    List of devices attached
    0123456789ABCDEF     device
    

    写命令

        adb -s 0123456789ABCDEF shell "su"
    

    它将在

    中打开
        root@theDeviceName:/ #
    

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

ls

等将目录更改为数据文件夹等任何其他位置

cd data/data

【讨论】:

C:\Users\bruker\AppData\Local\Android\sdk\platform-tools>adb -s emulator-5554 shell "su" /system/bin/sh: su: not found跨度> 在我的情况下它是 android 5.0.2 我不知道它是否与另一个版本不同 @Koen 路径取决于你安装 android studio 的位置和它的 SDKs @Solo 问题是没有找到 adb 在哪里。它在我的路径中。获取文件列表(甚至执行su)不起作用/不允许。使用 Android 4.3 进行测试。 su 未找到【参考方案13】:

如果您只想查看您的数据库和表,那么最简单的方法是使用Stetho。对于每个使用SQLite buit by Facobook developed 的 Android 开发人员来说,这是一个非常酷的工具。

Steps to use the tool

    在应用程序的 gradle 文件中添加以下依赖项(模块:app)

'编译'com.facebook.stetho:stetho:1.4.2'

    在您的 Activity onCreate() 方法中添加以下代码行
@Override
 protected void onCreate(Bundle savedInstanceState) 
 super.onCreate(savedInstanceState);
 Stetho.initializeWithDefaults(this);
 setContentView(R.layout.activity_main);
 

现在,构建您的应用程序,当应用程序运行时,您可以通过在 url 中打开 chrome 浏览您的应用程序数据库:

chrome://inspect/#devices

相同的截图如下_

ChromeInspact

你的数据库

希望这对所有人都有帮助! :)

【讨论】:

【参考方案14】:

如果您的 Android 设备以任何方式植根(不确定它是否适用于非植根),则此方法有效。

    adb shell - 访问外壳 su - 成为超级用户。

您现在可以读取所有目录中的所有文件。

【讨论】:

【参考方案15】:
    你的手机应该已经root了。这是重要的一步! 转到 adb 文件位置并在该位置以管理员身份启动命令提示符 运行以下命令: 亚行外壳 作为 com.domain.yourapp 运行 这将要求您手机上的 root 访问权限,允许它。 您将能够使用根访问权限浏览文件。 谢谢!

【讨论】:

以上是关于为啥我在使用 adb 时拒绝访问数据文件夹?的主要内容,如果未能解决你的问题,请参考以下文章

为啥从目录执行 ssis 包时访问文件路径被拒绝消息

为啥我在 s3 上的访问被拒绝(使用适用于 Node.js 的 aws-sdk)?

为啥当我尝试移动目录时访问被拒绝?

无法复制 SQL Server 文件,访问被拒绝

为啥有些文件拒绝访问

为啥我的视频会被拒绝访问?