Android ADB access to application databases without root

后端 未结 5 762
难免孤独
难免孤独 2020-12-02 05:20

Can anyone tell me, is it possible to use the ADB to pull and push a database from an app, without root privileges on the phone?

For example, I know the location on

相关标签:
5条回答
  • 2020-12-02 05:25

    if you want to push db file into the application

    first of all, place "file.db" under "/storage/emulated/0/" because of permission issue. then you should pretend as application to access data folder.

      adb shell
      $ run-as com.package.name
      :/data/data/com.package.name $ cp /storage/emulated/0/file.db /data/data/com.package.name/databases/
    

    it copies the file.db that in main folder to databases.

    0 讨论(0)
  • 2020-12-02 05:36

    We set the file permissions to readable for all users from within the app.

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

    Then just pull the .db off with adb normally.

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

    NOTE: I've discovered that this needs to be done each time the database file is opened, for example in onCreate as well as the constructor of your SQLiteOpenHelper wrapper (when your database is not null) or perhaps onOpen. If only in onCreate, then the next time you run your app and the .db already exists, for some reason the permissions have been changed back. This might have something to do with how Android manages its data.

    0 讨论(0)
  • 2020-12-02 05:40

    A quick workaround is to use the run-as command to copy the database in a folder where you can have access, such as /sdcard and then, do a normal adb pull

    adb shell
    $ run-as package.name cp /data/data/package.name/dbname.db /sdcard/
    $ exit
    adb pull /sdcard/dbname.db
    

    More information on the run-as command here

    Note that the run-as command is available since API level 8 (Android 2.2) and can only be used if the application is debbugable.

    0 讨论(0)
  • 2020-12-02 05:43

    On OxygenOS (based on Android 5.2) I've mixed up the two solutions provided by Pilot_51.

    First I've used run-as to gain access on /data/data/package.name/databases from here I wasn't able to copy directly on /sdcard/ hence I changed the permission of the file. After that I've exited from run-as mode and used cp to copy the file in /sdcard/ storage. Eventually I was able to use 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
    
    0 讨论(0)
  • 2020-12-02 05:50

    While Nilhcem's answer didn't work for me, it lead me in the right direction (for that I upvoted) and I now have a working solution.

    Old answer that may not work with newer versions of 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
    

    Alternate method using external storage (confirmed to work with 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
    
    0 讨论(0)
提交回复
热议问题