Wygląda na to, że ten plik ma binarny format XML. Co to za format i jak można go przeanalizować programowo (w przeciwieństwie do używania narzędzia aapt dump w SDK)?
Ten format binarny nie jest omawiany w dokumentacji tutaj .
Uwaga : chcę uzyskać dostęp do tych informacji spoza środowiska Android, najlepiej z poziomu Java.
android
android-manifest
jnorris
źródło
źródło
android.content.pm.PackageManager.queryXX
metod (dokumenty: developer.android.com/reference/android/content/pm/… ).Odpowiedzi:
Użyj android-apktool
Istnieje aplikacja, która czyta pliki apk i dekoduje XML do prawie oryginalnej postaci.
Stosowanie:
Sprawdź Android apktool aby uzyskać więcej informacji
źródło
apktool d Gmail.apk && cat Gmail/AndroidManifest.xml
minSdkVersion
a inne parametry wersji można również znaleźć wGmail/apktool.yml
Ta metoda Java, która działa na Androidzie, dokumentuje (o czym byłem w stanie zinterpretować) format binarny pliku AndroidManifest.xml w pakiecie .apk. Drugie pole z kodem pokazuje, jak wywołać decompressXML i jak załadować bajt [] z pliku pakietu aplikacji na urządzeniu. (Są pola, których celu nie rozumiem, jeśli wiesz, co oznaczają, powiedz mi, zaktualizuję informacje.)
Ta metoda odczytuje AndroidManifest do bajtu [] w celu przetworzenia:
Większość aplikacji jest przechowywana w / system / app, który można odczytać bez rootowania mojego Evo, inne aplikacje znajdują się w / data / app, do których potrzebowałem roota. Powyższy argument „ścieżka” wyglądałby tak: „/system/app/Weather.apk”
źródło
A co z użyciem narzędzia do pakowania zasobów systemu Android (aapt), z zestawu Android SDK, do skryptu w języku Python (lub cokolwiek innego)?
Za pośrednictwem aapt ( http://elinux.org/Android_aapt ) można rzeczywiście pobrać informacje o pakiecie .apk i jego pliku AndroidManifest.xml . W szczególności można wyodrębnić wartości poszczególnych elementów pakietu .apk za pomocą polecenia podrzędnego „dump” . Na przykład, możesz wyodrębnić uprawnienia użytkownika w pliku AndroidManifest.xml wewnątrz pakietu .apk w następujący sposób:
Gdzie package.apk to Twój pakiet .apk .
Co więcej, możesz użyć polecenia potoku systemu Unix, aby wyczyścić dane wyjściowe. Na przykład:
Tutaj skrypt w Pythonie, który do tego programowo:
W podobny sposób możesz wyodrębnić inne informacje (np. Pakiet , nazwa aplikacji itp.) Z pliku AndroidManifest.xml :
Jeśli zamiast tego chcesz przeanalizować całe drzewo XML AndroidManifest, możesz to zrobić w podobny sposób za pomocą polecenia xmltree :
Używanie Pythona jak poprzednio:
źródło
Możesz skorzystać z narzędzia axml2xml.pl opracowanego jakiś czas temu w ramach projektu android-random . Wygeneruje tekstowy plik manifestu (AndroidManifest.xml) z pliku binarnego.
Mówię „ tekstowy ”, a nie „ oryginalny ”, ponieważ podobnie jak wiele narzędzi do inżynierii odwrotnej, to nie jest doskonałe, a wynik nie będzie kompletny . Zakładam, że albo nigdy nie był on kompletny, albo po prostu nie był kompatybilny z nowszymi wersjami binarnymi. Niezależnie od przyczyny, narzędzie axml2xml.pl nie będzie w stanie poprawnie wyodrębnić wszystkich wartości atrybutów. Takie atrybuty to minSdkVersion, targetSdkVersion i w zasadzie wszystkie atrybuty, które odwołują się do zasobów (jak napisy, ikony itp.), Tj. Tylko nazwy klas (działań, usług itp.) Są poprawnie wyodrębniane.
Jednak nadal możesz znaleźć te brakujące informacje, uruchamiając narzędzie aapt w oryginalnym pliku aplikacji na Androida ( .apk ):
źródło
Dzięki najnowszym narzędziom SDK możesz teraz użyć narzędzia zwanego apkanalyzer do wydrukowania pliku AndroidManifest.xml pliku APK (a także innych części, takich jak zasoby).
[android sdk]/tools/bin/apkanalyzer manifest print [app.apk]
apkanalyzer
źródło
Sprawdź ten następujący projekt WPF, który poprawnie dekoduje właściwości.
źródło
apk-parser, https://github.com/caoqianli/apk-parser , lekki impl dla java, bez zależności od aapt lub innych plików binarnych, jest dobry do analizowania binarnych plików xml i innych informacji o apk.
źródło
Jeśli korzystasz z Pythona lub Androguard , funkcja Androguard Androaxml wykona tę konwersję za Ciebie. Ta funkcja jest szczegółowo opisana w tym poście na blogu , z dodatkową dokumentacją tutaj i źródłem tutaj .
Stosowanie:
źródło
Na wypadek, gdyby było to przydatne, oto wersja C ++ fragmentu kodu Java opublikowana przez Ribo:
źródło
chars
jest przydzielany przez nowy znak [], ale następnie jest wolny, zamiast prawidłowegodelete[] chars;
. Na końcu edytora decompressXML musi byćprt(" end at offset "+toIntString(off));
, w przeciwnym razie używana jest arytmetyka wskaźników ...w celach informacyjnych tutaj jest moja wersja kodu Ribo. Główna różnica polega na tym, że decompressXML () bezpośrednio zwraca ciąg znaków, co dla moich celów było bardziej odpowiednim zastosowaniem.
UWAGA: moim jedynym celem korzystania z rozwiązania Ribo było pobranie opublikowanej wersji pliku .APK z pliku Manifest XML i potwierdzam, że w tym celu działa pięknie.
EDYCJA [2013-03-16]: Działa pięknie, JEŻELI wersja jest ustawiona jako zwykły tekst, ale jeśli jest ustawiona na odwołanie się do zasobu XML, pojawi się na przykład jako „Zasób 0x1”. W tym konkretnym przypadku prawdopodobnie będziesz musiał połączyć to rozwiązanie z innym rozwiązaniem, które pobierze odpowiednie odwołanie do zasobu ciągu.
Mam nadzieję, że pomoże to również innym ludziom.
źródło
W Android Studio 2.2 możesz bezpośrednio przeanalizować apk. Idź do kompilacji - przeanalizuj apk. Wybierz apk, przejdź do androidmanifest.xml. Możesz zobaczyć szczegóły manifestu androida.
źródło
Wersja @Mathieu Kotlin wygląda następująco:
To jest wersja kotlin odpowiedzi powyżej.
źródło
Znalazłem AXMLPrinter2, aplikację Java w projekcie Android4Me, która działa dobrze na AndroidManifest.xml, który miałem (i drukuje XML w ładnie sformatowany sposób). http://code.google.com/p/android4me/downloads/detail?name=AXMLPrinter2.jar
Jedna uwaga ... to (i kod w tej odpowiedzi z Ribo) nie wydaje się obsługiwać każdego skompilowanego pliku XML, z którym się spotkałem. Znalazłem taki, w którym łańcuchy były przechowywane z jednym bajtem na znak, a nie w zakładanym formacie dwubajtowym.
źródło
to może być pomocne
G to moja klasa aplikacji:
źródło
Używam kodu Ribo zamieszczonego powyżej od ponad roku i dobrze nam służył. Jednak po ostatnich aktualizacjach (Gradle 3.x) nie byłem już w stanie przeanalizować pliku AndroidManifest.xml, otrzymywałem błędy indeksu poza zakresem i generalnie nie był już w stanie przeanalizować pliku.
Aktualizacja: teraz uważam, że nasze problemy dotyczyły aktualizacji do Gradle 3.x. W tym artykule opisano, w jaki sposób AirWatch miał problemy i można je naprawić za pomocą ustawienia Gradle do używania aapt zamiast aapt2 AirWatch wydaje się być niekompatybilny z wtyczką Android dla Gradle 3.0.0-beta1
Szukając w okolicy, natknąłem się na ten projekt open source i jest on utrzymywany i byłem w stanie przejść do rzeczy i przeczytać zarówno moje stare pliki APK, które mogłem wcześniej przeanalizować, jak i nowe pliki APK, które logika z Ribo rzuciła wyjątki
https://github.com/xgouchet/AXML
Z jego przykładu robię to
źródło
apkanalyzer będzie pomocny
oryginalny post https://stackoverflow.com/a/51905063/1383521
źródło