Android ADB无需root权限访问应用程序数据库

谁能告诉我,是否有可能使用ADB从应用程序中拉取和推送数据库,而无需在电话上拥有root权限?

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

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

我知道你可以使用不带root的ADB,但是当试图使用shell时,你不能在没有root权限的情况下查看那个位置。 但是我被告知如果你知道你想要的文件,你可以使用push和pull。

基本上我想从一个非根深蒂固的手机上从我的应用程序拉数据库修改它,并推回来。

我唯一的麻烦是,我有两个电话都是根,我没有访问非root用户来尝试。

Solutions Collecting From Web of "Android ADB无需root权限访问应用程序数据库"

虽然Nilhcem的答案不适合我,但它使我朝着正确的方向发展(为此我奋力投入),现在我有了一个可行的解决scheme。

旧的答案可能不适用于新版本的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)开始, run-as命令是可用的,只有在应用程序是可debbugable时才能使用。

OxygenOS (基于Android 5.2)我已经混合了Pilot_51提供的两个解决scheme。

首先,我用run-as/data/data/package.name/databases获得访问权限, /data/data/package.name/databases我无法直接复制到/sdcard/因此我更改了文件的权限。 之后,我退出run-as模式并使用cp将文件复制到/sdcard/ storage中。 最终我能够使用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); } 

然后,只需将.dbclosures与adb正常。

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

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