为什么使用adb时无法访问数据文件夹?


181

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


简单...请确保您的手机屏幕已打开。当询问您是否希望“未知”有权访问root时,单击“允许”。做完了

决定创建一个简单的avd来访问数据库。没有人为开发人员提供任何指向指南的链接,而没有“自定义”照明弹和图​​形?以及如何在购买的设备上获取普通香草android的方法。
bgs 2011年

我的Android 7.1.1设备上没有出现此类提示。但是adb继续并列出目录的内容。麻烦的是,内容实际上不存在。我正在使用adb-sync添加内容。这很奇怪。
汤姆·罗素

Answers:


139

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

  1. 您需要拥有具有root用户访问权限的手机才能浏览Android手机上的数据文件夹。这意味着您拥有开发人员设备(ADP1或Google I / O 的ION),或者找到了一种以其他方式“植根”手机的方法。
  2. 您需要以root模式运行ADB,请执行以下操作: adb root

77
而且“ adb root”需要自定义的adb构建,否则“ adbd无法在生产构建中以root身份运行”
bortzmeyer 2011年

16
自定义生成的ADB?我从哪里可以得到?
Gopinath

9
@Gopinath问题的任何答案吗?
Ewoks 2012年

2
@Gopinath:我相信您必须从目标设备的源代码构建它,将其配置为允许使用ndk的根用户,然后将其与二进制文件的映像一起闪存到设备上。
Ben Jaguar Marshall 2012年

4
AFAIK,没有必要具有自定义版本的adb。必须以root用户身份运行adbd支持,但是该adbd在设备上-因此,进行任何修改以使设备具有root用户访问权限就足够了。
nitzanms 2014年

222

从API级别8(Android 2.2)开始,对于可调试应用程序(除非请求发布版本,否则Android Studio一直构建的应用程序),您可以使用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在任何版本(从7到10.1)上运行Cyanogenmod的Samsung Galaxy S手机,也存在问题,因为在此平台上/data/data是的符号链接/datadata。解决该问题的一种方法是将符号链接替换为实际目录(不幸的是,这通常需要root访问权限)。


2
如您所解释的那样,此方法有效run-as com.mypackage。我遇到的问题是sqlite3 /data/data/com.mypackage/databases/mydb“ sqlite3:权限被拒绝”。sqlite3只能由root运行吗?
styfle

5
列出存储在内部存储器中的文件时,其工作方式就像魅力。
zaplec 2012年

5
我必须更改该文件的权限才能将其移动到我的sdcard,因为我无法cp它作为我的应用程序运行。因此,1)运行为com.package.example,chmod 777 databasefile.db。2)退出,转到sdcard,cp /data/data/com.package.example/databases/databasefile.db。第3步应该恢复777权限
Maragues

