Як отримати файл apk з пристрою Android?


484

Як отримати файл apk з пристрою Android? Або як перенести файл apk з пристрою в систему?

Відповіді:


118

Використовуйте adb . За допомогою кнопки adb ви можете копіювати файли зі свого пристрою у вашу систему, коли пристрій підключено за допомогою 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 оболонки TCTerms Список користувачів) Це спосіб видалення / видалення (ні з телефону , як він повертається з поверненням заводу) майже БУДЬ додатком без системи включаючи кореневі додатки (натяк дратівної додатки поновлення , який оновлює свій телефон вирівняти його чи ні, можна знайти, натиснувши на "ccc")


1
Дякує Мавриту Рійку. Будь ласка, допоможіть мені. Я хочу скопіювати файл iTwips.apk з пристрою в систему. Я використовую таку команду. це правильно ? Я отримав помилку "Android2.2Froyo / sdcard / iTwips.apk" не виходить ... / Користувачі / bbb / Android / android-sdk-mac_86 / tools / adb pull Android2.2Froyo / sdcard / iTwips.apk / Users / bbb Дякуємо заздалегідь .......
Finder

На моєму пристрої (Android 2.1) командою було б "adb pull /sdcard/test.jpg" скопіювати test.jpg з моєї sd карти в поточний dir. Будь ласка, знайдіть свій файл iTwips.apk спочатку за допомогою "adb shell". Це запустить оболонку на вашому пристрої, і ви можете використовувати стандартні команди Unix, такі як ls та cd для перегляду ваших каталогів.
Мауріц Рійк

Привіт, насправді iTwips.apk зберігається у внутрішній пам'яті пристрою. як я можу використовувати оболонку для цього? Я використовую таку команду adp -d <devicenumber> shell .. Але це не працює .. будь ласка, допоможіть мені .. Дякую заздалегідь.
Шукач

Привіт, дуже дякую Я можу отримати зображення із sdcard зараз. але я хочу витягнути файл apk з пристрою (папка managementApplication). ITwips apk зберігається у папці Application. Будь ласка, допоможіть мені.
Шукач

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

1549

Жодна з цих пропозицій не працювала для мене, оскільки 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

65
Це найкраща відповідь, не потрібно пірнути пристрій !! велике спасибі
Muhannad A.Alhariri

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. Довідкова інформація про вбудовану вечірку марна, але вечір також може фільтрувати типи пакунків, для отримання додаткової інформації див. Developer.android.com/studio/command-line/adb.html#pm . EDIT: щойно зауважив, що відповідь нижче говорить про це, але ця відповідь не настільки прихильна, як ця.
Hitechcomputergeek

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

7
У мене була подібна проблема, як @Bevor, коли тягнув, я отримав помилку, що apk "не існує". Я виправив це за допомогою, adb shellа потім cp PathToApk /sdcard/і копіюючи з sdcard.
colin

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

Тоді ви можете вибрати додаток, наприклад щебетати

adb backup -apk com.twitter.android

Тут важлива річ - не встановлювати пароль для шифрування резервної копії

Це створить файл з назвою backup.ap, але ви все одно не можете його відкрити. Для цього вам потрібно витягнути його ще раз, але за допомогою команди dd.

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

Після цього все, що вам потрібно зробити, - це витягнути вміст дьогтю і це зроблено.

Сподіваюся, це працює для вас, хлопці


7
З blog.shvetsov.com/2013/02/… , якщо у вашого openssl немає zlib, це може працювати: dd, якщо = backup.ab bs = 1 пропустити = 24 | python -c "імпортувати zlib, sys; sys.stdout.write (zlib.decompress (sys.stdin.read ()))" | tar -xvf -
kodi

1
Це для мене працювало, а не процедура у прийнятій відповіді. І мені це справді допомогло сьогодні, коли мені потрібен APK одного із моїх старих додатків, але він не був доступний мені, крім мого телефону.
Зеешан

1
Ось додаткова інформація, якщо вашому OpenSl не вистачає підтримки zlib: stackoverflow.com/questions/29830981/…
Ніко Відеманн,

19

Крок до завантаження APK з пристрою на робочий стіл

A) Переконайтеся, що ваш запуск (емулятор / реальний пристрій). Для перевірки використовуйте цю команду

adb devices

B) Виберіть увесь список доступних пакетів, встановлений на вашому пристрої. Ви можете використовувати команду 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 ви витягуєте два додаткові файли без пояснення чи попередньої посилання.
Carles 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):

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

Це некрасивий баш, але працює :)

EDIT: Він більше не працює на 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

Спробуйте цю команду bash 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опцію.


5

Якщо ви знаєте (або якщо ви можете "здогадатися") шлях до .apk( здається, формату /data/app/com.example.someapp-{1,2,..}.apkдо, ви можете просто скопіювати його з/data/app . Це працювало навіть на моєму не вкоріненому, штатному телефоні Android.

Просто скористайтеся додатком Емулятор терміналів (наприклад, цей ) та запустіть:

# 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 (якщо тільки в кореневому режимі, але для цього потрібен вкорінений телефон). Але ви можете скопіювати .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.Перестаньте apk

    adb pull /sdcard/base.apk

Редагувати

Якщо етап 2 не працює, скористайтеся цим:

adb shell dumpsys window windows | grep mCurrentFocus

3

Ось як це зробити:

Завантажте та встановіть APK Extractor на свій пристрій. Він безкоштовний і сумісний майже на всіх пристроях Android. Ще одним плюсом є те, що він навіть не вимагає роботи root або нічого. Після встановлення запустіть його. Там ви побачите список програм, які є у вашому пристрої, включаючи додатки, які ви встановили пізніше, а також системні програми. Довго натискайте будь-яку програму, яку ви хочете витягнути (ви можете вибрати кілька або всі додатки одночасно), а потім натисніть на варіант вилучення, який ви бачите вгорі. У вас також буде можливість спільного доступу через 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 файл з мобільного, але я використовував програмне забезпечення для витягу.

  1. ES File Explorer File Manager
  2. ASTRO Cloud & File Manager 3. Кабель даних програмного забезпечення

Сподіваюся, це допоможе тобі.


2
Я використовував ES File Explorer. Я не вкоренився. Я щойно перейшов до Інструменти -> Диспетчер програм і довго натискав на додаток, для якого хотів APK. Це вибрало додаток (і дозволило мені вибрати інші). Я думаю, що натиснув кнопку Поділитися і зміг надіслати APK собі (використовуючи Push Bullet, але те, що коли-небудь працює для тебе).
schultzter

Якщо ви не згнили, то можете спробувати
створити

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 Store. Виберіть додаток, який ви хочете надіслати, та метод надсилання програми.

Зазвичай я використовую Bluetooth для надсилання програм на ПК або інший телефон.


Користуватися
непросто
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.