代码之家  ›  专栏  ›  技术社区  ›  Scoobler

Android ADB无根访问应用程序数据库

  •  33
  • Scoobler  · 技术社区  · 16 年前

    有人能告诉我,在没有电话根权限的情况下,是否可以使用ADB从应用程序中提取和推送数据库?

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

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

    我知道你可以在没有根的情况下使用adb,但是当你试图使用shell时,你不能在没有根特权的情况下查看这个位置。但有人告诉我,如果你知道你想要的文件,你可以使用推和拉?

    基本上,我想从我的应用程序中提取一个数据库,在一个非根电话上修改它,然后再推它。

    我唯一的问题是,我拥有的两部手机都是根用户,我无法使用非根用户的手机来尝试。

    5 回复  |  直到 8 年前
        1
  •  77
  •   Pilot_51    10 年前

    虽然尼尔海姆的回答对我不起作用,但它引导我朝着正确的方向前进(因为我投了反对票),我现在有了一个可行的解决方案。

    旧答案可能不适用于较新版本的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
    
        2
  •  13
  •   Community Mohan Dere    9 年前

    快速解决方法是使用 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

    请注意 运行为 命令自API 8级(android 2.2)起可用,仅当应用程序 debbugable .

        3
  •  1
  •   fredmaggiowski Alex    10 年前

    论 OxygenOS (基于Android 5.2)我已经混合了 Pilot_51 .

    首先我用过 run-as 进入 /data/data/package.name/databases 从这里我无法直接复制 /sdcard/ 因此我更改了文件的权限。之后我就离开了 运行为 模式与应用 cp 将文件复制到 SD卡 贮存。最终我可以使用 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
  •  0
  •   delrocco    12 年前

    我们将文件权限设置为对应用程序中的所有用户都可读。

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

    然后,正常地将.db与adb一起拔出。

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

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

        5
  •  0
  •   AhuraMazda    8 年前

    如果要将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/
    

    它将主文件夹中的文件.db复制到数据库中。