자신의 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 파일 전송을 계속할 수있는 곳)에서 전송을 통해이 작업을 수행하는 것이 좋습니다.

추가 설명

그냥 달리는 것일 수 있습니다.

adb backup  -f myFiles com.corp.appName

내가 찾고있는 파일을 생성합니다. 이 경우 결과 백업을 압축 해제 / 압축 해제하는 방법을 찾고 있습니다!


5
장치가 루팅되지 않는 한 그렇게 할 수 없습니다.
323go

틀렸기를 바라지 만 만일의 경우에 대비하여 댓글을 이동하여 답변 해주십시오. 그렇게 생각하는 이유를 뒷받침하기 위해 어떤 종류의 참조를 추가 할 수 있습니까? 내 프로그램의 버그 버전이 저장 한 모든 정크 파일을 저장하여 출시에 가까운 프로그램이 모든 종류의 입력 파일을 정상적으로 처리 할 수 ​​있도록하고 싶습니다.
Calaf 2013 년

1
그것은 파일을 가져올 수있을만큼 충분히 오랫동안 world :-x에서 world : rx로 디렉토리를 chmod 할 수 있다는 것을 의미합니까?
Calaf 2013 년

1
@Knossos 내 앱 임에도 불구하고 사용자가 앱이 장치에 저장 한 개인 데이터의 사본을 저장할 수있는 것이 합법적이지 않습니까? 결국 데이터는 아마도 앱 작성자가 아니라 장치 소유자의 것입니다.
Calaf 2013 년

1
문제는 소유자와 악성 앱 / 프로그램을 어떻게 구별하여 앱 개인 데이터와 인터페이스를 시도하는지입니다. (A 사용자에게 개인 데이터를 가질 수있는)
크노소스

답변:


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 / s vs 1.7 MB / s) 보다 훨씬 빠릅니다. :)
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

6
dd직장에서 MacBook 의 명령으로 성공한 적이 없습니다 . 대신 java -jar ./abe.jar unpack data.ab data.tar. 당신은에서 아베 유틸리티를 다운로드 할 수 있습니다 sourceforge.net/projects/adbextractor/files/?source=navbar
어딘가의 누군가가

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 2014

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 2016 년

@KirillOficerov이 명령을 한 줄로 작성할 수 있다면 좋을 것입니다
emen

1 개의 파일이 필요할 때 좋습니다. 이것을 데이터베이스에 사용했습니다. 이제 여러 파일이 필요한 경우에 직면했습니다.
데이브 토마스

어떤 이유로 사용하는 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

이제 다음과 같이 압축을 풀 수있는 backup.tar 파일이 생겼습니다.

 tar xvf backup.tar

그리고 응용 프로그램에 저장된 모든 파일을 볼 수 있습니다.


Mac 버전이 작동합니다! 참고 : adb backupddtar 변환 단계는 모두 작업하는 동안 상태를 제공하지 않으며 데이터가 많은 경우 몇 분 정도 걸릴 수 있습니다. 인내하십시오!
MechEthan

2
"zlib.error : 데이터 압축 해제 중 오류 -3 : 잘못된 헤더 확인"메시지가 나타납니다. 백업에서 암호화 할 암호를 요청합니다. 이 파이썬 방법은 백업 암호를 해독하기 위해 암호를 요구하지 않습니다. 위 예제의 주석에있는 abe.jar는 암호를 요청하지만 해당 방법을 사용하여 압축을 푼 후 모든 파일을 가져 오지 못했습니다.
데이브 토마스

암호화 된 백업에서 abe.jar을 사용한 두 번째 시도가 작동했습니다.
Dave Thomas

7

Android Studio의 최신 버전에는 개발 Nexus 7에서 파일을 다운로드하는 편리한 GUI 방법 인 Device File Explorer 가 포함 되어 있습니다.

장치에서 USB 디버깅을 활성화했는지 확인해야합니다.

  1. 보기> 도구 창> 장치 파일 탐색기를 클릭하거나 도구 창 표시 줄에서 장치 파일 탐색기 버튼을 클릭하여 장치 파일 탐색기를 엽니 다.
  2. 드롭 다운 목록에서 장치를 선택합니다.
  3. 파일 탐색기 창에서 장치 콘텐츠와 상호 작용합니다. 파일 또는 디렉토리를 마우스 오른쪽 버튼으로 클릭하여 새 파일 또는 디렉토리를 생성하고 선택한 파일 또는 디렉토리를 컴퓨터에 저장하고 업로드, 삭제 또는 동기화합니다. 파일을 두 번 클릭하여 Android Studio에서 엽니 다.

    Android 스튜디오는 이런 방식으로 여는 파일을 프로젝트 외부의 임시 디렉토리에 저장합니다. 장치 파일 탐색기를 사용하여 연 파일을 수정하고 변경 사항을 다시 장치에 저장하려면 수정 된 버전의 파일을 장치에 수동으로 업로드해야합니다.

파일 탐색기

전체 문서


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

3
다음과 같이 호스트의 파일로 바로 이동할 수 있습니다. "adb shell run-as com.whatever.Fnord cat /data/data/com.whatever.Fnord/databases/logging.db> / tmp / foo"(여기서 / tmp / foo는 호스트 컴퓨터에있는 파일이 아닌 안드로이드 장치)이다
제임스 무어

