Как получить файл apk с устройства Android?


484

Как получить файл apk с устройства Android? Или как мне перенести файл apk с устройства на систему?

Ответы:


119

Используйте adb . С помощью adb pull вы можете копировать файлы с вашего устройства на вашу систему, когда устройство подключено через USB.

Конечно, вам также необходимы правильные разрешения для доступа к каталогу, в котором находится ваш файл. Если нет, вам сначала нужно будет выполнить рутирование устройства.


Если вы обнаружите, что многие из APK называются «base.apk», вы также можете использовать эту однострочную команду, чтобы извлечь все APK из телефона, к которому у вас есть доступ, переименовывая любые имена «base.apk» в имя пакета. Это также устраняет проблему, связанную с отсутствием каталога для путей APK с кажущимися случайными символами после имени:

for i in $(adb shell pm list packages | awk -F':' '{print $2}'); do adb pull "$(adb shell pm path $i | awk -F':' '{print $2}')"; mv base.apk $i.apk 2&> /dev/null ;done

Если вы получаете «adb: error: не удалось определить удаленный объект», это означает, что у вас нет необходимых разрешений. Я запустил это на некоренном Moto Z2 и смог загрузить ВСЕ APK, которые я не удалял (см. Ниже), кроме youtube.

adb shell pm uninstall --user 0 com.android.cellbroadcastreceiver   <--- kills presidential alert app!

(для просмотра пользователей запустите adb shell pm list users) Это способ удалить / удалить (не с телефона, так как он возвращается с заводским сбросом) почти ЛЮБОЕ приложение БЕЗ root, включая системные приложения (подсказка раздражающее приложение обновления, которое обновляет ваш телефон) строка это или нет, можно найти с помощью grepping для "ccc")


1
Спасибо Мауриц Райк. Пожалуйста, помогите мне. Я хочу скопировать файл iTwips.apk с устройства в систему. Я использую следующую команду. это правильно? Я получил сообщение об ошибке «Android2.2Froyo / SDCard / iTwips.apk» не выходит ... / Пользователи / BBB / Android / Android-SDK-Mac_86 / Tools / ADB тянуть Android2.2Froyo / SDCard / iTwips.apk / Пользователи / BBB Спасибо заранее .......
Искатель

На моем устройстве (Android 2.1) команда будет "adb pull /sdcard/test.jpg", чтобы скопировать test.jpg с моей SD-карты в текущий каталог. Пожалуйста, сначала найдите ваш файл iTwips.apk, используя «adb shell». Это запустит оболочку на вашем устройстве, и вы сможете использовать стандартные команды Unix, такие как ls и cd, для просмотра ваших каталогов.
Мауриц Райк

Привет! На самом деле iTwips.apk хранится во внутренней памяти устройства. как я могу использовать оболочку для этого? Я использую следующую команду adp -d <devicenumber> shell .. Но она не работает .. Пожалуйста, помогите мне .. Спасибо заранее.
Finder

Привет, большое спасибо. Теперь я могу получить изображения с SDCard. но я хочу вытащить файл apk с устройства (папка управления приложениями). ITwips apk хранится в папке приложения. Пожалуйста, помогите мне.
Finder

16
@Finder @Maurits Rijk На самом деле вам не нужно рутировать устройство только для того, чтобы вытащить apk. Пока вы знаете полный путь этого apk. Если apk установлен, найдите полный путь, сначала посмотрев на имя пакета с помощью adb shell pm list packagesи его полный путь, а adb shell pm path your.package.nameзатем на своем компьютере, вы можете простоadb pull /full/path/to/your.apk
Isa A

1550

Ни одно из этих предложений не помогло мне, потому что Android добавлял порядковый номер к имени пакета, чтобы получить окончательное имя файла APK. В более поздних версиях Android (Oreo и Pie) добавляется непредсказуемая случайная строка. Следующая последовательность команд - это то, что сработало для меня на некорневом устройстве :

1) Определите имя пакета приложения, например, «com.example.someapp». Пропустите этот шаг, если вы уже знаете имя пакета.

adb shell pm list packages

Просмотрите список имен пакетов и попробуйте найти соответствие между рассматриваемым приложением и именем пакета. Обычно это легко, но обратите внимание, что имя пакета может быть совершенно не связано с именем приложения. Если вы не можете распознать приложение из списка названий пакетов, попробуйте найти приложение в Google Play с помощью браузера. URL-адрес приложения в Google Play содержит название пакета.

