任何人都可以告诉我,是否可以使用ADB从应用程序中提取和推送数据库,而无需手机上的root权限?
例如,我知道我根深蒂固的魔法和梦想的位置是:
/data/data/com.xxxx.xxxx/databases/xxxx
我知道您可以在没有root的情况下使用ADB,但在尝试使用shell时 - 如果没有root权限,则无法查看该位置。但有人告诉我,如果你知道你想要的文件,你可以使用推拉法吗?
基本上我想从非root手机上的MY应用程序中提取数据库进行修改并重新推送。
我遇到的唯一问题是,我拥有的两部手机都是root用户,我无权访问非root用户手机。
答案 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复制到数据库。