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

后端 未结 12 2357
清酒与你
清酒与你 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: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.

提交回复
热议问题