106

を使用して単一のファイルをプルしようとしています

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

デバイスで USB デバッグが有効になっているにもかかわらず。

古風なルートで問題を回避できます

adb shell
run-as com.corp.appName
cat files/myFile.txt > myFile.txt

しかし、これは複数のファイルでは扱いにくいです。

ディレクトリ /data/data/com.corp.appName/files を MacBook にプルするにはどうすればよいですか?

これを直接または `/storage/sdcard0/myDir (Android File Transfer を続行できる場所) のトランジットを介して行うことは問題ありません。

追加コメント

走っているだけなのかもしれません

adb backup  -f myFiles com.corp.appName

私が探しているファイルを生成します。その場合、結果のバックアップを untar/unzip する方法を探しています!

4

14 に答える 14

121

adb backup は、Android 固有のアーカイブを書き込みます。

adb backup  -f myAndroidBackup.ab  com.corp.appName

このアーカイブは、次を使用して tar 形式に変換できます。

dd if=myAndroidBackup.ab bs=4K iflag=skip_bytes skip=24 | openssl zlib -d > myAndroidBackup.tar

参照:

http://nelenkov.blogspot.ca/2012/06/unpacking-android-backups.html

そのリンクで「更新」を検索します。


または、Android バックアップ エクストラクタを使用して、Android バックアップ ( .ab) ファイルからファイルを抽出します。

于 2013-03-21T22:17:54.223 に答える
59

私は同じ問題を抱えていましたが、次のように実行して解決しました:

$ 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}
于 2015-06-05T06:54:26.357 に答える
35

これが私のために働いたものです:

adb -d shell "run-as com.example.test cat /data/data/com.example.test/databases/data.db" > data.db

データベースをローカルファイルに直接出力しています。

于 2015-07-19T18:03:50.150 に答える
2

この回答は、他の回答での私の経験と回答のコメントに基づいています。私の希望は、同じような状況で誰かを助けることができることです.

私はターミナル経由でOSX上でこれを行っています。

以前は、Vinicius Avellar の回答がうまく機能していました。ほとんどの場合、デバッグ アプリケーションからデバイスのデータベースを必要とするだけでした。

今日、複数のプライベート ファイルが必要なユース ケースがありました。この場合にうまく機能する2つのソリューションになりました。

  1. 受け入れられた回答を、SomewhereのOSX固有のコメントとともに使用してください。バックアップを作成し、サード パーティのソリューション sourceforge.net/projects/adbextractor/files/?source=navbarを使用して tar に解凍します。この回答の最後に、このソリューションでの私の経験について詳しく書きます。これが探しているものである場合は、下にスクロールします。

  2. 私が解決したより速い解決策。タマスの回答に似た複数のファイルをプルするためのスクリプトを作成しました。私のアプリはデバッグアプリであり、デバイスで run-as にアクセスできるため、この方法で実行できます。run-as にアクセスできない場合、この方法は OSX では機能しません。

これは、この素晴らしい質問を調査している読者であるあなたと共有する複数のプライベート ファイルをプルするためのスクリプトです ;) :

#!/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"`"

要点: https://gist.github.com/davethomas11/6c88f92c6221ffe6bc26de7335107dd4


方法 1 に戻る、Android Backup Extractorを使用してバックアップを復号化する

Mac で行った手順と遭遇した問題は次のとおりです。

最初に、バックアップをキューに入れました (そして、バックアップを暗号化するためのパスワードを設定しました。デバイスにはそれが必要でした):

adb backup -f myAndroidBackup.ab  com.corp.appName

次に、ここから abe.jar だけをダウンロードしました: https://sourceforge.net/projects/adbextractor/files/abe.jar/download

次に私が走った:

java -jar ./abe.jar unpack myAndroidBackup.ab myAndroidBackup.tar

この時点で、エラーメッセージが表示されました。アーカイブが暗号化されているため、セキュリティ ポリシー ライブラリをインストールする必要があるというエラーが java から返されました。

  • そこで、http: //www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html にアクセスして、必要なセキュリティ ポリシー jar をダウンロードしました。私の場合、インストール手順でjarファイルを配置する場所が間違っていることがわかりました。適切な場所は<java-home>/lib/securityです。最初にそれらを配置しましたが、それでもエラーメッセージが表示されます。そこで調査したところ、Java 1.8 を搭載した私の Mac では、それらを配置する正しい場所は<java-home>/jre/lib/securityでした。元のポリシー jar を必ずバックアップして、そこに置きました。Vola abe.jar でパスワードを入力し、tar ファイルに復号化できました。

最後に、実行しました(前のコマンドを再度実行した後

tar xvf myAndroidBackup.tar

run-as と cat だけで実行できる場合は、はるかに高速であることに注意することが重要です。1 つは、アプリケーション全体ではなく、必要なファイルのみを取得することです。2 つ目は、ファイルが多いほど (+ 暗号化)、転送が遅くなります。したがって、OSX で run-as を使用していない場合は、この方法を知っておくことが重要ですが、デバッグ アプリケーションの場合は、スクリプトを最初に実行する必要があります。

今日書いたばかりで数回テストしたので、バグがあればお知らせください。

于 2016-10-12T23:10:27.397 に答える
1

Dave Thomas スクリプトから始めて、2 つの問題を克服するための独自のソリューションを作成できました。

  1. バックアップにはマニフェスト ファイルのみが含まれていました
  2. Dave Thomas と一緒に入手したバイナリ ファイルを読み取ることができない

これは私のスクリプトで、アプリのデータを SD カードにコピーしてプルします

#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
于 2017-03-05T11:53:58.557 に答える