Analizowanie kompilacji za pomocą Analizatora plików APK

Android Studio zawiera narzędzie do analizowania plików APK, które zapewnia natychmiastowy wgląd w skład pliku APK lub pakietu Android App Bundle po zakończeniu procesu kompilacji. Narzędzie do analizowania plików APK może skrócić czas debugowania problemów z plikami i zasobami DEX w aplikacji, a także zmniejszyć rozmiar pliku APK. Analizator plików APK jest też dostępny z poziomu wiersza poleceń apkanalyzer.


Za pomocą Analizatora plików APK możesz:

  • Wyświetlaj bezwzględny i względny rozmiar plików w aplikacji, takich jak pliki zasobów DEX i Androida.
  • Poznaj strukturę plików DEX.
  • Szybko wyświetl w aplikacji ostateczne wersje plików, np. plik AndroidManifest.xml.
  • Porównanie 2 plików APK lub pakietów aplikacji.

Dostęp do Analizatora plików APK, gdy projekt jest otwarty, można uzyskać na 3 sposoby:

  • Przeciągnij plik APK lub pakiet aplikacji do okna Edytora w Android Studio.
  • Przełącz się na widok Projekt w oknie Projekt, a następnie kliknij dwukrotnie plik APK w domyślnym katalogu build/output/apks/.
  • Na pasku menu kliknij Utwórz > Analizuj plik APK, a potem wybierz swój plik APK lub pakiet aplikacji.

Wyświetlanie informacji o pliku i jego rozmiarze

Pliki APK to pliki w formacie ZIP. Analizator plików APK wyświetla każdy plik lub folder jako element, który możesz rozwinąć, aby przejść do folderów. Hierarchia encji odzwierciedla strukturę plików i folderów w pliku APK.

Analizator plików APK pokazuje rozmiar pliku skompresowanego (czyli „rozmiar pliku nieprzetworzonego”) i wartości rozmiaru pliku pobieranego w przypadku każdego elementu, jak pokazano na rysunku 1. Rozmiar pliku nieprzetworzonego odzwierciedla udział elementu w łącznym rozmiarze pliku APK. Rozmiar pobierania to szacowany rozmiar skompresowanego elementu, który ma być wyświetlany w Google Play. % całkowitego rozmiaru pobierania wskazuje odsetek łącznego rozmiaru pobierania pliku APK, jaki reprezentuje dana jednostka.

Rysunek 1. Rozmiary plików w analizatorze APK.

Wyświetl plik AndroidManifest.xml

Jeśli projekt zawiera wiele plików AndroidManifest.xml, np. dotyczących smaków produktów, lub biblioteki, które zawierają też plik manifestu, zostaną one scalone w jeden plik w aplikacji. Ten plik manifestu jest zwykle plikiem binarnym w pakiecie APK lub pakiecie aplikacji, ale gdy wybierzesz go w Analizatorze plików APK, jego postać XML zostanie zrekonstruowana i zaprezentowana.

Pomoże Ci on zrozumieć wszelkie zmiany, które mogły zostać wprowadzone w aplikacji podczas jej kompilacji. Możesz na przykład zobaczyć, jak plik AndroidManifest.xml z biblioteki, od której zależy Twoja aplikacja, jest scalany w ostateczny plik AndroidManifest.xml.

Dodatkowo ta przeglądarka umożliwia także lintowanie. W prawym górnym rogu pojawiają się ostrzeżenia lub błędy. Rysunek 2 przedstawia zgłaszany błąd w przypadku wybranego pliku manifestu.

Rysunek 2. W prawym górnym rogu wybranego pliku manifestu pojawi się ikona błędu.

Wyświetl pliki DEX

Przeglądarka plików DEX Analizatora APK umożliwia natychmiastowy dostęp do podstawowych informacji w plikach DEX w aplikacji. Wyświetlający udostępnia klasę, pakiet, łączną wartość referencyjną i liczbę deklaracji. Ułatwia to podjęcie decyzji o użyciu multidex i usuwaniu zależności poniżej limitu 64 tys. DEX.

