Android ADB无需root即可访问应用数据库

Posted

技术标签:

【中文标题】Android ADB无需root即可访问应用数据库【英文标题】:Android ADB access to application databases without root 【发布时间】:2011-01-05 22:17:09 【问题描述】:

谁能告诉我,是否可以使用 ADB 从应用程序中拉取和推送数据库,而无需手机上的 root 权限?

例如,我知道我根深蒂固的魔法和梦想的位置是:

/data/data/com.xxxx.xxxx/databases/xxxx

我知道您可以在没有 root 的情况下使用 ADB,但是在尝试使用 shell 时 - 如果没有 root 权限,您将无法查看该位置。但是有人告诉我,如果你知道你想要的文件,你可以使用 push 和 pull?

基本上我想在非root手机上从我的应用程序中提取一个数据库,修改它并将其推回。

唯一的问题是,我拥有的两部手机都是 root 用户,我无法使用非 root 用户来试用。

【问题讨论】:

***.com/a/18472135/1778421 【参考方案1】:

虽然 Nilhcem 的回答对我不起作用,但它引导我朝着正确的方向前进(为此我投了赞成票),我现在有了一个可行的解决方案。

旧答案可能不适用于较新版本的 android

#Transfer file from app databases directory to PC
adb shell
$ run-as package.name
$ cd ./databases/
$ ls -l #Find the current permissions - r=4, w=2, x=1
$ chmod 666 ./dbname.db
$ exit
$ exit
adb pull /data/data/package.name/databases/dbname.db ~/Desktop/

#Transfer file from PC to app databases directory (requires the above permission change)
adb push ~/Desktop/dbname.db /data/data/package.name/databases/dbname.db
adb shell
$ run-as package.name
$ chmod 660 ./databases/dbname.db #Restore original permissions
$ exit
$ exit

使用外部存储的替代方法(已确认适用于 6.0.1):

#Transfer file from app databases directory to external storage
adb shell
$ run-as package.name
$ cp ./databases/dbname.db /sdcard/
$ exit
$ exit

#Transfer file from external storage to app databases directory
adb shell
$ run-as package.name
$ cp /sdcard/dbname.db ./databases/
$ exit
$ exit

【讨论】:

这是所问问题的正确答案,想要这样做的人是应用程序的开发人员并且可以安装它的调试版本(调试版本是运行的先决条件 -作为)。其他选项包括让应用程序本身更改权限或将文件复制到/从外部存储。 @um.anusorn 4.3 中有一个问题会破坏 run-as,应该在 4.4 中修复。见:code.google.com/p/android/issues/detail?id=58373如果你有root,你可以通过启用/system/bin/run-as的Set UID权限来修复它,但是这样就达不到目的了。 @um.anusorn 这可能意味着您的应用不是调试版本(在 2.3 上也有同样的问题)。 虽然文件明显存在并且应用了chmod 666,但adb pull表示远程对象不存在。似乎您仍然需要一些额外的权限才能执行此操作? 这种变通方法不再有效,至少在 Android 5.1+ 上是这样。拉文件说“远程对象文件名不存在”。答案应该反映这一点。【参考方案2】:

一种快速的解决方法是使用run-as 命令将数据库复制到您可以访问的文件夹中,例如/sdcard,然后执行普通的adb pull

adb shell
$ run-as package.name cp /data/data/package.name/dbname.db /sdcard/
$ exit
adb pull /sdcard/dbname.db

有关 run-as 命令的更多信息here

请注意,run-as 命令从 API 级别 8 (Android 2.2) 开始可用,并且只能在应用程序为 debbugable 时使用。

【讨论】:

在我的版本上(可能与 4.4 有关,或者去年的一些更新?)当使用 run-as 时,我无法将 cp 转至 /sdcard。我需要使用@Pilot_51 的chmod 解决方案 这是真的 - 使用 adb shell 时 sd 卡不再可写【参考方案3】:

OxygenOS(基于Android 5.2)我结合了Pilot_51提供的两种解决方案。

首先,我使用run-as 访问/data/data/package.name/databases,但从这里我无法直接复制到/sdcard/,所以我更改了文件的权限。之后,我退出了run-as模式并使用cp将文件复制到/sdcard/存储中。终于可以使用adb pull

$ adb -s <DEVICE_ID> shell
$ run-as package.name
$ chmod 666 databases/dbname.db
$ exit
$ cp /data/data/package.name/databases/dbname.db /sdcard/dbname.db
$ exit
$ adb pull /sdcard/dbname.db ./dbname.db

【讨论】:

【参考方案4】:

我们将文件权限设置为应用内所有用户均可读取。

if (BuildConfig.DEBUG)

    new File(mDB.getPath()).setReadable(true, false);

然后正常使用 adb 拉出 .db。

adb -d pull //data/data/xxxxx/databases/xxxxx.db .

注意:我发现每次打开数据库文件时都需要这样做,例如在 onCreate 以及 SQLiteOpenHelper 包装器的构造函数中(当您的数据库不为空时) ) 或者可能是 onOpen。如果仅在 onCreate 中,则下次运行应用程序并且 .db 已经存在时,由于某种原因权限已被改回。这可能与 Android 如何管理其数据有关。

【讨论】:

【参考方案5】:

如果你想将 db 文件推送到应用程序中

首先,由于权限问题,将“file.db”放在“/storage/emulated/0/”下。那么你应该假装成应用程序来访问数据文件夹。

  adb shell
  $ run-as com.package.name
  :/data/data/com.package.name $ cp /storage/emulated/0/file.db /data/data/com.package.name/databases/

它将主文件夹中的file.db复制到数据库中。

【讨论】:

以上是关于Android ADB无需root即可访问应用数据库的主要内容,如果未能解决你的问题,请参考以下文章

adb无线连接android手机进行调试 无需获得root权限

android系统如何通过$ adb 来获得/data/data目录的访问权限

能用adb命令查看安卓手机根目录么

无需硬编码访问密钥即可从 android 应用程序访问 AWS S3

adb wifi 测试(无需root)

Android 无线调试设备,无需Root方式