Ця відповідь заснована на моєму досвіді інших відповідей та коментарях у відповідях. Я сподіваюся, що можу допомогти комусь у подібній ситуації.
Я роблю це на OSX через термінал.
Раніше відповідь Вінісія Авельяра спрацювала для мене чудово. Мені лише більшість часу була потрібна база даних з пристрою з програми налагодження.
Сьогодні у мене був випадок, коли мені потрібні були кілька приватних файлів . У підсумку я отримав два рішення, які добре працювали в цій справі.
Використовуйте прийняту відповідь разом із конкретними коментарями OSX для когось десь. Створіть резервну копію та скористайтеся стороннім рішенням
sourceforge.net/projects/adbextractor/files/?source=navbar для розпакування в тар. Я напишу більше про свій досвід використання цього рішення внизу цієї відповіді. Прокрутіть вниз, якщо це те, що ви шукаєте.
Швидше рішення, з яким я вирішив. Я створив сценарій для витягування декількох файлів, подібних до відповіді Тамаша. Я можу це зробити так, оскільки моя програма - це програма налагодження, і я маю доступ до роботи на своєму пристрої. Якщо у вас немає доступу до запуску, оскільки цей спосіб не буде працювати для вас на 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 . Я помістив їх туди першими і все-таки отримав повідомлення про помилку. Тому я дослідив, і на моєму Mac з Java 1.8 правильним місцем для їх розміщення було: <java-home> / jre / lib / security . Я обов’язково створив резервну копію оригінальних банок для політики та помістив їх туди. Vola Я зміг ввести пароль за допомогою abe.jar і розшифрувати файл tar.
Нарешті я просто побіг ( після повторного запуску попередньої команди )
tar xvf myAndroidBackup.tar
Тепер важливо відзначити, що якщо ви можете просто бігати як кота, це набагато швидше. По-перше, ви отримуєте лише потрібні файли, а не всю програму. По-друге, чим більше файлів (+ шифрування для мене), тим повільніше передається. Отже, знати, як це зробити, важливо, якщо у вас немає запуску як на OSX, але сценарій повинен спочатку перейти до програми для налагодження.
Зверніть увагу, я щойно написав його сьогодні і протестував кілька разів, тому, будь ласка, повідомте мене про будь-які помилки!