自分のAndroidアプリの(プライベート)データをプルするにはどうすればよいですか?


97

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

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する方法を探しています!


5
デバイスがルート化されていない限り、それを行うことはできません。
323go

あなたが間違っていることを願っていますが、念のため、コメントを回答にしてください。あなたがそう思う理由をバックアップするために、何らかの参照を追加できますか?私のプログラムのバグのあるバージョンが保存したすべてのジャンクファイルを保存して、リリースに近いプログラムがあらゆる種類の入力ファイルを適切に処理できるようにしたいと思います。
Calaf 2013年

1
それは、ディレクトリをworld:-xからworld:rxに、ファイルをフェッチできるほど長くchmodできることを意味しますか?
Calaf 2013年

1
@Knossosそれが私のアプリであるにもかかわらず、アプリがデバイスに保存したプライベートデータのコピーをユーザーが保存できるようにすることは合法ではありませんか?結局のところ、データはおそらくアプリの作成者ではなくデバイスの所有者に属しています。
Calaf 2013年

1
問題は、所有者と悪意のあるアプリ/プログラムをどのように区別して、アプリのプライベートデータとやり取りするかです。(ユーザーの個人データが含まれる可能性があります)
Knossos

回答:


101

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)ファイルからファイルを抽出します。


5
bs=24 skip=1bs=1 skip=24(私のシステムでは、38.6 MB /秒vs 1.7 MB /秒)よりもはるかに高速です:)
netvope

18
opensslがzlibでコンパイルされていない場所のPythonの代替:(dd if=data.ab bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" | tar -xvf -上記のソースから)
OJFord '25

6
dd私のMacBook のコマンドは、これまで成功したことはありません。代わりに、私はを使用しますjava -jar ./abe.jar unpack data.ab data.tar。abeユーティリティは、sourceforge.net
Someone Somewhere

3
また、バックアップしたいデータのアプリを強制終了する必要があることに気づきました。それ以外の場合、バックアップは空です!(Android 4.4.2)これは、マニフェストが表示する場合と同じ効果ですandroid:allowBackup="false"
Someone Somewhere

2
さらに良いことに、直接ローカルディレクトリにファイルを抽出しますdd if=myAndroidBackup.ab bs=24 skip=1 | openssl zlib -d | tar -x
mreichelt

50

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

$ 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}

1
ありがとう!また、「cp -r」を使用して再帰的なコピーにする必要があります。stackoverflow.com/questions/39961621/...
朱西西

31

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

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

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


3
正確に、このコマンドは私のdbファイルを破損させました。しかし、私は次の手順で動作するようにしました:------ adb shell ------シェル実行run-as com.example.test 内------ シェル実行内cat ...db > /mnt/sdcard/file.db------ adb pull /mnt/sdcard/file.db .------ end (申し訳ありませんが、改行は機能していません)
Kirill Oficerov

@KirillOficerovこれらのコマンドを1行で記述できればよいと思います
emen

1つのファイルが必要な場合に最適です。データベースにこれを使用しています。現在、複数のファイルが必要なケースに直面しています。
Dave Thomas

何らかの理由で使用することadb shellはうまくいきませんでしたが、この答えに従ってadb exec-outそれを使用することはうまくいきました!
EpicPandaForce 2017年

21

MacOSXでは、CalafとOllie Fordからの回答を組み合わせることで、以下がうまくいきました。

コマンドラインで(adbがパスに含まれていることを確認してください。私のものは〜/ Library / Android / sdk / platform-tools / adbにあります)、Androidデバイスがプラグインされ、USBデバッグモードで、次のコマンドを実行します。

 adb backup -f backup com.mypackage.myapp

Androidデバイスから、データをバックアップする許可を求められます。「マイデータをバックアップ」を選択します

しばらくお待ちください。

ファイルのバックアップは、adbを実行したディレクトリに表示されます。

今実行します:

dd if=backup bs=1 skip=24 | python -c "import zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" > backup.tar

これで、次のようにuntarできるbackup.tarファイルが作成されます。

 tar xvf backup.tar

そして、あなたのアプリケーションによって保存されたすべてのファイルを見てください。


Macのバージョンが機能します!注:両方adb backupddtar変換ステップは、作業中はステータスを提供せず、大量のデータがある場合は数分かかる場合があります。我慢して!
MechEthan

2
「zlib.error:エラー-3データの解凍中にエラーが発生しました:ヘッダーチェックが正しくありません」私のバックアップは暗号化するパスワードを要求しています。このpythonメソッドは、バックアップを復号化するためのパスワードを要求しません。上記の例のコメントのabe.jarはパスワードを要求しますが、その方法を使用してuntarした後、すべてのファイルを取得できませんでした。
Dave Thomas

暗号化されたバックアップでabe.jarを使用した2回目の試行は成功しました。
Dave Thomas

7

Android Studioの新しいバージョンには、開発中のNexus 7からファイルをダウンロードするための便利なGUIメソッドであることがわかったDevice File Explorerが含まれています。

デバイスでUSBデバッグが有効になっていることを確認する必要があります

  1. [表示]> [ツールウィンドウ]> [デバイスファイルエクスプローラー]をクリックするか、ツールウィンドウバーの[デバイスファイルエクスプローラー]ボタンをクリックして、デバイスファイルエクスプローラーを開きます。
  2. ドロップダウンリストからデバイスを選択します。
  3. ファイルエクスプローラウィンドウでデバイスのコンテンツを操作します。ファイルまたはディレクトリを右クリックして、新しいファイルまたはディレクトリを作成し、選択したファイルまたはディレクトリをマシンに保存し、アップロード、削除、または同期します。ファイルをダブルクリックして、Android Studioで開きます。

    Android Studioは、この方法で開いたファイルをプロジェクト外の一時ディレクトリに保存します。デバイスファイルエクスプローラーを使用して開いたファイルに変更を加え、変更をデバイスに保存する場合は、変更したバージョンのファイルをデバイスに手動でアップロードする必要があります。