2) Получить полный путь к файлу APK для нужного пакета.

adb shell pm path com.example.someapp

Вывод будет выглядеть примерно так
: package: /data/app/com.example.someapp-2.apk
или
package: /data/app/com.example.someapp-nfFSVxn_CTafgra3Fr_rXQ == / base.apk

3) Используя полный путь из шага 2, перетащите APK-файл с устройства Android в окно разработки.

adb pull /data/app/com.example.someapp-2.apk path/to/desired/destination

65
Это лучший ответ, не нужно гнить устройство !!
Большое

14
Это работает на всех моих устройствах Android, и должен быть принятым ответом.
b.mcewan

8
pm list packagesподдерживает -fфлаг, который перечисляет местоположение .apk для вас, как package:/data/app/com.google.android.apps.maps-1.apk=com.google.android.apps.maps. Встроенная справка pm бесполезна, но pm также может фильтровать типы пакетов, см. Developer.android.com/studio/command-line/adb.html#pm для получения дополнительной информации. РЕДАКТИРОВАТЬ: только что заметил, что ответ ниже говорит об этом, но этот ответ не так проголосовал, как этот.
Hitechcomputergeek

9
Не работает для меня Я получаю следующее сообщение об ошибке: adb: error: remote object '/data/app/path.of.the.app-2/base.apk' does not exist. Если я просматриваю эти папки с помощью файлового браузера, папки пусты.
Бевор

8
У меня была похожая проблема как @Bevor, при вытягивании я получил ошибку, что apk "не существует". Я исправил это с помощью adb shellи затем cp PathToApk /sdcard/и затем копируя с SDCard.
Колин

124

Корень не требуется:

Этот код получит путь к сторонним пакетам с именем, чтобы вы могли легко определить свой APK

adb shell pm list packages -f -3

выход будет

пакет: /data/app/XX.XX.XX.apk=YY.YY.YY

Теперь потяните этот пакет, используя следующий код:

adb pull /data/app/XX.XX.XX.apk

если вы выполнили выше cmd в C:>\, то вы найдете этот пакет там.


1
Это потрясающий ответ! Большое спасибо :)
Drag0

1
По какой-то причине я не могу найти APK в моем каталоге / data / app / . Там всегда есть подкаталог.
Игорь Ганапольский

для системных приложений использовать -f -sвместо-f -3
Palindrom

57

Я видел много решений этой проблемы: либо вам нужно рутировать свой телефон, либо вам нужно установить приложение. Затем, после долгих поисков, я получил это решение для нерутированных / рутированных телефонов.

Чтобы перечислить, какие приложения вы получили до сих пор.

adb shell pm list packages

Затем вы можете выбрать приложение, например, Twitter

adb backup -apk com.twitter.android

Здесь важно не устанавливать пароль для шифрования вашей резервной копии.

Это создаст файл с именем backup.ap, но вы все равно не сможете его открыть. Для этого вы должны извлечь его снова, но с помощью команды dd.

dd if=backup.ab bs=24 skip=1 | openssl zlib -d > backup.tar

После этого все, что вам нужно сделать, это извлечь содержимое tar, и все готово.

Надеюсь, это работает для вас, ребята


7
Из blog.shvetsov.com/2013/02/… , если в вашем openssl нет zlib, это может сработать: dd if = backup.ab bs = 1 skip = 24 | python -c "импорт zlib, sys; sys.stdout.write (zlib.decompress (sys.stdin.read ()))" | tar -xvf -
kodi

1
Это то, что сработало для меня, а не процедура в принятом ответе. И это действительно помогло мне сегодня, когда мне понадобился APK одного из моих старых приложений, но он был недоступен для меня, кроме как с моего телефона.
Зеешан

1
Вот дополнительная информация, если в вашем openssl отсутствует поддержка zlib: stackoverflow.com/questions/29830981/…
Нико Видеманн,

19

Действия по загрузке APK с устройства на рабочий стол

А) Убедитесь, что вы работаете (эмулятор / реальное устройство). Для проверки используйте эту команду

adb devices

Б) Выберите весь список доступных пакетов, установленных на вашем устройстве. Вы можете использовать команду grep, чтобы выбрать конкретный пакет, который вы собираетесь загрузить.

adb shell pm list packages
adb shell pm list packages -f -3

Вывод (список доступных пакетов)

package:/data/app/com.example.mytestapplication-sOzKi5USzfbYLPNDmaaK6g==/base.apk=com.example.mytestapplication
package:/data/app/com.example.myapplication-nd1I4FGnTZnQ9PyRbPDHhw==/base.apk=com.example.myapplication