Rysunek 3 przedstawia aplikację średniego rozmiaru, która nie przekracza limitu 64 tys. plików DEX. Poszczególne pakiety, klasa i metody w pliku DEX mają liczby wymienione w kolumnach Zdefiniowane metody i Metody odniesienia.

W kolumnie Referenced Methods są zliczane wszystkie metody, do których odwołuje się plik DEX. Obejmuje to zwykle metody zdefiniowane w kodzie, biblioteki zależności i metody zdefiniowane w standardowych pakietach Javy i Androida, których używa kod. Metody te wliczają się do limitu 64 tys. metod w każdym pliku DEX.

W kolumnie Zdefiniowane metody zliczane są tylko metody zdefiniowane w jednym z plików DEX, więc ta liczba jest podzbiorem metod odniesienia.

Rysunek 3. Średniej wielkości aplikacja.

Filtrowanie widoku drzewa plików DEX

Nad listą Class (klasa) Analizator plików APK udostępnia filtry umożliwiające wyświetlanie zawartości wybranego pliku DEX, jak widać na ilustracji 4.

Rysunek 4. Filtry DEX ustawione tak, aby wyświetlać pola i metody w BuildConfig.

Aby użyć filtrów do wyświetlenia wszystkich metod i pól w klasie:

  1. Na liście Plik wybierz plik classes.dex.
  2. Z listy Zajęcia przejdź do zajęć i je wybierz.
  3. Rozwiń wybrane zajęcia.
  4. Przełącz Pokaż pola , aby wyświetlić lub ukryć pola zajęć.
  5. Przełącz Pokaż metody , aby wyświetlić lub ukryć metody klas.
  6. Przełącz Pokaż wszystkie przywołane metody lub pola , aby wyświetlić lub ukryć powiązane pakiety, klasy, metody i pola.

    W widoku drzewa węzły wyróżnione kursywą to odwołania, które nie mają definicji w wybranym pliku DEX. Plik DEX może odwoływać się do metod i pól zdefiniowanych w innym pliku. Na przykład System.out.println() jest odniesieniem do metody println() w platformie Androida.

Wczytywanie mapowań ProGuard

Obok ikon filtrowania znajdują się ikony mapowania ProGuard. Ikony ProGuard są wyszarzone, dopóki nie wczytasz zestawu plików mapowania ProGuard, które dodają do przeglądarki DEX funkcje, takie jak usuwanie zaciemnienia kodu (mapping.txt), pokazujące węzły, które zostały usunięte (usage.txt) i wskazują węzły, których nie można usunąć (seeds.txt).

Importowany plik mapowania ProGuard musi pochodzić z tej samej kompilacji, która wyprodukowała pliki DEX z włączonym zmniejszaniem kodu.

Rysunek 5. Wczytaj mapowania ProGuard...

Aby wczytać pliki mapowania ProGuard:

  1. Kliknij Wczytaj mapowania ProGuard....
  2. Przejdź do folderu projektu, który zawiera pliki mapowania, i wczytaj wszystkie pliki, dowolną ich kombinację lub folder, w którym są te pliki.

    Pliki mapowania znajdują się zwykle w lokalizacji project/app/build/outputs/mappings/release/. Jeśli selektor plików wykryje tę strukturę projektu, domyślnie zostanie zastosowany folder release.

    Najpierw selektor plików sprawdza, czy nazwy plików są takie same jak mapping.txt, seeds.txt i usage.txt. Następnie selektor plików sprawdza, czy nie ma w nim nazw plików zawierających tekst mapping, usage lub seeds i kończący się na .txt. Dopasowane są na przykład release-seeds-1.10.15.txt.

Oto lista plików mapowania:

  • seeds.txt: węzły, których konfiguracja ProGuard nie pozwala na usunięcie podczas zmniejszania, są pogrubione.
  • mapping.txt: włącza usunięcie zaciemnienia nazw , dzięki czemu możesz przywrócić pierwotne nazwy węzłów zaciemnionych przez R8. Możesz na przykład przywrócić zaciemnione nazwy węzłów, takie jak a, b, c, do MyClass, MainActivity i myMethod().
  • usage.txt: włącza opcję Pokaż usunięte węzły , aby pokazać klasy, metody i pola usunięte przez R8 podczas zmniejszania. Przywrócone węzły są wyświetlane po przekreśleniu.

    Więcej informacji o używaniu R8 do zaciemniania i minimalizowania kodu znajdziesz w artykule Zmniejszanie, zaciemnianie i optymalizowanie aplikacji.