방금 @ dave-thomas가 얼마 전에 문제를 해결했음을 깨달았습니다. 내 반대표를 제거합니다.
Don Hatch

그렇지 않으면 :-( "이 답변이 수정되지 않는 한 귀하의 투표는 현재 잠겨 있습니다."
Don Hatch

TBH 나는 이것에 대한 소란을 이해하지 못합니다. (원본) 스크립트는 비어 있지 않는 한 디렉토리를 삭제하지 않았을 것입니다 (-rf 스위치 누락). 확인하지 않았지만 디렉토리가 비어 있어도 스크립트가 마운트 지점이므로 디렉토리를 삭제하는지 의심합니다. 이 스크립트는 위험한 모습,하지만 ... 결코 없었다
타마스

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
이것을 정확히 따르고 @henry data.tar에 대한 추출data.tar.cpgz
user-44651

2

이 답변은 다른 답변에 대한 나의 경험과 답변에 대한 의견을 기반으로합니다. 내 희망은 비슷한 상황에있는 누군가를 도울 수 있다는 것입니다.

터미널을 통해 OSX 에서이 작업을 수행하고 있습니다.

이전에는 Vinicius Avellar의 답변이 저에게 큰 도움이되었습니다. 나는 대부분의 시간 동안 디버그 응용 프로그램의 장치에서 데이터베이스가 필요했습니다.

오늘 저는 여러 개인 파일이 필요한 사용 사례가있었습니다 . 나는이 경우에 좋은 두 가지 해결책을 찾았습니다.

  1. Someone Somewhere의 OSX 특정 의견과 함께 수락 된 답변을 사용하십시오. 백업을 만들고 타사 솔루션 인 sourceforge.net/projects/adbextractor/files/?source=navbar 를 사용하여 tar로 압축을 풉니 다. 이 답변의 맨 아래에이 솔루션에 대한 내 경험에 대해 더 많이 쓸 것입니다. 이것이 당신이 찾고있는 것이라면 아래로 스크롤하십시오.

  2. 내가 정착 한 더 빠른 솔루션. Tamas의 답변과 유사한 여러 파일을 가져 오는 스크립트를 만들었습니다. 내 앱이 디버그 앱이고 내 기기에서 실행 도구에 액세스 할 수 있기 때문에 이런 방식으로 할 수 있습니다. 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 파일을 넣을 잘못된 위치를 알려주었습니다. 적절한 위치는 <java-home> / lib / security 입니다. 먼저 거기에 넣었 는데도 여전히 오류 메시지가 나타납니다. 그래서 조사한 결과 Java 1.8이 설치된 Mac에서 올바른 위치는 <java-home> / jre / lib / security 입니다. 원래 정책 항아리를 백업하고 거기에 두었습니다. Vola abe.jar로 암호를 입력하고 tar 파일로 해독 할 수있었습니다.

마지막으로 방금 실행했습니다 ( 이전 명령을 다시 실행 한 후 )

tar xvf myAndroidBackup.tar

이제 달리기와 고양이 만 할 수 있다면 훨씬 빠르다는 점에 유의하는 것이 중요합니다. 첫째, 전체 응용 프로그램이 아닌 원하는 파일 만 가져옵니다. 둘째, 파일이 많을수록 (+ 나를위한 암호화) 전송 속도가 느려집니다. 따라서 OSX에서 run-as가없는 경우이 방법을 아는 것이 중요하지만 스크립트는 디버그 응용 프로그램을 위해 먼저 이동해야합니다.

오늘 방금 작성했고 몇 번 테스트 했으니 버그가 있으면 알려주세요!


1
방법 # 1에 대한 귀하의 응답 덕분에 프로덕션 비 루팅 장치에 설치된 디버그 대상 앱에서 패키지 백업을 가져와 탐색 할 수 있었지만 백업에는 매니페스트 파일 만 포함되어 있습니다. 방법 # 2로 모든 앱의 데이터를 다운로드했지만 바이너리 (예 : SQLite 파일)를 읽을 수 없습니다. 나를 위해 일한 스크립트를 기반으로 솔루션을 추가합니다.
Paolone 2017 년

1

다음 코드를 추가하여 올바른 권한을 설정 한 후 :

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

adb pull 원하는대로 작동합니다.

File.setReadable () 참조


디버깅하는 동안 권한을 변경하는 것은 괜찮지 만 릴리스가 가까워지면 기본적으로 제공되는 보호 기능이 무효화됩니다 (다른 앱이 파일에 액세스하거나 방해하지 못하도록 방지). 따라서 사용자가 읽기 / 쓰기 만 가능하더라도 개발자가 파일에 액세스하는 방법이 더 바람직합니다.
Calaf

1

데이브 토마스 스크립트 시작하기 저는 두 가지 문제를 극복하기 위해 저만의 솔루션을 작성할 수있었습니다.

  1. 내 백업에는 매니페스트 파일 만 포함되어 있습니다.
  2. 이진 파일을 읽을 수없는 데이브 토마스와 함께 가져 왔습니다.

이것은 앱 데이터를 sdcard에 복사 한 다음 가져 오는 스크립트입니다.

#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

Tamas의 답변 과 유사하게 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 파일을 복사하기 위해 끝까지 작업했습니다 (하지만 장치를 계속 사용하려는 경우 나중에 권한을 되돌려 야합니다).


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.