Build mit APK Analyzer analysieren

Android Studio enthält ein APK-Analysetool, das dir direkt nach Abschluss des Build-Prozesses einen Überblick über die Zusammensetzung deines APKs oder Android App Bundles bietet. Mit APK Analyzer können Sie den Zeitaufwand für das Beheben von Problemen mit DEX-Dateien und -Ressourcen in Ihrer App verringern und die APK-Größe verringern. APK Analyzer ist auch über die Befehlszeile mit apkanalyzer verfügbar.


Mit dem APK Analyzer können Sie:

  • Sehen Sie sich die absolute und relative Größe von Dateien in der App an, z. B. die DEX- und Android-Ressourcendateien.
  • Informationen zur Zusammensetzung von DEX-Dateien.
  • Schnell die endgültigen Versionen von Dateien in der App anzeigen, z. B. die Datei AndroidManifest.xml.
  • Führe einen Vergleich zwischen zwei APKs oder App Bundles durch.

Es gibt drei Möglichkeiten, auf das APK Analyzer zuzugreifen, wenn ein Projekt geöffnet ist:

  • Ziehen Sie ein APK oder App-Bundle in das Editorfenster von Android Studio.
  • Wechseln Sie im Fenster Projekt zur Ansicht Projekt und klicken Sie dann doppelt auf das APK im Standardverzeichnis build/output/apks/.
  • Wählen Sie in der Menüleiste Build > Analyze APK (Erstellen > APK analysieren) und dann Ihr APK oder App Bundle aus.

Informationen zu Datei und Größe ansehen

APKs sind Dateien im ZIP-Dateiformat. Das APK Analyzer zeigt jede Datei oder jeden Ordner als Entität an, die Sie erweitern können, um in Ordner zu navigieren. Die Hierarchie der Entitäten entspricht der Struktur der Dateien und Ordner in der APK-Datei.

Das APK Analyzer zeigt die Größe der ZIP-Datei (oder „Rohdateigröße“) und die Werte für die Größe der Download-Datei für jede Entität an, wie in Abbildung 1 dargestellt. Die Rohdateigröße gibt den Beitrag der Entität zur APK-Gesamtgröße an. Die Downloadgröße stellt die geschätzte komprimierte Größe der Entität dar, wie sie von Google Play bereitgestellt wird. % der Downloadgröße insgesamt gibt den Prozentsatz der gesamten Downloadgröße des APK an, den die Entität darstellt.

Abbildung 1: Dateigrößen in APK Analyzer.

AndroidManifest.xml aufrufen

Wenn Ihr Projekt mehrere AndroidManifest.xml-Dateien enthält, z. B. für Produktvarianten oder Bibliotheken, die auch eine Manifestdatei bereitstellen, werden sie in Ihrer App in einer einzigen Datei zusammengeführt. Diese Manifestdatei ist normalerweise eine Binärdatei im APK oder App Bundle. Wird sie jedoch im APK Analyzer ausgewählt, wird die XML-Form dieser Entität rekonstruiert und präsentiert.

Mit diesem Viewer können Sie Änderungen nachvollziehen, die während des Builds an Ihrer App vorgenommen wurden. Sie können beispielsweise sehen, wie die Datei AndroidManifest.xml aus einer Bibliothek, von der Ihre Anwendung abhängt, in der endgültigen AndroidManifest.xml-Datei zusammengeführt wird.

Darüber hinaus bietet dieser Viewer einige Lint-Funktionen. Warnungen oder Fehler werden in der oberen rechten Ecke angezeigt. Abbildung 2 zeigt einen Fehler, der für die ausgewählte Manifestdatei gemeldet wird.

Abbildung 2: Für die ausgewählte Manifestdatei wird oben rechts ein Fehlersymbol angezeigt.

DEX-Dateien ansehen

Der DEX-Dateianzeige von APK Analyzer bietet Ihnen sofortigen Zugriff auf die zugrunde liegenden Informationen in den DEX-Dateien in Ihrer App. Die Anzahl der Klassen, Pakete, Gesamtreferenzen und Deklarationen kann bei der Entscheidung hilfreich sein, ob Multidex verwendet werden soll oder wie Abhängigkeiten entfernt werden, um unter das 64.000 DEX-Limit zu gelangen.

Abbildung 3 zeigt eine mittelgroße Anwendung, die unter dem 64.000-DEX-Limit liegt. Für jedes Paket, jede Klasse und jede Methode in der DEX-Datei ist in den Spalten Definierte Methoden und Referenzierte Methoden die jeweilige Anzahl aufgeführt.

