이 답변은 다른 답변에 대한 나의 경험과 답변에 대한 의견을 기반으로합니다. 내 희망은 비슷한 상황에있는 누군가를 도울 수 있다는 것입니다.
터미널을 통해 OSX 에서이 작업을 수행하고 있습니다.
이전에는 Vinicius Avellar의 답변이 저에게 큰 도움이되었습니다. 나는 대부분의 시간 동안 디버그 응용 프로그램의 장치에서 데이터베이스가 필요했습니다.
오늘 저는 여러 개인 파일이 필요한 사용 사례가있었습니다 . 나는이 경우에 좋은 두 가지 해결책을 찾았습니다.
Someone Somewhere의 OSX 특정 의견과 함께 수락 된 답변을 사용하십시오. 백업을 만들고 타사 솔루션 인
sourceforge.net/projects/adbextractor/files/?source=navbar 를 사용하여 tar로 압축을 풉니 다. 이 답변의 맨 아래에이 솔루션에 대한 내 경험에 대해 더 많이 쓸 것입니다. 이것이 당신이 찾고있는 것이라면 아래로 스크롤하십시오.
내가 정착 한 더 빠른 솔루션. 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에서 보안 정책 라이브러리를 설치하는 데 필요한 오류가 발생했습니다.
마지막으로 방금 실행했습니다 ( 이전 명령을 다시 실행 한 후 )
tar xvf myAndroidBackup.tar
이제 달리기와 고양이 만 할 수 있다면 훨씬 빠르다는 점에 유의하는 것이 중요합니다. 첫째, 전체 응용 프로그램이 아닌 원하는 파일 만 가져옵니다. 둘째, 파일이 많을수록 (+ 나를위한 암호화) 전송 속도가 느려집니다. 따라서 OSX에서 run-as가없는 경우이 방법을 아는 것이 중요하지만 스크립트는 디버그 응용 프로그램을 위해 먼저 이동해야합니다.
오늘 방금 작성했고 몇 번 테스트 했으니 버그가 있으면 알려주세요!