3
无论我如何正确地将其拼写到终端中,我的包裹都是未知的:(
Costa Costa

3
这应该是标记为正确的答案,因为这是用于无根电话的正确方法。
LNI

48

在我们开始之前,您有一部植根电话吗?如果没有,我强烈建议您该跳起来了。99%的帮助您完成此操作的教程都要求您拥有一部扎根的手机(我知道b / c我花了大约一个小时来寻找一种方法,而没有扎根的手机..找不到任何.. ),如果您考虑过这一点,那么您的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用户特权,请su在adb命令行上键入并查看会发生什么,如果出现错误,则说明您的电话未植根。如果不是,请先将其植根,然后继续执行这些说明。

从那里可以键入,ls然后您将看到所有目录,包括数据库:

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

cache
databases
lib
shared_prefs   

之后,您可以使用sqlite3浏览dbase。.如果您没有安装dbase(您可以通过键入来找到它sqlite3,如果得到,command not found则必须安装它。要安装sqlite,请按照此处的说明进行操作。

关于生根:如果您以前从未生过手机,并且担心它会弄乱您的手机,我可以完全自信地告诉您,没有什么可担心的。那里有大量用于所有新旧型号的快速便捷的手机植根教程,即使您使用的是Mac,您也可以将其植根(我的s3植根于Mac)。


8
您不需要扎根电话run-as即可工作。我只是想它在生产建造的Galaxy Nexus S.
泰德·霍普

@TedHopp,所以b / c在您生产的Galaxy Nexus S上可以正常使用。在所有android手机上都可以正常使用吗?
2014年

首先,我的电话是一个反例,表明不需要植根电话。其次,是的,它应该可以在至少为Android 2.2的所有非root用户设备上运行(不是因为它可以在我的手机上运行,​​而是因为它应该这样工作;请参阅Idolon的回答)。
泰德·霍普

@TedHopp我个人不是一个Android开发人员。.所以这样的指令build the application as debuggable (either by building it with the Eclipse, or ant debug command)对您来说似乎微不足道,但它们有点吓我一跳。我想我的答案更多是适合于扎根android手机但对android开发世界不太熟悉的人。但是我很高兴我们能进行这次讨论。.我希望我的回答的读者意识到其他无根的替代方案
大约2014年

1
好答案的人。我在这里使用了几种不同的手机(MotoX,nexus4,LG G3,SGIII),这对所有人来说都非常不错。
乍得宾厄姆

43

$ 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)上启用了“ 选择调试应用程序”功能,然后选择了我的应用程序。可以在所有手机上标配...应该是。
srinij '16

30

尝试在扎根的Samsung Galaxy S上进行操作时,我遇到了类似的问题。从计算机外壳发出命令

> adb root

失败,并显示消息“无法在生产版本中以root身份运行”。这是允许成为root用户的简单方法。

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

> adb shell
$ su

在执行第一个命令后,如果提示符已如上所示从“>”更改为“ $”,则表示您已进入adb shell环境。如果随后在发出第二个命令后提示符已更改为“#”,则表明您现在是root用户。现在,以root身份,您可以使用设备执行任何操作。

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

# exit

您将看到提示再次出现“ $”,这意味着您以用户身份而不是以root用户身份进入adb shell。


13
su:权限被拒绝
petrnohejl 2012年

3
很好,谢谢!顺便说一句,你需要有一个扎根的手机才能做到这一点。您可能还需要SuperSU或类似的东西?至少当我尝试使用“ su”时,SuperSU在手机上给了我一个对话框。
冯检基

16
/ system / bin / sh:su:找不到
matt lohkamp 2014年

1
谢谢:) adb shell + su永远解决了烦人的权限问题。我su: not found在Android 4.3上遇到问题,但自从升级到4.4.2以来,问题消失了。4.3似乎有问题。

3
su对我不可用,Nexus 5 / Android 5.1-有解决方法吗?
CodeManX

19

我对此也有很多麻烦。我仍然不完全了解许可权和root运行权限,但这对我有用(部分是前面的答案之一),它从/ data / data / [程序包名称] /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文件。:)


我试过->运行方式<app_package_name>,但是adb无法识别我的app_package_name。我使用了在AndroidManifest.xml中指定的package_name。我有什么想念的吗?
ARK 2015年

3

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

  1. 您的android设备必须扎根。
  2. 在ADB Shell中,输入su,然后android设备会提示y / n?您选择允许。

键入苏..会给出提示在移动设备..寻求通过超级用户权限的超级工作..它
Mahajan344

2

生产版本无法输入/ 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

可能需要更改为权利所有者才能进行操作。


2

问题可能是我们需要在最新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.. 

1

如果您知道应用程序包,则可以cd直接进入该文件夹。

例如 cd data/data/com.yourapp

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


2
我可以直接CD到该文件夹​​,但是仍然出现“ opendir失败,权限被拒绝”错误。
泰勒·科利尔

这是因为adb的“ shell”用户对目录具有执行权限,但没有读取权限。
克里斯·斯特拉顿

0

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

Steps to use the tool

  1. 在应用程序的gradle文件中添加以下Dependeccy(模块:app)

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

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

ChromeInspact

您的数据库

您的数据库

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


0

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

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

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


-3

无需生根设备,您可以通过以下cmd屏幕截图访问文件:

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

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

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

  2. 显示工作设备。

    adb devices

    可以说命令os是

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

        adb -s 0123456789ABCDEF shell "su"

    它将打开

        root@theDeviceName:/ #

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

ls

等等chang目录到其他任何地方,例如data文件夹

cd data/data

1
C:\ Users \ bruker \ AppData \ Local \ Android \ sdk \ platform-tools> adb -s emulator-5554 shell“ su” / system / bin / sh:su:未找到
独奏

以我为例,它是android 5.0.2,我不知道它是否与另一个@Koen版本不同
Mahmoud Ashraf

路径取决于您安装android studio的位置以及SDKs @Solo
Mahmoud Ashraf

1
问题不在找到adb在哪里。它在我的路径中。获取文件列表(或什至执行su)无法正常工作。使用Android 4.3进行测试。
科恩(Koen)

找不到su
Brill Pappin

-5

在设备的Shell目录中时。赶紧跑

su - root

然后,您应该能够访问数据/文件夹。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.