Як отримати APK встановленого додатка без доступу root?


198

Я намагаюся витягнути файл APK встановленої програми для Android БЕЗ кореневих дозволів.

Я вважав, що це неможливо, тому що всі файли APK для несистемних додатків розташовані в / data / app, і для доступу до цієї папки потрібен дозвіл кореня. Потім я виявив, що в магазині Google Play є численні програми, які, здається, мають доступ до файлів APK навіть на пристроях, що не вкорінюються.

Може хтось скаже мені, як це можливо? Чи не є резервні програми, які створюють резервну копію файлів APK без кореня?


2
Я думаю, на це питання вже відповіли. Будь ласка , дайте глянути на stackoverflow.com/a/12197924/1016544
Вахіба уль Хак




3
Я читаю про це, що @pinas запитував, як це програмно кодувати - посилаючись на додатки, які роблять це так, ніби говорять "Ці програми роблять це, але як?". Причина "утримування" тут, на мою думку, неправильна через це.
Річард Ле Месюр'є

Відповіді:


381

Доступ / дані / додаток можливий без дозволу root; дозволи в цьому каталозі rwxrwx - x. Виконання дозволу в каталозі означає, що ви можете отримати доступ до нього, однак відсутність дозволу на читання означає, що ви не можете отримати перелік його вмісту - тому, щоб отримати доступ до нього, ви повинні знати ім'я файлу, до якого ви будете отримувати доступ. Диспетчер пакунків Android скаже вам ім’я збереженого apk для даного пакета.

Для цього з командного рядка використовуйте adb shell pm list packagesдля отримання списку встановлених пакетів та пошуку потрібного пакету.

За допомогою імені пакета ми можемо отримати власне ім’я файлу та місце розташування APK за допомогою adb shell pm path your-package-name.

І знаючи повний каталог, ми можемо нарешті витягнути adb за допомогою adb pull full/directory/of/the.apk

Подяка @tarn за те, що він вказав, що в Lollipop шлях до apk буде /data/app/your-package-name-1/base.apk


33
Для цього з командного рядка використовуйте adb shell pm list packagesдля отримання списку встановлених пакетів, виберіть потрібний пакет, додайте -1.apkйого та витягніть з нього /data/app. Приклад: Якщо ім'я пакета org.mozilla.firefoxвикористовується adb pull /data/app/org.mozilla.firefox-1.apk.
sschuberth

11
Щоб отримати власне ім'я файлу APK, використовуйте шлях adb shell pm pm-your-package-name. Дивіться це питання для більш детальної відповіді stackoverflow.com/questions/4032960/…
Yojimbo

2
для льодяника на APK шлях буде /data/app/your-package-name-1/base.apk
Тей

Це не працює для мене. Я отримую таку помилку:adb: error: remote object '/data/app/com.Slack-1/base.apk' does not exist
0xcaff

1
@ 0xcaff Android за останні 5 років з моменту надання цієї відповіді сильно змінився; можливо, цей шлях є однією з цих змін. Ви повинні мати можливість увійти та знайти файл вручну, щоб придумати будь-який шлях, відповідний вашій версії ОС.
мак

55

Android додає порядковий номер до імені пакета, щоб отримати остаточне ім’я файлу APK (можливо, це залежить від версії ОС Android). Наступна послідовність команд працює на не вкоріненому пристрої :

  1. Отримайте повну назву файлу APK для потрібного пакету.

    adb shell pm path com.example.someapp

    Це дає результат , як: package:/data/app/com.example.someapp-2.apk.

  2. Витягніть файл APK з пристрою Android у вікно розробки.

    adb pull /data/app/com.example.someapp-2.apk

Місце APK після успішного витягування буде за адресою ../sdk/platform-tools/base.apk на вашому ПК / ноутбуці.


4
Можна підтвердити, що це рішення працює на не вкоріненому пристрої, хоча для початку потрібні знання назви пакета до першої команди! Скористайтеся пакетами "adb shell list list list", щоб отримати список усіх пакетів телефону, якщо ви не впевнені в назві пакета потрібного додатка
AndroidNoob

У яку папку на локальній машині знімача входить apk? EDIT: nvm, у якому б каталозі ви не працювали, коли робите adb pull ...
Адам Джонс

@IgorGanapolsky спробуйте скористатися adb pull /data/app/com.example.someapp-2/base.apk
Chris - Jr

@zelanix після того, як я зробив adb pull, де я можу створити файл .apk. Дякую
Vijaya Varma Lanke

22

Для отримання списку встановлених програм вам не потрібні права ROOT.

Ви можете зробити це за допомогою Android PackageManager.

Нижче - невеликий фрагмент коду.

final PackageManager pm = getPackageManager();
//get a list of installed apps.
List<ApplicationInfo> packages =  pm.getInstalledApplications(PackageManager.GET_META_DATA);

for (ApplicationInfo packageInfo : packages) {
    Log.d(TAG, "Installed package :" + packageInfo.packageName);
    Log.d(TAG, "Apk file path:" + packageInfo.sourceDir);
}

7
  1. перевірте список встановлених apk (наступна команда також перелічить шлях, де він встановлений, та назву пакета). пакет пакетів adb pm list -f
  2. використовувати adb pull / package_path / ім'я пакета / path_in_pc (шлях пакета та ім'я пакета можна отримати з вищевказаної команди 1.)

