Android ADB访问没有root的应用程序数据库

时间:2010-01-16 19:48:56

标签: android adb root

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

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

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

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

基本上我想从非root手机上的MY应用程序中提取数据库进行修改并重新推送。

我遇到的唯一问题是,我拥有的两部手机都是root用户,我无权访问非root用户手机。

5 个答案:

答案 0 :(得分:77)

虽然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

答案 1 :(得分: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命令here

的更多信息

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

答案 2 :(得分: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

答案 3 :(得分:0)

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

if (BuildConfig.DEBUG)
{
    new File(mDB.getPath()).setReadable(true, false);
}

然后通常使用adb关闭.db。

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

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

答案 4 :(得分:0)

如果要将db文件推送到应用程序

首先,放置&#34; file.db&#34;在&#34; / storage / emulated / 0 /&#34;因为许可问题。那么你应该假装作为应用程序来访问数据文件夹。

  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复制到数据库。