In der Spalte Referenzierte Methoden werden alle Methoden aufgeführt, auf die die DEX-Datei verweist. Dazu gehören in der Regel in Ihrem Code definierte Methoden, Abhängigkeitsbibliotheken und Methoden, die in Standard-Java- und Android-Paketen definiert sind, die der Code verwendet. Dies sind die Methoden, die auf das Limit von 64 K in jeder DEX-Datei angerechnet werden.

In der Spalte Defined Methods werden nur die Methoden gezählt, die in einer Ihrer DEX-Dateien definiert sind. Diese Zahl ist also eine Teilmenge der referenzierten Methoden.

Abbildung 3: Eine mittelgroße App.

Strukturansicht der DEX-Datei filtern

Direkt über der Liste Class (Klasse) enthält das APK Analyzer Filter zum Anzeigen des Inhalts der ausgewählten DEX-Datei (siehe Abbildung 4).

Abbildung 4: DEX-Filter, die so eingestellt sind, dass Felder und Methoden für BuildConfig angezeigt werden.

So verwenden Sie die Filter zum Anzeigen aller Methoden und Felder in einer Klasse:

  1. Wählen Sie in der Liste Datei die Datei classes.dex aus.
  2. Gehen Sie in der Liste Kurs zu einem Kurs und wählen Sie ihn aus.
  3. Maximieren Sie den ausgewählten Kurs.
  4. Aktivieren oder deaktivieren Sie Felder anzeigen , um die Klassenfelder ein- oder auszublenden.
  5. Aktivieren oder deaktivieren Sie Methoden anzeigen , um die Klassenmethoden ein- oder auszublenden.
  6. Aktivieren oder deaktivieren Sie Alle referenzierten Methoden oder Felder anzeigen , um referenzierte Pakete, Klassen, Methoden und Felder ein- oder auszublenden.

    In der Baumansicht sind kursiv dargestellte Knoten Verweise, die in der ausgewählten DEX-Datei keine Definition haben. Eine DEX-Datei kann Methoden und Felder referenzieren, die in einer anderen Datei definiert sind. System.out.println() ist beispielsweise ein Verweis auf die Methode println() im Android-Framework.

ProGuard-Zuordnungen laden

Neben den Filtersymbolen befinden sich die ProGuard-Zuordnungssymbole. Die ProGuard-Symbole sind ausgegraut, bis Sie eine Reihe von ProGuard-Zuordnungsdateien laden, die dem DEX-Viewer Funktionen hinzufügen, z. B. die Offenlegung von Namen (mapping.txt), entfernte Knoten (usage.txt) und Knoten, die nicht entfernt werden können (seeds.txt).

Die importierte ProGuard-Zuordnungsdatei muss aus demselben Build stammen, aus dem die DEX-Dateien mit aktivierter Codereduzierung erstellt wurden.

Abbildung 5: Proguard-Zuordnungen laden...

So laden Sie die ProGuard-Zuordnungsdateien:

  1. Klicken Sie auf Proguard-Zuordnungen laden....
  2. Rufen Sie den Projektordner auf, der die Zuordnungsdateien enthält, und laden Sie alle Dateien, eine beliebige Kombination der Dateien oder den Ordner, der die Dateien enthält.

    Die Zuordnungsdateien befinden sich normalerweise in project/app/build/outputs/mappings/release/. In der Dateiauswahl wird standardmäßig der Ordner release (Veröffentlichung) verwendet, wenn diese Projektstruktur erkannt wird.

    Zuerst sucht die Dateiauswahl nach Dateinamen, die genau mit mapping.txt, seeds.txt und usage.txt übereinstimmen. Als Nächstes sucht die Dateiauswahl nach Dateinamen, die den Text mapping, usage oder seeds enthalten und mit .txt enden. Beispiel: release-seeds-1.10.15.txt ist eine Übereinstimmung.

In der folgenden Liste werden die Zuordnungsdateien beschrieben:

  • seeds.txt: Knoten, die durch die ProGuard-Konfiguration beim Verkleinern nicht entfernt werden können, sind fett dargestellt.
  • mapping.txt: Aktiviert Offenlegung von Namen , damit Sie die ursprünglichen Namen von Knoten wiederherstellen können, die von R8 verschleiert wurden. Beispielsweise können Sie verschleierte Knotennamen wie a, b, c in MyClass, MainActivity und myMethod() wiederherstellen.
  • usage.txt: Aktiviert Entfernte Knoten anzeigen , damit Klassen, Methoden und Felder angezeigt werden können, die von R8 beim Verkleinern entfernt wurden. Die wiederhergestellten Knoten werden durchgestrichen.

    Weitere Informationen zur Verwendung von R8 zum Verschleieren und Minimieren Ihres Codes finden Sie unter Anwendung verkleinern, verschleiern und optimieren.

