2010-01-16 47 views
31

谁能告诉我,是有可能使用亚行拉从一个应用程序发送数据库,无需在手机上根本privaliges?的Android ADB访问应用程序数据库,而根

例如,我知道我的根魔术和梦想的位置是:

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

我知道,你可以使用ADB无根,而是试图使用shell时 - 你无法查看没有根特权的位置。但是我被告知如果你知道你想要的文件,你可以使用push和pull。

基本上我想从我的非植根手机上的应用程序拉数据库中修改它,并将它推回。

唯一的麻烦我是,两款手机我是根和我没有访问到非根一个尝试一下。

+0

请考虑将您的接受改为Pilot_51的回答。我的版本上的 – 2013-06-18 19:25:10

回答

72

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

对于所问的问题,这是一个正确的答案,其中想要这样做的人是开发人员该应用程序并可以安装它的调试版本(调试版本是run-as的先决条件)。其他选项包括让应用程序本身更改权限或将文件复制到外部存储器或从外部存储器复制文件。 – 2013-06-18 19:26:33

+0

adb return with message run-as:Package'com.instagram.android'不知道该怎么办?我也尝试使用su然后adb拉/data/data/package.name/databases/dbname.db〜/ Desktop /但它返回错误:找不到设备? – UmAnusorn 2013-10-09 15:37:58

+1

@ um.anusorn在4.3中有一个问题打破了运行方式,应该在4.4中进行修正。请参阅:https://code.google.com/p/android/issues/detail?id=58373如果您拥有root用户,您可以通过启用/ system/bin/run-as的Set UID权限来解决此问题,但是有种失败的目的。 – 2014-02-04 16:25:49

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 

更多信息命令here

注意,run-as命令是因为API级别8(的Android 2.2)可用并且只能用于如果应用程序是debbugable

+0

(可能与4.4有关,或者去年有些更新?)当使用'run-as'时,我不能'cp'到/ sdcard。我需要使用来自@ Pilot_51的'chmod'解决方案 – 2014-02-06 09:22:53

+0

这是事实 - 使用adb外壳时sd卡不再可写入 – slott 2015-01-13 13:21:36

0

我们设置文件权限从应用内的所有用户可读。

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

然后只需用adb将.db关闭即可。

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

注:我发现,这需要在每个的onCreate数据库文件被打开的时间完成,例如,以及你SQLiteOpenHelper包装的构造函数(当你的数据库不为空)或者可能打开。如果仅在onCreate中,那么下次运行应用程序并且.db已存在时,出于某种原因,权限已被更改。这可能与Android管理其数据的方式有关。

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 
相关问题