题
谁能告诉我,是有可能使用亚行拉从一个应用程序发送数据库,没有root权限的手机上?
例如,我在我的根魔知道位置和梦想是:
/data/data/com.xxxx.xxxx/databases/xxxx
我知道,你可以使用ADB无根,而是试图使用shell时 - 你不能没有根privaliges查看该位置。但有人告诉我,你可以使用推拉如果你知道你想要的文件?
基本上我想从我的应用程序拉的数据库中的非根电话上进行修改和将其推回上。
唯一的麻烦我已经是,两款手机我是根和我没有访问到非根一个尝试一下。
解决方案
虽然Nilhcem的回答并没有为我工作,这导致我在正确的方向(即我upvoted),我现在有一个可行的解决方案。
旧的答案,可能无法与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
其他提示
一个快速的解决方法是使用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
是因为API级别8(的Android 2.2)可用,并且可以仅使用该应用程序是否 debbugable
在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
我们设定的文件权限可读所有用户从应用程序内。
if (BuildConfig.DEBUG)
{
new File(mDB.getPath()).setReadable(true, false);
}
然后,只需拉带.db了与ADB正常。
adb -d pull //data/data/xxxxx/databases/xxxxx.db .
注意:我发现,这需要在每个的onCreate数据库文件被打开的时间完成,例如,以及您SQLiteOpenHelper包装(的构造函数时,你的数据库是不是null )或者可能的OnOpen。如果只是在的onCreate,那么下次你运行你的应用程序和.db的已经存在的时候,由于某些原因,权限已被改回来。这可能有一些做与Android如何管理其数据。
如果你想要把数据库文件到应用程序
首先,代替“file.db”下的“/存储/模拟/ 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,在主文件夹到数据库。