Bytecode anzeigen, Nutzungen finden und Notizen-Regel generieren

Die Knoten in der Listenansicht Klasse haben ein Kontextmenü mit den folgenden Optionen. Damit können Sie den Bytecode sehen, Nutzungen finden und ein Dialogfeld mit ProGuard-Regeln zum Kopieren und Einfügen für den ausgewählten Knoten anzeigen. Klicken Sie in der Listenansicht Klasse mit der rechten Maustaste auf einen beliebigen Knoten, um das zugehörige Kontextmenü aufzurufen.

Bytecode anzeigen: Dekompiliert die ausgewählte Klasse, Methode oder das ausgewählte Feld und zeigt die Smali-Bytecode-Darstellung in einem Dialogfeld an:

Abbildung 6: DEX-Bytecode für die Methode init.

Nutzungen suchen: Zeigt, welche anderen Teile des DEX-Codes auf die ausgewählte Klasse oder Methode verweisen (siehe Abbildung 7). Wenn seeds.txt geladen ist, weisen fett gedruckte Knoten darauf hin, dass die ProGuard-Konfiguration verhindert, dass sie während des Verkleinerns entfernt werden:

Abbildung 7: Verweise auf MyClass.

ProGuard Keep-Regel generieren: Zeigt ProGuard-Regeln an, die Sie kopieren und in die ProGuard-Konfigurationsdatei Ihres Projekts einfügen können (siehe Abbildung 8). Dadurch wird verhindert, dass ein bestimmtes Paket, eine bestimmte Klasse, eine bestimmte Methode oder ein bestimmtes Feld während der Codeschrumpfungsphase entfernt wird. Weitere Informationen finden Sie unter Anpassen, welcher Code beibehalten werden soll.

Abbildung 8: ProGuard-Regeln, die Sie aus dem Dialogfeld in Ihre ProGuard-Konfigurationsdatei kopieren können.

Code- und Ressourcenentitäten ansehen

Durch verschiedene Build-Aufgaben werden die endgültigen Entitäten in einer Anwendung geändert. So können beispielsweise ProGuard-Schrumpfregeln den endgültigen Code ändern und Image-Ressourcen können durch Ressourcen in einer Produktvariante überschrieben werden.

Wenn Sie die endgültige Version Ihrer Dateien mit APK Analyzer ansehen möchten, klicken Sie auf die Entität, um eine Vorschau der Text- oder Bildentität zu sehen (siehe Abbildung 9).

Abbildung 9: Vorschau der endgültigen Bildressource.

Das APK Analyzer kann auch verschiedene Text- und Binärdateien anzeigen. Im Entitäts-Viewer resources.arsc können Sie beispielsweise die konfigurationsspezifischen Werte wie die Sprachübersetzungen für eine String-Ressource sehen. In Abbildung 10 sehen Sie die Übersetzungen für jede Stringressource.

Abbildung 10: Vorschau übersetzter String-Ressourcen.

Dateien vergleichen

Das APK Analyzer kann die Größe der Entitäten in zwei verschiedenen APK- oder App Bundle-Dateien vergleichen. Das ist hilfreich, wenn du wissen möchtest, warum die Größe deiner App im Vergleich zu einem früheren Release zugenommen hat.

Bevor Sie eine aktualisierte App veröffentlichen, gehen Sie so vor:

  1. Laden Sie die Version der App, die Sie veröffentlichen möchten, in das APK Analyzer.
  2. Klicken Sie rechts oben im APK Analyzer auf Mit vorherigem APK vergleichen....
  3. Suchen Sie im Auswahldialogfeld nach dem Artefakt, das zuletzt für Ihre Nutzer veröffentlicht wurde, und klicken Sie auf OK.

    Es wird ein Dialogfeld wie in Abbildung 11 angezeigt, mit dem Sie die Auswirkungen des Updates auf die Nutzer beurteilen können.

In Abbildung 11 sehen Sie den Unterschied zwischen Debug- und Release-Builds einer bestimmten Anwendung. Zwischen diesen Build-Typen werden unterschiedliche Build-Optionen verwendet, die die zugrunde liegenden Entitäten unterschiedlich ändern.

Abbildung 11: Der Unterschied zwischen einem Debug- und einem Release-APK.