6

Коли у вас встановлена ​​програма Eclipse for Android:

  • Використовуйте свій пристрій як пристрій для налагодження. У телефоні: Налаштування> Програми> Розробка та ввімкнення налагодження через USB, див. Http://developer.android.com/tools/device.html
  • У Eclipse відкрийте вікно DDMS: Вікно> Відкрити перспективу> Інші ...> DDMS, див. Http://developer.android.com/tools/debugging/ddms.html
  • Якщо ви не бачите свого пристрою, спробуйте (повторно) встановити USB-драйвер для свого пристрою
  • На середній панелі виберіть вкладку "Провідник файлів" та перейдіть до системи> додаток
  • Тепер ви можете вибрати один або кілька файлів, а потім натиснути значок "Витягнути файл із пристрою" вгорі (праворуч від вкладок)
  • Виберіть цільову папку - тада!

У програмі / system / app є лише системні програми (він же попередньо встановлені програми).
arne.jans

6

У версії Android Nougat (7.0) запустіть adb shell pm list packagesсписок програм, встановлених на пристрої. Потім запустіть, adb shell pm path your-package-nameщоб показати шлях apk. Після використання adb скопіюйте пакунок у Downloads adb shell cp /data/app/com.test-1/base.apk /storage/emulated/0/Download. Потім витягніть apk з завантажень на вашу машину, запустівши adb pull /storage/emulated/0/Download/base.apk.


2

Я отримав 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

Список PackageManager.getInstalledApplications () надасть вам список встановлених програм, а ApplicationInfo.sourceDir - шлях до файлу .apk.

// in oncreate
   PackageManager pm = getPackageManager(); 
   for (ApplicationInfo app : pm.getInstalledApplications(0)) {
 Log.d("PackageList", "package: " + app.packageName + ", sourceDir: " + app.sourceDir);
 }

//output is something like
D/PackageList(5010): package: com.example.xmlparse, sourceDir: /data/app   /com.example.xmlparse-2.apk
D/PackageList(5010): package: com.examples.android.calendar, sourceDir: /data/app/com.examples.android.calendar-2.apk
D/PackageList(5010): package: com.facebook.katana, sourceDir: /data/app/com.facebook.katana-1.apk
D/PackageList(5010): package: com.facebook.samples.profilepicture, sourceDir: /data/app/com.facebook.samples.profilepicture-1.apk
D/PackageList(5010): package: com.facebook.samples.sessionlogin, sourceDir: /data/app/com.facebook.samples.sessionlogin-1.apk
D/PackageList(5010): package: com.fitworld, sourceDir: /data/app/com.fitworld-2.apk
D/PackageList(5010): package: com.flipkart.android, sourceDir: /data/app/com.flipkart.android-1.apk
D/PackageList(5010): package: com.fmm.dm, sourceDir: /system/app/FmmDM.apk
D/PackageList(5010): package: com.fmm.ds, sourceDir: /system/app/FmmDS.apk

0

Я знайшов спосіб отримати ім’я пакета APK на некореневому пристрої. це не так елегантно, але працює весь час.

Крок 1. На своєму пристрої відкрийте цільовий APK

Крок 2 : у вікні cmd ПК введіть ці команди:

 adb shell dumpsys activity a > dump.txt

оскільки вихід цієї команди є численним, рекомендується переадресація на файл.

Крок 3 : відкрийте цей файл dump.txt у будь-якому редакторі.

для пристрою для Android 4.4:
початок файлу виглядатиме так:

ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)  
  Main stack:  
  * TaskRecord{41aa9ed0 #4 A com.tencent.mm U 0}  
    numActivities=1 rootWasReset=true userId=0  
    affinity=com.tencent.mm  
    intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10600000 cmp=com.tencent.mm/.ui.LauncherUI}  
    realActivity=com.tencent.mm/.ui.LauncherUI  
    askedCompatMode=false  
    lastThumbnail=null lastDescription=null  
    lastActiveTime=19915965 (inactive for 10s)  
    * Hist #9: ActivityRecord{41ba1a30 u0 com.tencent.mm/.ui.LauncherUI}  
        packageName=com.tencent.mm processName=com.tencent.mm 

назва пакета знаходиться у 3-му рядку, com.tencent.mm для цього прикладу.

для Android 4.4 та новіших версій:
вихід "dumpsys" трохи змінився. спробуйте пошукати "Стек №1", назва пакету буде дуже близькою під ним.

Також пошукайте "baseDir", ви знайдете повний шлях до файлу apk!


-1

Відкрийте Провідник ES -> натисніть кнопку меню у верхньому лівому куті (три горизонтальні смуги) -> у розділі Бібліотеки виберіть APPs.

Таким чином, ви отримуєте список усіх програм користувачів. Знайдіть свою програму та виберіть її, тривалим натисканням на неї. Потім натисніть "Більше" в правому нижньому куті і виберіть "Надіслати". Тоді ви можете використовувати різні параметри, наприклад, ви можете вибрати "ES Save to", щоб зберегти .apk файл у домашній каталог або в іншому місці.


-2

Або ви можете отримати "Передачу файлів Bluetooth" з Google Play і встановити домашню папку /system/. Тоді ви навіть можете піти /.

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