it-swarm.com.ru

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

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

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

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

164
pinas

Доступ к/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

339
mah

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
    
46
Yojimbo

Вам не нужны права 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);
}
17
Sagar Waghmare
  1. проверьте список установленных apk (следующая команда также перечислит путь, где он установлен и имя пакета) . adb Shell pm список пакетов -f
  2. используйте adb pull/package_path/имя пакета/path_in_pc (путь к пакету и имя пакета можно получить из приведенной выше команды 1.)
6
goldy021

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

  • Используйте ваше устройство в качестве устройства отладки. На вашем телефоне: Настройки> Приложения> Разработка и включение отладки USB, см http://developer.Android.com/tools/device.html
  • В Eclipse откройте окно DDMS: «Окно»> «Открыть перспективу»> «Другое»> DDMS, см. http://developer.Android.com/tools/debugging/ddms.html
  • Если вы не видите свое устройство, попробуйте (пере) установить USB-драйвер для вашего устройства
  • В средней панели выберите вкладку «Проводник» и перейдите в систему> приложение
  • Теперь вы можете выбрать один или несколько файлов, а затем нажать значок «Извлечь файл .__ из устройства» вверху (справа от вкладок).
  • Выберите целевую папку - тада!
6
anon

В версии Nougat (7.0) для Android запустите 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.

5
Buhiire Keneth

Я нашел способ получить имя пакета 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!

0
Swing

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
Pankaj Arora

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