C) Скопируйте пакет (который вы хотели бы скачать) по ссылке выше. В нашем случае я выбираю этот пакет (com.example.myapplication)

Syntax : adb shell pm path [your_package_name]
Command: adb shell pm path com.example.myapplication

Вывод

package:/data/app/com.example.myapplication-nd1I4FGnTZnQ9PyRbPDHhw==/base.apk

D) Наконец, скачать APK с вашего (эмулятора / реального устройства)

Syntax : adb pull /data/app/[your_package_name]-1/base.apk  [your_destination_path]
Command: adb pull /data/app/com.example.myapplication-3j4CVk0Tb2gysElgjz5O6A==/base.apk /Users/$(whoami)/Documents/your_apk.apk

Пример: попытка вытянуть этот файл CertInstaller.apk на локальном компьютере (Mac)

adb pull /system/app/CertInstaller/CertInstaller.apk /Users/$(whoami)/Documents/APK/download_apk/

E) Подтвердите в вашем локальном каталоге

ls -la /Users/$(whoami)/Documents/

Цель состоит в том, чтобы извлечь один apk, но на шаге 4 вы извлекаете два дополнительных файла без объяснения или предварительной ссылки.
Карлес Alcolea

Я изменил этот пост, разъяснив каждый шаг. Надеюсь, эта модификация будет полезна и проста для понимания.
Фарид Хак

18
C:\Users\xyz>adb shell pm list packages -f | findstr whatsapp
package:/data/app/com.whatsapp-1/base.apk=com.whatsapp

C:\Users\xyz>adb pull /data/app/com.whatsapp-1/base.apk Desktop
/data/app/com.whatsapp-1/base.apk: 1 f.... 13.8 MB/s (32803925 bytes in 
2.269s)

Это самый простой способ, на мой взгляд. Спасибо!
8bitcartridge

1
парни, использующие Linux или Mac вместо findstr, используют grep
Jeeva


7

Завершая ответ @Yojimbo, это то, что я сделал (только для Linux / Mac, не будет работать "из коробки" в Windows ... может быть, в git-оболочке bash):

for i in $(adb shell pm list packages -f -3 | cut -d= -f 1 | cut -d ":" -f 2); do adb pull $i; done

Это уродливый баш, но работает :)

РЕДАКТИРОВАТЬ: Это больше не работает на AndroidM: все файлы называются «base.apk» под другим каталогом. Должно быть "тривиальным", чтобы исправить.


7

В системах Unix вы можете попробовать эту функцию:

function android_pull_apk() {
    if [ -z "$1" ]; then
        echo "You must pass a package to this function!"
        echo "Ex.: android_pull_apk \"com.android.contacts\""
        return 1
    fi

    if [ -z "$(adb shell pm list packages | grep $1)" ]; then
        echo "You are typed a invalid package!"
        return 1
    fi

    apk_path="`adb shell pm path $1 | sed -e 's/package://g' | tr '\n' ' ' | tr -d '[:space:]'`"
    apk_name="`adb shell basename ${apk_path} | tr '\n' ' ' | tr -d '[:space:]'`"

    destination="$HOME/Documents/Android/APKs"
    mkdir -p "$destination"

    adb pull ${apk_path} ${destination}
    echo -e "\nAPK saved in \"$destination/$apk_name\""
}
  • Пример :android_pull_apk com.android.contacts
  • Примечание : чтобы определить пакет:adb shell pm list packages

6

Как сказано выше, вы можете получить apk, используя команду pull в adb.

Поскольку вы говорите об установленных приложениях, посмотрите каталог / data / app вашей файловой системы Android. Вы найдете APK там.

Затем используйте команду adb - adb pull /data/data/appname.apk


6

Попробуйте эту команду liner bash для резервного копирования всех ваших приложений:

for package in $(adb shell pm list packages -3 | tr -d '\r' | sed 's/package://g'); do apk=$(adb shell pm path $package | tr -d '\r' | sed 's/package://g'); echo "Pulling $apk"; adb pull -p $apk "$package".apk; done

Эта команда является производной от скрипта Повелителя огня . Я просто переименовал все apks в их имена пакетов для решения проблемы со скриптом elcuco , то есть тот же base.apkфайл перезаписывается на Android 6.0 «Marshmallow» и выше.

