Как получить APK установленного приложения без рут-доступа?

198

Я пытаюсь извлечь APK-файл установленного приложения для Android БЕЗ рут-прав.

Я думал, что это невозможно, потому что все файлы APK для несистемных приложений находятся в / data / app, и для доступа к этой папке требуются права суперпользователя. Затем я обнаружил, что в магазине Google Play есть множество приложений, которые, похоже, имеют доступ к APK-файлам даже на нерутированных устройствах.

Может кто-нибудь сказать мне, как это возможно? Нет ли приложений для резервного копирования файлов APK без рута?

пинас
источник
2
Я думаю, что на этот вопрос уже дан ответ. Пожалуйста, посмотрите на stackoverflow.com/a/12197924/1016544
Вахиб Уль Хак
2
Возможный дубликат Как получить файл apk с устройства Android?
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
3
Насколько я понимаю, @pinas спрашивал, как программировать это программно, ссылаясь на приложения, которые делают это так, будто говорят «Эти приложения делают, но как?». Причина "на удержании" здесь неправильна, по моему мнению, из-за этого.
Ричард Ле Мезурье

Ответы:

381

Доступ к / data / app возможен без прав 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 your-package-name. См. Этот вопрос для более подробного ответа stackoverflow.com/questions/4032960/…
Йоджимбо
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 на вашем ПК / ноутбуке.

Yojimbo
источник
4
Можно подтвердить, что это решение работало на некорневом устройстве, хотя требует знания имени пакета до первой команды! Используйте 'adb shell pm list packages', чтобы получить список всех пакетов на телефоне, если вы не уверены в названии пакета нужного вам приложения
AndroidNoob
В какую папку на локальной машине пуллера заходит apk? РЕДАКТИРОВАТЬ: NVM, в каком бы каталоге вы ни находились, когда выполняли adb pull ...
Адам Джонс
@IgorGanapolsky попробуйте использовать adb pull /data/app/com.example.someapp-2/base.apk
Крис - младший
@zelanix после выполнения adb pull, где я могу получить файл .apk. Спасибо
Виджая Варма Ланке
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 shell PM список пакетов -f
  2. используйте adb pull / package_path / имя пакета / path_in_pc (путь к пакету и имя пакета можно получить из приведенной выше команды 1.)
goldy021
источник
6

Когда у вас установлен Eclipse для разработки Android:

  • Используйте ваше устройство в качестве устройства отладки. На вашем телефоне: Настройки> Приложения> Разработка и включите отладку по USB, см. Http://developer.android.com/tools/device.html
  • В Eclipse, откройте DDMS-окна: Window> Open Perspective> Other ...> 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 скопируйте пакет в Загрузки 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)
vanduc1102
источник
0

List 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 на устройстве без полномочий root. это не так элегантно, но работает все время.

Шаг 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 немного изменился. попробуйте поискать "Stack # 1", имя пакета будет очень близко под ним.

Кроме того, поиск "baseDir", вы найдете полный путь к файлу apk!

свинг
источник
-1

Откройте ES проводник -> нажмите кнопку «Меню» в левом верхнем углу (три горизонтальные полосы) -> в разделе «Библиотеки» выберите «Приложения».

Таким образом, вы получаете список всех пользовательских приложений. Найдите свое приложение и выберите его с долгим нажатием на него. Затем нажмите «Еще» в правом нижнем углу и выберите «Отправить». Затем вы можете использовать различные параметры, например, вы можете выбрать «ES Save To», чтобы сохранить файл .apk в вашем домашнем каталоге или где-либо еще.

JenyaKh
источник
-2

Или вы можете получить «Bluetooth File Transfer» из Google Play и установить домашнюю папку на /system/. Тогда вы даже можете пойти в /.

AJD
источник