为什么我在使用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

我惊讶地发现,我的访问被拒绝了。为什么我不能像这样使用命令行浏览目录呢?

我如何获得我手机的根权限?

383612 次浏览

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

  1. 你需要有一个具有root权限的手机,以便浏览Android手机上的数据文件夹。这意味着要么你有一个开发设备(ADP1或谷歌I/O中的离子),要么你已经找到了一种方法来“根”你的手机。
  2. 你需要在根模式下运行ADB,通过执行:adb root来实现

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

cd data/data/com.yourapp

这将把你放到read/writable的目录中,这样你就可以根据需要更改文件了。由于该文件夹在emulator上是相同的,所以可以使用它来获取文件夹路径。

产品版本不能进入/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

可能需要更换正确的所有者来操作它。

从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
< p >, < br > 注1:一些HTC Desire手机有一个已知问题。由于/data/data目录的所有者/权限不标准,run-as命令无法在这些电话上运行。

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

当我试图在一个扎根的三星Galaxy s上操作时,我遇到了类似的问题

> adb root

失败,提示“无法在生产版本中以根用户身份运行”。这里有一个简单的方法,允许成为根。

与之前的命令不同,可以依次发出以下两个命令

> adb shell
$ su

执行第一个命令后,如果提示符由'>'变为如上所示的'$',则表示已进入adb shell环境。如果随后在发出第二个命令后提示符更改为“#”,这意味着您现在是root用户。现在,作为根用户,你可以对你的设备做任何你想做的事情。

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

# exit

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

我在这方面也遇到了很多麻烦。我仍然不完全理解权限和根运行,但这对我来说是有效的(之前的答案之一),从/data/data/[包名]/databases/my_db.db复制数据库文件。由于某种原因,在shell中运行壳牌公司根没有工作,复制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文件。:)

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

  1. 你的android设备必须是根的。
  2. 在ADB shell中输入su, android设备会提示y/n?您选择允许。
问题可能是我们需要在最新的CMs的开发选项中特别给予adb root访问权限。 下面是我所做的

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

在改变了开发选项之后……

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

你有扎根电话吗?如果不是,我强烈建议你是时候跳槽了。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 $

如果它没有(即如果你得到一个错误),那么你可能没有根电话,或者你没有使用你的根用户特权。要使用你的根用户权限,在adb命令行上键入su,看看会发生什么,如果你得到一个错误,那么你的电话不是根用户。如果不是,请先将其根化,然后继续执行这些说明。

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

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


cache
databases
lib
shared_prefs

之后,您可以使用sqlite3来浏览dbase..如果你没有安装它(你可以通过输入sqlite3来找到它,如果你得到command not found,那么你必须安装它。要安装sqlite,请遵循在这里的说明。

关于加油:如果你从来没有根你的手机之前,你担心它拧你的手机,我可以充满信心地告诉你,没有什么可担心的。有大量的快速和简单的手机根教程,几乎所有的新老型号都有,即使你的手机是MAC,你也可以使用root(我用我的mac根我的s3)。

当您处于该设备的shell目录时。你就跑

su - root

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

$ adb shell

$ CD /data

$ ls

opendir failed, Permission denied


你应该这样做:

$ adb shell


$ cd /data


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


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

好的!

没有管理员权限设备您可以通过以下方式访问文件 cmd截图: < img src = " https://i.stack.imgur.com/Hzw2q.png " alt = " " > < / p >

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

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

    它可以在另一个文件夹中,这取决于你安装它的位置

  2. 显示工作设备。

    adb devices
    

    对于命令的响应操作系统

    List of devices attached
    0123456789ABCDEF     device
    
  3. write the command

        adb -s 0123456789ABCDEF shell "su"
    

    它会打开

        root@theDeviceName:/ #
    

4.Accessing files, list all the files

ls

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

cd data/data

如果你只想看到你的DB,表,那么最简单的方法是使用Stetho。非常酷的工具,每个Android开发人员谁使用SQLite,但由Facobook developed

Steps to use the tool

  1. 在应用程序的gradle文件中添加以下依赖项

“编译”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

你的数据库

Your DB

希望对大家有所帮助!:)

如果你的Android设备是根设备,这是有效的(不确定是否适用于非根设备)。

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

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

  1. 你的电话应该是固定的。这是重要的一步!
  2. 转到adb文件位置,并以该位置的管理员身份启动命令提示符
  3. 执行以下命令: 亚行壳 run - as com.domain.yourapp 这将要求root访问你的手机,允许它 您将能够使用根访问权限浏览文件。 谢谢!李< / >

我知道这个线程是相当旧的,但我遇到了这个问题,今天试图从android工作室复制我的数据库文件到我的窗口读取它。我不需要运行任何命令,实际上根本不需要运行任何命令。我所做的唯一一件事就是将USB插头重新连接到我的设备上,当提示“使用USB for”时;,我选择了“文件传输”;它成功了!您不需要有一个根设备来复制其内部文件。