36

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

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

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

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

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

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

4

5 回答 5

80

虽然 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
于 2013-06-18T19:18:22.683 回答
13

一个快速的解决方法是使用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 命令的更多信息,请点击此处

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

于 2012-10-30T13:11:37.467 回答
1

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
于 2016-07-15T13:51:54.273 回答
0

我们将应用程序内的所有用户的文件权限设置为可读。

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 如何管理其数据有关。

于 2014-07-11T19:47:37.743 回答
0

如果您想将 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 复制到数据库。

于 2018-04-08T20:51:39.427 回答