Android ADB无需root即可访问应用数据库
Posted
技术标签:
【中文标题】Android ADB无需root即可访问应用数据库【英文标题】:Android ADB access to application databases without root 【发布时间】:2011-01-05 22:17:09 【问题描述】:谁能告诉我,是否可以使用 ADB 从应用程序中拉取和推送数据库,而无需手机上的 root 权限?
例如,我知道我根深蒂固的魔法和梦想的位置是:
/data/data/com.xxxx.xxxx/databases/xxxx
我知道您可以在没有 root 的情况下使用 ADB,但是在尝试使用 shell 时 - 如果没有 root 权限,您将无法查看该位置。但是有人告诉我,如果你知道你想要的文件,你可以使用 push 和 pull?
基本上我想在非root手机上从我的应用程序中提取一个数据库,修改它并将其推回。
唯一的问题是,我拥有的两部手机都是 root 用户,我无法使用非 root 用户来试用。
【问题讨论】:
***.com/a/18472135/1778421 【参考方案1】:虽然 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
【讨论】:
这是所问问题的正确答案,想要这样做的人是应用程序的开发人员并且可以安装它的调试版本(调试版本是运行的先决条件 -作为)。其他选项包括让应用程序本身更改权限或将文件复制到/从外部存储。 @um.anusorn 4.3 中有一个问题会破坏 run-as,应该在 4.4 中修复。见:code.google.com/p/android/issues/detail?id=58373如果你有root,你可以通过启用/system/bin/run-as的Set UID权限来修复它,但是这样就达不到目的了。 @um.anusorn 这可能意味着您的应用不是调试版本(在 2.3 上也有同样的问题)。 虽然文件明显存在并且应用了chmod 666
,但adb pull
表示远程对象不存在。似乎您仍然需要一些额外的权限才能执行此操作?
这种变通方法不再有效,至少在 Android 5.1+ 上是这样。拉文件说“远程对象文件名不存在”。答案应该反映这一点。【参考方案2】:
一种快速的解决方法是使用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 时使用。
【讨论】:
在我的版本上(可能与 4.4 有关,或者去年的一些更新?)当使用run-as
时,我无法将 cp
转至 /sdcard。我需要使用@Pilot_51 的chmod
解决方案
这是真的 - 使用 adb shell 时 sd 卡不再可写【参考方案3】:
在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
【讨论】:
【参考方案4】:我们将文件权限设置为应用内所有用户均可读取。
if (BuildConfig.DEBUG)
new File(mDB.getPath()).setReadable(true, false);
然后正常使用 adb 拉出 .db。
adb -d pull //data/data/xxxxx/databases/xxxxx.db .
注意:我发现每次打开数据库文件时都需要这样做,例如在 onCreate 以及 SQLiteOpenHelper 包装器的构造函数中(当您的数据库不为空时) ) 或者可能是 onOpen。如果仅在 onCreate 中,则下次运行应用程序并且 .db 已经存在时,由于某种原因权限已被改回。这可能与 Android 如何管理其数据有关。
【讨论】:
【参考方案5】:如果你想将 db 文件推送到应用程序中
首先,由于权限问题,将“file.db”放在“/storage/emulated/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复制到数据库中。
【讨论】:
以上是关于Android ADB无需root即可访问应用数据库的主要内容,如果未能解决你的问题,请参考以下文章
adb无线连接android手机进行调试 无需获得root权限
android系统如何通过$ adb 来获得/data/data目录的访问权限