Wyświetlanie kodu bajtowego, znajdowanie przypadków użycia i generowanie reguły Keep

Węzły w widoku listy Class mają menu kontekstowe z poniższymi opcjami, które pozwalają zobaczyć kod bajtowy, znaleźć przypadki użycia i wyświetlić okno z regułami ProGuard do skopiowania i wklejenia dla wybranego węzła. Kliknij prawym przyciskiem myszy dowolny węzeł w widoku listy klas, aby wyświetlić jego menu kontekstowe.

Pokaż kod bajtowy: dekompiluje wybraną klasę, metodę lub pole i wyświetla w oknie reprezentację kodu bajtowego smali w ten sposób:

Rysunek 6. Kod bajtowy DEX dla metody init.

Znajdź przypadki użycia: pokazuje, które inne części kodu DEX zawierają odwołania do wybranej klasy lub metody, jak widać na ilustracji 7. Jeśli załadowano seeds.txt, węzły wyświetlane pogrubioną czcionką wskazują, że konfiguracja ProGuard uniemożliwia ich usunięcie podczas zmniejszania:

Rysunek 7. Odniesienia do zakresu MyClass.

Wygeneruj regułę ProGuard Keep: pokazuje reguły ProGuard, które możesz skopiować i wkleić do pliku konfiguracji ProGuard projektu, jak pokazano na ilustracji 8. Dzięki temu dany pakiet, klasę, metodę lub pole nie zostanie usunięty podczas fazy zmniejszania kodu. Więcej informacji znajdziesz w artykule o dostosowywaniu kodu do zachowania.

Rysunek 8. Reguły ProGuard, które można skopiować z okna do pliku konfiguracji ProGuard.

Wyświetl encje kodu i zasobów

Różne zadania kompilacji zmieniają encje końcowe w aplikacji. Na przykład reguły zmniejszania ProGuard mogą zmieniać końcowy kod, a zasoby obrazów mogą być zastępowane zasobami o rodzaju usługi.

Aby wyświetlić ostateczną wersję plików za pomocą Analizatora plików APK, kliknij element, by wyświetlić podgląd elementu tekstowego lub obrazu, tak jak pokazano na ilustracji 9.

Rysunek 9. Podgląd ostatecznego zasobu obrazu.

Analizator plików APK może też wyświetlać różne pliki tekstowe i binarne. Na przykład w przeglądarce encji resources.arsc możesz zobaczyć wartości związane z konfiguracją, takie jak tłumaczenia na język zasobu w postaci ciągów znaków. Na ilustracji 10 możesz zobaczyć tłumaczenia poszczególnych zasobów w postaci ciągu znaków.

Rysunek 10. Podgląd zasobów przetłumaczonych ciągów tekstowych.

Porównaj pliki

Analizator plików APK może porównać rozmiar encji w 2 różnych plikach APK lub pakietach aplikacji. Jest to przydatne, gdy chcesz się dowiedzieć, dlaczego aplikacja zwiększyła się w porównaniu z poprzednią wersją.

Zanim opublikujesz zaktualizowaną aplikację, wykonaj te czynności:

  1. Wczytaj do Analizatora plików APK wersję aplikacji, którą chcesz opublikować.
  2. W prawym górnym rogu Analizatora plików APK kliknij Porównaj z poprzednim plikiem APK....
  3. W oknie wyboru znajdź artefakt, który został ostatnio opublikowany dla użytkowników, i kliknij OK.

    Okno podobne do przedstawionego na Rysunku 11 pomoże Ci ocenić wpływ aktualizacji na użytkowników.

Rysunek 11 przedstawia różnicę między debugowaniem danej aplikacji a kompilacjami do publikacji. W poszczególnych typach kompilacji używane są inne opcje kompilacji, które w różny sposób zmieniają bazowe elementy.

Rysunek 11. Różnica między plikiem APK do debugowania a pakietem APK wersji.