Android (至少在安卓2.3上)

Android (至少在安卓2.3上),android,adb,Android,Adb,chmod 755一直以来都在复制文件(但如果您打算继续使用该设备,您应该在之后恢复权限)。如果您使用的是Mac电脑和三星手机,这就是您必须做的事情(因为在三星电脑上以的身份运行,在Mac电脑上以的身份运行) 备份应用程序的数据目录 adb备份-f/Users/username/Desktop/data.ab com.示例 您将被要求在手机中输入密码进行加密,请勿输入任何密码。只需点击“备份我的数据”。看 成功备份后,您将在桌面上看到data.ab文件。现在我们需要将其转换为tar格式 为此,请

chmod 755
一直以来都在复制文件(但如果您打算继续使用该设备,您应该在之后恢复权限)。

如果您使用的是Mac电脑和三星手机,这就是您必须做的事情(因为
在三星电脑上以
的身份运行,在Mac电脑上以的身份运行)

  • 备份应用程序的数据目录
    adb备份-f/Users/username/Desktop/data.ab com.示例

  • 您将被要求在手机中输入密码进行加密,请勿输入任何密码。只需点击“备份我的数据”。看

  • 成功备份后,您将在桌面上看到
    data.ab
    文件。现在我们需要将其转换为
    tar
    格式

  • 为此,请使用Android备份提取器

  • 下载它,您将看到
    abe.jar
    文件。将其添加到PATH变量中

  • 执行此命令以生成tar文件:
    java-jar abe.jar解包/Users/username/Desktop/data.ab/Users/username/Desktop/data.tar

  • 提取data.tar文件以访问所有文件

  • 你可以做:

    adb拉/存储/模拟/0/Android/data//


    Android Studio的较新版本包括设备文件浏览器,我发现它是一种方便的GUI方法,可以从我的开发Nexus 7下载文件

    您必须确保已在设备上启用USB调试

  • 单击视图>工具窗口>设备文件资源管理器,或单击工具窗口栏中的设备文件资源管理器按钮打开设备文件资源管理器
  • 从下拉列表中选择一个设备
  • 在“文件资源管理器”窗口中与设备内容交互。右键单击文件或目录以创建新文件或目录,将所选文件或目录保存到计算机,上载、删除或同步。双击一个文件以在Android Studio中打开它

    Android Studio将以这种方式打开的文件保存在项目外部的临时目录中。如果您对使用设备文件资源管理器打开的文件进行修改,并希望将更改保存回设备,则必须手动将修改后的文件版本上载到设备



  • 除非该设备是根目录的,否则您根本无法这样做。我希望您是错的,但以防万一,请将您的评论作为答案。你能补充一下你为什么这么认为吗?我想保存我的程序有缺陷版本保存的所有垃圾文件,以确保我即将发布的程序能够优雅地处理所有类型的输入文件。这是否意味着可以将目录从world:--x复制到world:r-x足够长,以便能够获取文件?@Knossos尽管如此这是我的应用程序,用户能够保存应用程序存储在其设备上的私有数据副本是否合法?毕竟,数据可能属于设备所有者,而不是应用程序作者。问题是如何区分所有者和试图与应用程序私有数据交互的恶意应用程序/程序。(其中可能包含用户个人数据)在调试时更改权限是可以的,但在即将发布时,这样做会破坏默认提供的保护(防止其他应用访问/弄乱文件)。因此,开发人员可以访问文件,即使它们只是用户可读/写的,这是一种更理想的方式。
    bs=24 skip=1
    bs=1 skip=24
    (在我的系统上,38.6mb/s vs 1.7mb/s):)Python替代方案,用于openssl没有使用zlib编译的情况:
    dd if=data.ab bs=1 skip=24 | Python-c"输入zlib,sys,;sys.stdout.write(zlib.decompress(sys.stdin.read())“| tar-xvf-
    (来自上述源代码)我在MacBook上使用
    dd
    命令从来没有成功过。相反,我使用
    java-jar./abe.jar unpack data.ab data.tar
    。你也可以从下载abe实用程序,我注意到我必须强制关闭我要备份其数据的应用程序,否则备份是空的!(Android 4.4.2)这与清单显示android:allowBackup=“false”时的效果相同“更好的是,直接将文件解压缩到本地目录:
    dd if=myAndroidBackup.ab bs=24 skip=1 | openssl zlib-d | tar-x
    最好的部分是当您不给出参数,然后用
    rm/sdcard/
    替代时,幸运的是它不是
    -rf
    。您可以直接在主机上搜索文件:“adb shell运行为com.whater.Fnord cat/data/data/com.whater.Fnord/databases/logging.db>/tmp/foo”(其中/tmp/foo是主机上的一个文件,而不是android设备)刚刚实现@dave thomas不久前解决了这个问题。删除我的否决票。或者不删除:-(“除非编辑此答案,否则您的投票现在被锁定。“TBH我不明白这件事有多麻烦。原始脚本永远不会删除目录(缺少-rf开关),除非它是空的。我没有检查,但即使目录是空的,我也怀疑脚本是否会删除目录,因为它是一个装载点。脚本看起来很危险,但从来都不是…你的Mac版本可以工作!注意:
    adb backup
    dd
    tar转换步骤在工作时不提供任何状态,并且可以执行m如果您有大量数据,则需要几分钟。请耐心等待!我收到:“zlib.error:error-3,同时解压缩数据:不正确的标题检查”但是,我的备份要求密码进行加密。此python方法不要求密码对备份进行解密。上面示例中的注释中的abe.jar要求密码,但在使用该方法解构后,我没有获得所有文件。我对加密备份的第二次尝试abe.jar成功。正是该命令导致了我的db f我很想被腐蚀,但我和followi一起工作
    adb pull /data/data/com.corp.appName/files/myFile.txt myFile.txt
    
    failed to copy '/data/data/com.corp.appName/files/myFile.txt myFile.txt' to 'myFile.txt': Permission denied
    
    adb shell
    run-as com.corp.appName
    cat files/myFile.txt > myFile.txt
    
    adb backup  -f myFiles com.corp.appName
    
    adb backup  -f myAndroidBackup.ab  com.corp.appName
    
    dd if=myAndroidBackup.ab bs=4K iflag=skip_bytes skip=24 | openssl zlib -d > myAndroidBackup.tar
    
    File myFile = ...;
    myFile.setReadable(true, false); // readable, not only for the owner
    
    #!/bin/sh
    
    if [ -z "$1" ]; then 
        echo "Sorry script requires an argument for the file you want to pull."
        exit 1
    fi
    
    adb shell "run-as com.corp.appName cat '/data/data/com.corp.appNamepp/$1' > '/sdcard/$1'"
    adb pull "/sdcard/$1"
    adb shell "rm '/sdcard/$1'"
    
    ./pull.sh files/myFile.txt
    ./pull.sh cache/someCachedData.txt
    
    $ adb shell
    $ run-as {app-package-name}
    $ cd /data/data/{app-package-name}
    $ chmod 777 {file}
    $ cp {file} /mnt/sdcard/
    
    $ adb pull /mnt/sdcard/{file}
    
    adb -d shell "run-as com.example.test cat /data/data/com.example.test/databases/data.db" > data.db
    
     adb backup -f backup com.mypackage.myapp
    
    dd if=backup bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" > backup.tar
    
     tar xvf backup.tar
    
    #!/bin/bash
    #
    # Strict mode: http://redsymbol.net/articles/unofficial-bash-strict-mode/
    set -euo pipefail
    IFS=$'\n\t'
    
    # 
    # Usage: script -f fileToPull -p packageName
    # 
    
    # This script is for pulling private files from an Android device
    # using run-as. Note: not all devices have run-as access, and
    # application must be a debug version for run-as to work.
    # 
    # If run-as is deactivated on your device use one of the
    # alternative methods here:
    # http://stackoverflow.com/questions/15558353/how-can-one-pull-the-private-data-of-ones-own-android-app
    # 
    # If you have encrypted backup files use:
    # sourceforge.net/projects/adbextractor/files/?source=navbar 
    # From comments in the accepted answer in the above SO question
    # 
    # If your files aren't encrypted use the accepted answer 
    # ( see comments and other answers for OSX compatibility )
    # 
    # This script is open to expansions to allow selecting 
    # device used. Currently first selected device from
    # adb shell will be used.
    
    #Check we have one connected device
    adb devices -l | grep -e 'device\b' > /dev/null
    
    if [ $? -gt 0 ]; then
        echo "No device connected to adb."
        exit 1
    fi
    
    # Set filename or directory to pull from device
    # Set package name we will run as
    while getopts f:p: opt; do
        case $opt in
            f)
                fileToPull=$OPTARG
                ;;
            p)
                packageName=$OPTARG
                ;;
        esac
    done;
    
    # Block file arg from being blank
    if [ -z "$fileToPull" ]; then
        echo "Please specify file or folder to pull with -f argument"
        exit 1
    fi
    
    # Block package name arg from being blank
    if [ -z "$packageName" ]; then
        echo "Please specify package name to run as when pulling file"
        exit 1
    fi
    
    # Check package exists
    adb shell pm list packages | grep "$packageName" > /dev/null
    if [ $? -gt 0 ]; then
        echo "Package name $packageName does not exist on device"
        exit 1
    fi
    
    # Check file exists and has permission with run-as
    fileCheck=`adb shell "run-as $packageName ls $fileToPull"`
    if [[ $fileCheck =~ "Permission denied" ]] || [[ $fileCheck =~ "No such file or directory" ]]; then
        echo "Error: $fileCheck"
        echo "With file -> $fileToPull"
        exit 1
    fi
    
    # Function to pull private file
    #
    # param 1 = package name
    # param 2 = file to pull
    # param 3 = output file
    function pull_private_file () {
    
        mkdir -p `dirname $3`
    
        echo -e "\033[0;35m***" >&2
        echo -e "\033[0;36m Coping file $2 -> $3" >&2
        echo -e "\033[0;35m***\033[0m" >&2
    
        adb shell "run-as $1 cat $2" > $3
    }
    
    # Check if a file is a directory
    # 
    # param 1 = directory to check
    function is_file_dir() {
    
        adb shell "if [ -d \"$1\" ]; then echo TRUE; fi"
    }
    
    # Check if a file is a symbolic link
    # 
    # param 1 = directory to check
    function is_file_symlink() {
    
        adb shell "if [ -L \"$1\" ]; then echo TRUE; fi"
    }
    
    # recursively pull files from device connected to adb
    # 
    # param 1 = package name
    # param 2 = file to pull
    # param 3 = output file
    function recurse_pull_private_files() {
    
        is_dir=`is_file_dir "$2"`
        is_symlink=`is_file_symlink "$2"`
    
        if [ -n "$is_dir" ]; then
    
            files=`adb shell "run-as $1 ls \"$2\""`
    
            # Handle the case where directory is a symbolic link
            if [ -n "$is_symlink" ]; then
                correctPath=`adb shell "run-as $1 ls -l \"$2\"" | sed 's/.*-> //' | tr -d '\r'`
                files=`adb shell "run-as $1 ls \"$correctPath\""`
            fi
    
            for i in $files; do
    
                # Android adds nasty carriage return that screws with bash vars
                # This removes it. Otherwise weird behavior happens
                fileName=`echo "$i" | tr -d '\r'` 
    
                nextFile="$2/$fileName"
                nextOutput="$3/$fileName"
                recurse_pull_private_files "$1" "$nextFile" "$nextOutput"
            done
        else
    
            pull_private_file "$1" "$2" "$3"
        fi
    }
    
    recurse_pull_private_files "$packageName" "$fileToPull" "`basename "$fileToPull"`"
    
    adb backup -f myAndroidBackup.ab  com.corp.appName
    
    java -jar ./abe.jar unpack myAndroidBackup.ab myAndroidBackup.tar
    
    tar xvf myAndroidBackup.tar
    
    #Check we have one connected device
    adb devices -l | grep -e 'device\b' > /dev/null
    
    if [ $? -gt 0 ]; then
        echo "No device connected to adb."
        exit 1
    fi
    
    # Set filename or directory to pull from device
    # Set package name we will run as
    while getopts f:p: opt; do
        case $opt in
            f)
                fileToPull=$OPTARG
                ;;
            p)
                packageName=$OPTARG
                ;;
        esac
    done;
    
    # Block package name arg from being blank
    if [ -z "$packageName" ]; then
        echo "Please specify package name to run as when pulling file"
        exit 1
    fi
    
    # Check package exists
    adb shell pm list packages | grep "$packageName" > /dev/null
    if [ $? -gt 0 ]; then
        echo "Package name $packageName does not exist on device"
        exit 1
    fi
    
        adb shell "run-as $packageName cp -r /data/data/$packageName/ /sdcard/$packageName"
        adb pull /sdcard/$packageName
        adb shell rm -rf /sdcard/$packageName
    
    **adb backup "-apk com.nekki.shadowfight" -f "c:\myapk\samsung2.ab"**
    
    (
        id=your.app.id &&
        dest=~/Desktop &&
        adb shell "run-as $id cp -r /data/data/$id /sdcard" &&
        adb -d pull "/sdcard/$id" "$dest" &&
        if [ -n "$id" ]; then adb shell "rm -rf /sdcard/$id"; fi
    )