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

399

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

Теги:
adb
apk

24 ответа

68
Лучший ответ

Использовать 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) Это способ удаления/удаления (не с телефона по мере его возврата с заводским сбросом) почти ЛЮБОЕ приложение БЕЗ КОРИРОВАНИЯ, ВКЛЮЧАЯ системные приложения (подскажите, какое раздражающее приложение для обновления, которое обновляет ваш телефон строка это или не может быть найдена grepping для "ccc")

  • 1
    Спасибо Мауриц Райк. Пожалуйста, помогите мне. Я хочу скопировать файл iTwips.apk с устройства в систему. Я использую следующую команду. это правильно? Я получил сообщение об ошибке «Android2.2Froyo / SDCard / iTwips.apk» не выходит ... / Пользователи / BBB / Android / Android-SDK-Mac_86 / Tools / ADB тянуть Android2.2Froyo / SDCard / iTwips.apk / Пользователи / BBB Спасибо заранее .......
  • 0
    На моем устройстве (Android 2.1) команда будет "adb pull /sdcard/test.jpg", чтобы скопировать test.jpg с моей SD-карты в текущий каталог. Пожалуйста, сначала найдите ваш файл iTwips.apk, используя «adb shell». Это запустит оболочку на вашем устройстве, и вы сможете использовать стандартные команды Unix, такие как ls и cd, для просмотра ваших каталогов.
Показать ещё 6 комментариев
1238

Ни один из этих предложений не работал для меня, потому что 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

Результат будет выглядеть примерно так:
пакет: /data/app/com.example.someapp-2.apk
или же
пакет: /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
  • 50
    Это лучший ответ, не нужно гнить устройство !! большое спасибо
  • 13
    Это работало на всех моих устройствах Android, и должно быть принятым ответом.
Показать ещё 18 комментариев
99

Не требуется root:

Этот код получит путь сторонних пакетов с именем, чтобы вы могли легко идентифицировать свой 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:>\, тогда вы найдете там этот пакет.

  • 2
    Точный ответ :)
  • 0
    Это потрясающий ответ! Большое спасибо :)
Показать ещё 3 комментария
48

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

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

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 и сделать.

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

  • 6
    Из 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 -
  • 1
    Это то, что сработало для меня, а не процедура в принятом ответе. И это действительно помогло мне сегодня, когда мне понадобился APK одного из моих старых приложений, но он был недоступен для меня, кроме как с моего телефона.
Показать ещё 1 комментарий
15
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)
  • 0
    Это самый простой способ на мой взгляд. Спасибо!
  • 0
    парни, использующие Linux или Mac вместо findstr, используют grep
8

Один вкладыш, который работает для всех версий Android:

adb shell 'cat 'pm path com.example.name | cut -d':' -f2'' > app.apk
  • 0
    stackoverflow.com/q/13578416/1778421
  • 1
    @AlexP. что ты хотел сказать по ссылке выше?
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

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

EDIT: Он больше не работает в AndroidM: все файлы называются "base.apk" в другом каталоге. Должно быть "тривиальным" для исправления.

5

В системах 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
5

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

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

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

4

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

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

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

Просто используйте приложение 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.

3

Попробуйте эту команду 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

Эта команда получена из сценария Firelord. Я просто переименовал все apks в имена своих пакетов для решения проблемы с помощью скрипта elcuco, то есть тот же файл base.apk который был перезаписан на Android 6.0 "Marshmallow" и выше.

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

2

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

2

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

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

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

1

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

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

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

1

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

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

  • 2
    Я использовал ES File Explorer. Я не рутирован. Я просто зашел в Инструменты -> Диспетчер приложений и долго нажимал на приложение, для которого хотел APK. Это выбрало приложение (и позволило мне выбрать других). Я думаю, что нажал кнопку Share и смог отправить APK самому себе (используя Push Bullet, но то, что у вас когда-либо работает).
  • 0
    Если вы не сгнили, вы можете попробовать сделать резервную копию приложения и восстановить play.google.com/store/apps/details?id=mobi.infolife.appbackup.
0

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

   1. check the package list
   adb shell pm list packages
   adb shell pm list packages -f -3

   2. find actual path
   adb shell pm path com.android.certinstaller

   3. output should look like
   system/app/CertInstaller/CertInstaller.apk

   4. actual execution command
   adb pull /system/app/CertInstaller/CertInstaller.apk /Users/$(whoami)/Documents/APK/download_apk/
   adb pull /data/app/io.crash.air-1/base.apk  /Users/$(whoami)/Documents/APK/download_apk/
   adb pull /data/app/io.crash.air-1/base.apk  /Users/$(whoami)/Documents/APK/all_versions/

   6. plase confirm that 
   adb pull /data/app/[your_package_name]-1/base.apk  /Users/$(whoami)/Documents/APK/all_versions/
  • 0
    Цель состоит в том, чтобы извлечь один apk, но на шаге 4 вы извлекаете два дополнительных файла без объяснения или предыдущей ссылки.
  • 0
    Я изменил этот пост, разъяснив каждый шаг. Надеюсь, эта модификация будет полезна и проста для понимания.
0

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

download-apk.pl

#!/usr/bin/perl -w
# Automatically export all available installed APK 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.
0

Я получил 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

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

0
  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
0

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

0

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

Усовершенствования по версии Педро:

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

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

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

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

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

  • 0
    Это не легко использовать

Ещё вопросы

Сообщество Overcoder
Наверх
Меню