Обратите внимание, что эта команда выполняет резервное копирование только сторонних приложений, потому что я не вижу смысла в резервном копировании встроенных приложений. Но если вы хотите создать резервную копию системных приложений, просто опустите -3опцию.


5

Если вы знаете (или если вы можете «угадать») путь к .apk( кажется, что он имеет формат /data/app/com.example.someapp-{1,2,..}.apk, то вы можете просто скопировать его из/data/app . Это работало даже на моем обычном Android-телефоне без root-доступа.

Просто используйте приложение Terminal Emulator (например, это ) и запустите:

# step 1: confirm path
ls /data/app/com.example.someapp-1.apk
# if it doesn't show up, try -2, -3. Note that globbing (using *) doesn't work here.
# step 2: copy (make sure you adapt the path to match what you discovered above)
cp /data/app/com.example.someapp-1.apk /mnt/sdcard/

Затем вы можете переместить его с SD-карты куда угодно (или прикрепить к электронному письму и т. Д.). Последний бит может быть технически необязательным, но он делает вашу жизнь намного проще, когда вы пытаетесь что-то сделать с .apkфайлом.


5

Процедуры, описанные здесь, не работают для Android 7 (Nougat) [и, возможно, Android 6, но я не могу проверить]. Вы не можете извлекать файлы .apk непосредственно под Nougat (если только не в режиме root, но для этого требуется рутованный телефон). Но вы можете скопировать .apk по альтернативному пути (скажем, / sdcard / Download) на телефоне, используя оболочку adb, затем вы можете выполнить извлечение adb из альтернативного пути.


3
Принятый ответ (включая adb shellкоманды из комментария @Isa A) отлично работал на Android 7.1.1, не рутированный.
Джонатан Коттрилл

4
  1. Откройте приложение, из которого вы хотите извлечь APK из вашего телефона.
  2. Получить текущее открытое приложение с:

    adb shell dumpsys activity activities | grep mFocusedActivity
  3. Получить путь к имени пакета

    adb shell pm path <packagename.apk>

4. Скопируйте путь, который вы получили в каталог SDCard

    adb shell cp /data/app/<packagename.apk> /sdcard

5. Потяните апк

    adb pull /sdcard/base.apk

редактировать

Если шаг № 2 не работает, используйте это:

adb shell dumpsys window windows | grep mCurrentFocus

3

Вот как вы это делаете:

Скачайте и установите APK Extractor на ваше устройство. Он бесплатный и совместим практически со всеми устройствами Android. Еще один плюс - он даже не требует рута или чего-либо еще для работы. После того, как он установлен, запустите его. Там вы увидите список приложений, которые находятся на вашем устройстве, включая приложения, которые вы установили позже, а также системные приложения. Длительно нажмите на любое приложение, которое вы хотите извлечь (вы можете выбрать несколько или все приложения одновременно), и нажмите на опцию извлечения, которую вы видите в верхней части. У вас также будет возможность поделиться через Bluetooth или обмен сообщениями. Все готово, вы увидите извлеченные приложения как AppName_AppPackage_AppVersionName_AppVersionCode.apk, которые по умолчанию будут сохранены в пути / sdcard / ExtractedApks /.

Для подробного описания того, как извлечь apk-файлы в Android , посетите: http://appslova.com/how-to-extract-apk-files-in-android/


3

Все эти ответы требуют нескольких шагов для каждого файла apk, полученного с устройства. 1. определить имя пакета, 2. найти файл и 3. загрузить его. Я создал простой apk_grabberскрипт на python, чтобы сделать это для любого приложения, соответствующего заданному регулярному выражению, а затем декомпилировал эти apks в файлы jar.


1

Я не использовал код для извлечения файла .apk с мобильного телефона, но я использовал программное обеспечение для извлечения файла .apk с мобильного телефона и программное обеспечение, которое я использовал ниже, со ссылкой Google Play:

  1. ES File Explorer Файловый менеджер
  2. ASTRO Cloud & File Manager 3. Программный кабель для передачи данных

Надеюсь, это поможет вам.


2
Я использовал ES File Explorer. Я не рутирован. Я просто зашел в Инструменты -> Диспетчер приложений и долго нажимал на приложение, для которого хотел APK. Это выбрало приложение (и позволило мне выбрать других). Я думаю, что нажал кнопку «Поделиться» и смог отправить APK самому себе (используя Push Bullet, но то, что у вас когда-либо работает).
Шульцтер

Если вы не сгнили, вы можете попробовать приложение резервного копирования и восстановления play.google.com/store/apps/details?id=mobi.infolife.appbackup
surhidamatya

1

хотите очень, очень удобное решение за 1 минуту?

только вам это приложение https://play.google.com/store/apps/details?id=com.cvinfo.filemanager (умный файловый менеджер из Google Play).

нажмите «приложения», выберите один и нажмите «резервное копирование». это закончится на вашей файловой системе в app_backupпапке;)