ファイルエクスプローラー

完全なドキュメント


6

以下のこのシェルスクリプトを使用できます。adb backupツールとは異なり、アプリのキャッシュからファイルをプルすることもできます。

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

10
最良の部分は、引数を指定せずにrm /sdcard/代入する場合です-rf。幸い、そうではありません。
TWiStErRob 2014年

3
ホスト上のファイルに直接catするだけです: "adb shell run-as com.whatever.Fnord cat /data/data/com.whatever.Fnord/databases/logging.db> / tmp / foo"(where / tmp / fooはホストマシン上のファイルであり、Androidデバイスではありません)
James Moore

つい最近、@ dave-thomasが問題を修正したことを認識しました。私の反対票を削除します。
Don Hatch、

かどうか:-( "この回答が編集されない限り、投票はロックされます。"
Don Hatch

TBH私はこれについての大騒ぎを理解していません。(元の)スクリプトは、空でない限り、ディレクトリを削除することはありません(-rfスイッチがありません)。チェックしていませんが、ディレクトリが空であっても、スクリプトがディレクトリをマウントポイントとして削除することはないと思います。台本は危険そうに見えましたが、決して危険ではありませんでした...
Tamas

5

あなたは、Macマシンとサムスンの携帯電話を使用している場合、これは(以降、あなたがしなければならないものですrun-as 仕事がないサムスンにしてzlib 動作しない Mac上で)

  1. アプリのデータディレクトリのバックアップを取る adb backup -f /Users/username/Desktop/data.ab com.example

  2. 電話で暗号化するためのパスワードを求められます。何も入力しないでください。「データのバックアップ」をタップしてください。バックアップを取る方法を参照してください

  3. バックアップが完了するとdata.ab、デスクトップにファイルが表示されます。これをtarフォーマットに変換する必要があります。

  4. これにはAndroid Backup Extractorを使用します。ダウンロード | ソースコード

  5. それをダウンロードすると、abe.jarファイルが表示されます。これをPATH変数に追加します。

  6. これを実行してtarファイルを生成します。java -jar abe.jar unpack /Users/username/Desktop/data.ab /Users/username/Desktop/data.tar

  7. data.tarファイルを抽出してすべてのファイルにアクセスします


2
これに正確に従いdata.tardata.tar.cpgz@ henryに抽出しました
user-

2

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

端末を介してOSXでこれを行っています。

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

今日、私には複数のプライベートファイルが必要な使用例がありました。この場合、2つの解決策がうまくいきました。

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

  2. 私が解決したより速い解決策。タマスの答えに似た複数のファイルをプルするためのスクリプトを作成しました。私のアプリはデバッグアプリであり、デバイスでrun-asにアクセスできるため、この方法で実行できます。runへのアクセス権がない場合、この方法は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を実行していない場合は、この方法を知っていることが重要ですが、スクリプトは最初にデバッグアプリケーションのgotoである必要があります。

今日私が書いて数回テストしたばかりなので、バグがあれば通知してください!


1
メソッド#1を使用した応答のおかげで、実稼働のルート権限を取得されていないデバイスにインストールされているデバッグ対象のアプリからパッケージバックアップを取得して調べることができましたが、バックアップにはマニフェストファイルのみが含まれています。方法#2では、すべてのアプリのデータをダウンロードしましたが、バイナリ(SQLiteファイルなど)を読み取ることができません。私のために働いたあなたのスクリプトに基づくソリューションを追加します。
Paolone

1

次のコードを追加して適切な権限を設定した後:

File myFile = ...;
myFile.setReadable(true, false); // readable, not only for the owner

adb pull 必要に応じて機能します。

File.setReadable()を参照してください


デバッグ中にアクセス許可を変更することは問題ありませんが、リリース近くのある時点で変更すると、デフォルトで提供される保護が無効になります(他のアプリがファイルにアクセスしたりファイルをいじったりしないようにするため)。したがって、たとえユーザーが読み取り/書き込み可能であっても、開発者がファイルにアクセスする方法がより望ましいです。
Calaf 2013

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

1

タマスの答えと同様に、これはMac OS Xがアプリのすべてのファイルをyour.app.idデバイスからフェッチして保存する(この場合)ためのワンライナーです~/Desktop/your.app.id

(
    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
)
  • -dエミュレーターからプルするを除外する
  • セッション変数を踏みつけません
  • ブロック全体をTerminal.appに貼り付けることができます(または必要に応じて改行を削除します)

0

apkでゲームデータをバックアップしました。ヌガーワンプラス2。

**adb backup "-apk com.nekki.shadowfight" -f "c:\myapk\samsung2.ab"**

adb backup -f myapp.ab -apk com.myapp # backup on one device adb restore myapp.ab # restore to the same or any other device
Steven Linn

0

それは、ディレクトリをworld:-xからworld:rxに、ファイルをフェッチできるほど長くchmodできることを意味しますか?

はい、正確に。奇妙なことに、xビットが設定されているファイルも必要です。(少なくともAndroid 2.3では)

chmod 755 ずっと下まで作業してファイルをコピーしました(ただし、デバイスを引き続き使用する場合は、後でアクセス許可を元に戻す必要があります)。


0

できるよ:

adbプル/ storage / emulated / 0 / Android / data //


2
誤解しないでください、しかしあなたは質問を正しく読みましたか?OPは「プライベート」データを引くため求めているしないで「国民
baburaoを
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.