Jak uzyskać pakiet APK zainstalowanej aplikacji bez dostępu do konta root?


197

Próbuję wyodrębnić plik APK zainstalowanej aplikacji na Androida BEZ uprawnień administratora.

Myślałem, że to niemożliwe, ponieważ wszystkie pliki APK dla aplikacji niesystemowych znajdują się w katalogu / data / app, a dostęp do tego folderu wymaga uprawnień administratora. Potem odkryłem, że istnieje wiele aplikacji w sklepie Google Play, które wydają się mieć dostęp do plików APK nawet na urządzeniach niezrootowanych.

Czy ktoś może mi powiedzieć, jak to możliwe? Czy nie ma aplikacji do tworzenia kopii zapasowych plików APK bez roota?


2
Myślę, że na to pytanie już udzielono odpowiedzi. Uprzejmie
rzuć




3
Czytam o tym, że @pinas pytał, jak kodować to programowo - odwołując się do aplikacji, które to robią, jakby chciał powiedzieć „Te aplikacje to robią, ale jak?”. Powód „wstrzymania” jest moim zdaniem błędny z tego powodu.
Richard Le Mesurier,

Odpowiedzi:


380

Dostęp / dane / aplikacja jest możliwa bez uprawnień administratora; uprawnienia do tego katalogu to rwxrwx - x. Wykonywanie uprawnień do katalogu oznacza, że ​​możesz uzyskać do niego dostęp, jednak brak uprawnień do odczytu oznacza, że ​​nie możesz uzyskać listy jego zawartości - więc aby uzyskać do niego dostęp, musisz znać nazwę pliku, do którego będziesz uzyskiwać dostęp. Menedżer pakietów Androida poda nazwę zapisanej aplikacji dla danego pakietu.

Aby to zrobić z wiersza polecenia, użyj, adb shell pm list packagesaby uzyskać listę zainstalowanych pakietów i znaleźć żądany pakiet.

Dzięki nazwie pakietu możemy uzyskać rzeczywistą nazwę pliku i lokalizację pakietu APK adb shell pm path your-package-name.

I znając pełny katalog, możemy w końcu wyciągnąć adb za pomocą adb pull full/directory/of/the.apk

Podziękowania dla @tarn za wskazanie, że pod Lollipop będzie ścieżka apk /data/app/your-package-name-1/base.apk


33
Aby to zrobić z wiersza poleceń, użyj, adb shell pm list packagesaby uzyskać listę zainstalowanych pakietów, wybierz żądany pakiet, dołącz -1.apkdo niego i wyciągnij go /data/app. Przykład: jeśli nazwa pakietu to org.mozilla.firefox, użyj adb pull /data/app/org.mozilla.firefox-1.apk.
sschuberth

11
Aby uzyskać rzeczywistą nazwę pliku APK, użyj ścieżki pm powłoki adb nazwa-pakietu-nazwa-ścieżki. Zobacz to pytanie, aby uzyskać bardziej szczegółową odpowiedź stackoverflow.com/questions/4032960/…
Yojimbo,

2
dla Lollipopa ścieżką apk będzie /data/app/your-package-name-1/base.apk
tarn

To mi nie działa. Otrzymuję następujący błąd:adb: error: remote object '/data/app/com.Slack-1/base.apk' does not exist
0xcaff,

1
@ 0xcaff Android zmienił się całkiem sporo w ciągu 5 lat od udzielenia tej odpowiedzi; być może ta ścieżka jest jedną z tych zmian. Powinieneś być w stanie zalogować się i zlokalizować plik ręcznie, aby znaleźć ścieżkę odpowiednią dla twojej wersji systemu operacyjnego.
mah

55

Android dołącza numer kolejny do nazwy pakietu, aby utworzyć ostateczną nazwę pliku APK (możliwe, że zmienia się to w zależności od wersji systemu operacyjnego Android). Poniższa sekwencja poleceń działa na nierootowanym urządzeniu :

  1. Uzyskaj pełną nazwę ścieżki pliku APK dla żądanego pakietu.

    adb shell pm path com.example.someapp

    Daje to wyjście jako: package:/data/app/com.example.someapp-2.apk.

  2. Przeciągnij plik APK z urządzenia z Androidem do okna programowania.

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

Lokalizacja APK po udanym ściągnięciu będzie na ../sdk/platform-tools/base.apk na twoim komputerze / laptopie.


4
Potwierdzam, że to rozwiązanie działało na nierootowanym urządzeniu, choć wymaga znajomości nazwy pakietu przed pierwszym poleceniem! Użyj „pakietów adb shell pm list”, aby uzyskać listę wszystkich pakietów w telefonie, ponieważ nie jesteś pewien nazwy pakietu żądanej aplikacji
AndroidNoob