1

Нет рута и нет инструментов ADB требуется метод. Установите приложение MyAppSharer из магазина игр.


1

Я получил does not exist error

Вот как я это делаю

adb shell pm list packages -f | findstr zalo
package:/data/app/com.zing.zalo-1/base.apk=com.zing.zalo

adb shell
mido:/ $ cp /data/app/com.zing.zalo-1/base.apk /sdcard/zalo.apk
mido:/ $ exit


adb pull /sdcard/zalo.apk Desktop

/sdcard/zalo.apk: 1 file pulled. 7.7 MB/s (41895394 bytes in 5.200s)

0

Еще один скрипт bash (т.е. будет работать для большинства систем на основе Unix). Основано на ответе Педро Родригеса , но немного проще в использовании.

Улучшения по сравнению с версией Педро:

  1. Оригинальный подход не работал для меня на Android 7: adb pullпродолжал жаловаться, no such file or directoryпокаadb shell мог получить доступ к файлу. Поэтому я использовал другой подход, с временным файлом.
  2. При запуске без аргументов мой скрипт просто перечислит все доступные пакеты. Когда указано неполное имя пакета, он попытается угадать полное имя пакета. Он будет жаловаться, если есть несколько возможных расширений.
  3. Я не прописываю путь назначения; вместо этого 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\""

0

Самый простой из них: установить приложение «ShareIt» на телефон. Теперь установите приложение shareIt на ПК или другой телефон. Теперь с телефона, на котором установлено приложение, откройте ShareIt и отправьте. На другом телефоне или ПК откройте ShareIt и получите.


0

Мне очень понравились все эти ответы. Большинство сценариев для экспорта и переименования всех написаны на Bash. Я сделал небольшой скрипт на Perl, который делает то же самое (который должен работать как в Perl для Windows, так и для Linux, только протестирован в Ubuntu).

download-apk.pl

#!/usr/bin/perl -w
# Automatically export all available installed APK's using adb
use strict;
print "Connect your device...\n";
system("adb", "wait-for-device");
open(my $OUT, '-|', 'adb', 'shell', 'pm', 'list', 'package', '-f');
my @list = split(/\s*/, `adb shell pm list packages -f`);
my $count = 0;
while(my $line = <$OUT>) {
        $line =~ s/^\s*|\s*$//g;
        my ($type, $path, $package) = $line =~ /^(.*?):(.*)=(.*)$/ ? ($1,$2,$3) : die('invalid line: '.$line);
        my $category = $path =~ /^\/(.*?)\// ? $1 : 'unknown';
        my $baseFile = $path =~ /\/([^\/]*)$/ ? $1 : die('Unknown basefile in path: '.$path);
        my $targetFile = "$category-$package.apk";
        print "$type $category $path $package $baseFile >> $targetFile\n";
        system("adb", "pull", $path);
        rename $baseFile, $targetFile;
}
  1. Убедитесь, что adb (.exe) находится в вашем пути или в том же каталоге
  2. Подключи свой телефон
  3. Запустите download-apk.pl

Вывод похож на:

# ./download-apk.pl
Connect your device...
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
package system /system/app/YouTube/YouTube.apk com.google.android.youtube YouTube.apk >> system-com.google.android.youtube.apk
5054 KB/s (11149871 bytes in 2.154s)
package data /data/app/com.ghostsq.commander-1/base.apk com.ghostsq.commander base.apk >> data-com.ghostsq.commander.apk
3834 KB/s (1091570 bytes in 0.278s)
package data /data/app/de.blinkt.openvpn-2/base.apk de.blinkt.openvpn base.apk >> data-de.blinkt.openvpn.apk
5608 KB/s (16739178 bytes in 2.914s)
etc.

-1

Это поможет тем, кто ищет нетехнический ответ

Это простой взлом

Загрузите приложение App Share/Send Proиз магазина Google Play. Выберите приложение, которое вы хотите отправить, и метод отправки приложения.

Я обычно использую Bluetooth для отправки приложений на мой компьютер или другой телефон.


Это не просто в использовании
APEXBoi
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.