Retrieve database or any other file from the Internal Storage using run-as

后端 未结 12 2211
清酒与你
清酒与你 2020-11-22 11:01

On a non-rooted android device, I can navigate to the data folder containing the database using the run-as command with my package name. Most files types I am c

相关标签:
12条回答
  • 2020-11-22 11:36

    The database file is emtpy when using adb run-as. This can be resolved by calling close() on the RoomDatabase instance. Call close() to let SQLite write its journal to disk. I've created this button that closes the database connection on request:

    via GIPHY

    Here is how to call close on the RoomDatabase instance.

    0 讨论(0)
  • 2020-11-22 11:38

    If someone is looking for another answer that can be used to retrieve Database as well as Shared Preferences then follow this step:

    In your build.gradle file of your app add line

    debugCompile 'com.amitshekhar.android:debug-db:1.0.0'

    now when you run your app in non-release mode then your app will automatically open 8080 port from your device IP address make sure your device is connected via wifi and your laptop is sharing the same network. Now simply visit the url

    http://your_mobile_device_ip:8080/

    to watch all data of database along with shared preferences.

    0 讨论(0)
  • 2020-11-22 11:46

    For app's debug version, it's very convenient to use command adb exec-out run-as xxx.yyy.zzz cat somefile > somefile to extract a single file. But you have to do multiple times for multiple files. Here is a simple script I use to extract the directory.

    #!/bin/bash
    P=
    F=
    D=
    
    function usage()
    {
        echo "$(basename $0) [-f file] [-d directory] -p package"
        exit 1
    }
    
    while getopts ":p:f:d:" opt
    do
        case $opt in
            p)
                P=$OPTARG
                echo package is $OPTARG
                ;;
            f)
                F=$OPTARG
                echo file is $OPTARG
                ;;
            d)
                D=$OPTARG
                echo directory is $OPTARG
                ;;
            \?)
                echo Unknown option -$OPTARG
                usage
                ;;
            \:)
                echo Required argument not found -$OPTARG
                usage
                ;;
        esac
    done
    
    [ x$P == x ] && {
        echo "package can not be empty"
        usage
        exit 1
    }
    
    [[ x$F == x  &&  x$D == x ]] && {
        echo "file or directory can not be empty"
        usage
        exit 1
    }
    
    function file_type()
    {
        # use printf to avoid carriage return
        __t=$(adb shell run-as $P "sh -c \"[ -f $1 ] && printf f || printf d\"")
        echo $__t
    }
    
    function list_and_pull()
    {
        t=$(file_type $1)
        if [ $t == d ]; then
            for f in $(adb shell run-as $P ls $1)
            do
                # the carriage return output from adb shell should
                # be removed
                mkdir -p $(echo -e $1 |sed $'s/\r//')
                list_and_pull $(echo -e $1/$f |sed $'s/\r//')
            done
        else
            echo pull file $1
            [ ! -e $(dirname $1) ] && mkdir -p $(dirname $1)
            $(adb exec-out run-as $P cat $1 > $1)
        fi
    }
    
    [ ! -z $D ] && list_and_pull $D
    [ ! -z $F ] && list_and_pull $F
    

    Hope it would be helpful. This script is also available at gist.

    Typical usage is

    $ ./exec_out.sh -p com.example.myapplication -d databases
    

    then it will extract all files under your apps databases directory, which is /data/data/com.example.myapplication/databases, into current directory.

    0 讨论(0)
  • 2020-11-22 11:46

    Much much simpler approach to download the file onto your local computer:

    In your PC shell run:

    adb -d shell 'run-as <package_name> cat /data/data/<package_name>/databases/<db_name>' > <local_file_name>
    
    0 讨论(0)
  • 2020-11-22 11:47

    Here's a solution that works on a device running Android 5.1. The following example is for Windows.

    You need sed (or sed.exe on windows, e.g. from cygwin.) ( On Unix, it'll just be there ;) ). To remove bad '\r' characters, at least on windows.

    Now just run the following command:

    adb exec-out "run-as com.yourcompany.yourapp /data/data/com.yourcompany.yourapp/databases/YourDatabaseName" | c:\cygwin\bin\sed.exe 's/\x0D\x0A/\x0A/'>YourDatabaseName.db
    

    The sed command strips out trailing /r characters.

    Of course you should replace "com.yourcompany.yourapp" with the package name of the app and "YourDatabaseName" with the name of the database in the app.

    0 讨论(0)
  • 2020-11-22 11:50
    #!/bin/bash
    #export for adb
    export PATH=$PATH:/Users/userMe/Library/Android/sdk/platform-tools
    export PATH=$PATH:/Users/userMe/Library/Android/sdk/tools
    
    adb -d shell 'run-as com.android.app  cp /data/data/com.android.app/files/db.realm /sdcard'
    adb pull sdcard/db.realm /Users/userMe/Desktop/db
    

    You can use this script for get Realm database.

    0 讨论(0)
提交回复
热议问题