Еще один скрипт bash (т.е. будет работать для большинства систем на основе Unix).На основании ответа Педро Родригеса , но его немного проще использовать.
Улучшения по сравнению с версией Педро:
- Оригинальный подход не работал для меня на Android7:
adb pull
продолжал жаловаться на no such file or directory
, в то время как adb shell
мог получить доступ к файлу.Поэтому я использовал другой подход с временным файлом. - При запуске без аргументов мой скрипт просто перечислит все доступные пакеты.Когда указано неполное имя пакета, он попытается угадать полное имя пакета.Он будет жаловаться, если есть несколько возможных расширений.
- Я не прописываю путь назначения;вместо этого APK сохраняются в текущем рабочем каталоге.
Сохраните это в исполняемый файл:
#!/bin/bash
# Obtain APK file for given package from the device connected over ADB
if [ -z "$1" ]; then
echo "Available packages: "
adb shell pm list packages | sed 's/^package://'
echo "You must pass a package to this function!"
echo "Ex.: android_pull_apk \"com.android.contacts\""
exit 1
fi
fullname=$(adb shell pm list packages | sed 's/^package://' | grep $1)
if [ -z "$fullname" ]; then
echo "Could not find package matching $1"
exit 1
fi
if [ $(echo "$fullname" | wc -l) -ne 1 ]; then
echo "Too many packages matched:"
echo "$fullname"
exit 1
fi
echo "Will fetch APK for package $fullname"
apk_path="`adb shell pm path $fullname | sed -e 's/package://g' | tr '\n' ' ' | tr -d '[:space:]'`"
apk_name="`basename ${apk_path} | tr '\n' ' ' | tr -d '[:space:]'`"
destination="${fullname}.apk"
tmp=$(mktemp --dry-run --tmpdir=/sdcard --suffix=.apk)
adb shell cp "${apk_path}" "$tmp"
adb pull "$tmp" "$destination"
adb shell rm "$tmp"
[ $? -eq 0 ] && echo -e "\nAPK saved in \"$destination\""