为什么在使用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权限?
有两件事情要记住,如果你想浏览设备上的一切。
- 您需要拥有具有root用户权限的手机才能浏览Android手机上的数据文件夹。 这意味着要么有一个开发人员设备( ADP1或来自Google I / O的ION ),要么您已经find了一种方法来以其他方式“root”您的手机。
- 您需要以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 ..如果你没有安装它(你可以通过键入sqlite3
find它,如果你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访问权限的两个步骤:
- 你的android设备必须被植入。
- 在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截图:
-
根据您的用户使用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
所以在chang目录中的任何其他地方像数据文件夹
cd data/data
当你在设备的shell目录下。 赶紧跑
su - root
那么你应该可以访问数据/文件夹。