谁能告诉我,是不是可以使用ADB在手机上拉,并从一个应用程序发送数据库,没有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 -d pull //data/data/xxxxx/databases/xxxxx.db .
注:我发现,这需要每一个数据库文件被打开,例如在时间的onCreate以及您SQLiteOpenHelper包装的构造函数(当你的数据库不为空),或者可能的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,在主文件夹中的数据库。