Do jakiego folderu na lokalnej maszynie ściągacza wchodzi apk? EDYCJA: nvm, bez względu na katalog, w którym byłeś, robiąc adb pull ...
Adam Johns

@IgorGanapolsky spróbuj użyć adb pull /data/app/com.example.someapp-2/base.apk
Chris - Jr

@ zelanix po wykonaniu adb pull, gdzie mogę c plik .apk. Dziękuję
Vijaya Varma Lanke,

22

Nie potrzebujesz uprawnień ROOT, aby uzyskać listę zainstalowanych aplikacji.

Możesz to zrobić za pomocą Android PackageManager.

Poniżej znajduje się mały fragment kodu.

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. sprawdź listę zainstalowanych apk (następujące polecenie wyświetla również ścieżkę, w której jest zainstalowany i nazwę pakietu). adb shell pm lista pakietów -f
  2. użyj adb pull / ścieżka_pakietu / nazwa pakietu / ścieżka_w_pc (ścieżka i nazwa pakietu, które można uzyskać z powyższej komendy 1.)

6

Gdy masz zainstalowane środowisko Eclipse dla Androida:

  • Użyj swojego urządzenia jako urządzenia do debugowania. W telefonie: Ustawienia> Aplikacje> Programowanie i włącz debugowanie USB, zobacz http://developer.android.com/tools/device.html
  • W Eclipse otwórz okno DDMS: Okno> Otwórz perspektywę> Inne ...> DDMS, patrz http://developer.android.com/tools/debugging/ddms.html
  • Jeśli nie widzisz swojego urządzenia, spróbuj (ponownie) zainstalować sterownik USB dla swojego urządzenia
  • W środkowym okienku wybierz zakładkę „Eksplorator plików” i przejdź do systemu> aplikacja
  • Teraz możesz wybrać jeden lub więcej plików, a następnie kliknąć ikonę „Wyciągnij plik z urządzenia” u góry (prawo do zakładek)
  • Wybierz folder docelowy - tada!

Istnieją tylko aplikacje systemowe (inaczej aplikacje wstępnie zainstalowane) w / system / app.
arne.jans

6

Na Nougat (7.0) uruchom wersję Androida, adb shell pm list packagesaby wyświetlić listę pakietów zainstalowanych na urządzeniu. Następnie biegnij, adb shell pm path your-package-nameaby pokazać ścieżkę do aplikacji. Po użyciu adb skopiuj pakiet do Pobranych adb shell cp /data/app/com.test-1/base.apk /storage/emulated/0/Download. Następnie pobierz apk z Pobranych na swój komputer, uruchamiając adb pull /storage/emulated/0/Download/base.apk.


2

mam does not exist error

Oto jak sprawiam, że to działa:

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

Lista PackageManager.getInstalledApplications () daje listę zainstalowanych aplikacji, a ApplicationInfo.sourceDir jest ścieżką do pliku .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

Znalazłem sposób na uzyskanie nazwy pakietu APK na urządzeniu innym niż root. nie jest tak elegancki, ale działa przez cały czas.

Krok 1 : na urządzeniu otwórz docelowy pakiet APK

Krok 2 : W oknie cmd na komputerze wpisz następujące polecenia:

 adb shell dumpsys activity a > dump.txt

ponieważ dane wyjściowe tego polecenia są liczne, zalecane jest przekierowanie do pliku.

Krok 3 : Otwórz ten plik dump.txt w dowolnym edytorze.

dla urządzenia przed Androidem 4.4:
początek pliku wyglądałby tak:

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 

nazwa pakietu znajduje się w 3. linii, com.tencent.mm w tym przykładzie.

dla Androida 4.4 i nowszych:
wyjście dumpsys zmieniło się nieco. spróbuj wyszukać „Stos nr 1”, nazwa pakietu byłaby bardzo blisko pod nim.

Ponadto wyszukaj „baseDir”, znajdziesz pełną ścieżkę do pliku apk!


-1

Otwórz ES explorer -> naciśnij przycisk Menu w lewym górnym rogu (trzy poziome paski) -> w sekcji Biblioteki wybierz Aplikacje.

W ten sposób otrzymujesz listę wszystkich aplikacji użytkownika. Znajdź swoją aplikację i wybierz ją, naciskając ją długo. Następnie naciśnij „Więcej” w prawym dolnym rogu i wybierz „Wyślij”. Następnie możesz użyć różnych opcji, np. Możesz wybrać „ES Save To”, aby zapisać plik .apk w katalogu domowym lub w innym miejscu.


-2

Możesz też pobrać „Przesyłanie plików Bluetooth” z Google Play i ustawić folder domowy na /system/. Wtedy możesz nawet przejść do /.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.