【问题标题】:Android ADB access to application databases without rootAndroid ADB无需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 用户来试用。

【问题讨论】:

标签: android adb root


【解决方案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复制到数据库中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-21
        • 1970-01-01
        • 1970-01-01
        • 2021-10-19
        • 2016-01-31
        • 2012-09-28
        相关资源
        最近更新 更多