Ich habe lange über die Codeleistung und die Optimierungsparameter gelesen. Android-Programme sind einer meiner Schwerpunkte.
Lassen Sie uns zunächst die grundlegenden oder wichtigsten Konzepte vorstellen, die uns helfen, eine Lösung zu finden.
Wie Android Developer angegeben hat
Das Modul kann unabhängig erstellt, getestet und getestet werden
Daher haben Module ihre eigenen Gradle & Abhängigkeiten. Und Sie können es im Projekt untersuchen Hierarchy Viewer
.
Tatsächlich liegt der Schwerpunkt der Modularisierung auf Wartungsfragen . Im Gegensatz zu Leistungsfragen hat die Modularisierung folgende wichtige Auswirkungen:
Hier ist ein Diagramm, das ich gezeichnet habe, um es klar zu machen. Wie Sie sehen können, wird bei Verwendung eines diskreten Moduls zum Aufrufen von Methode A 2N micro secs
mit N micro secs
ohne diskretes Modul verglichen .
Diese Frage ist mir in den Sinn gekommen, dass referenzierte Methoden zählen, was mit der Vererbungstiefe zusammenhängt.
Die Antwort lautet: Obwohl die Verwendung von Modularisierung referenzierten Methods.but erhöht, ist es nicht wirklich die App Leistung auswirken und die Haupt mögliche Problem ist Tiefe der Vererbung , in denen in den meisten Fällen vernachlässigbar .
Ich betone, dass erhöhte referenzierte Methoden in der Modularisierung auf jedes Modul Gradle & Abhängigkeiten zurückzuführen sind
Wie kann die App-Modularisierung die Anzahl der referenzierten Methoden drastisch erhöhen?
Bedingungen, unter denen der APK-Analysator eine wichtige Rolle spielt. Referenzierte Methoden
Beachten Sie auch, dass durch Minimierung und Verkleinerung des Codes auch der Inhalt einer DEX-Datei nach dem Kompilieren des Quellcodes erheblich verändert werden kann.
Zusätzlich zu der obigen offiziellen Erklärung möchte ich eine weitere Bedingung hinzufügen, bei der der APK-Analysator Auswirkungen hat:
Wie viel Erfahrung hat der Entwickler mit Modularisierung?
Modularisierung ist wie ein Zuhause, in dem Architektur (Entwickler) definiert, wo Küche sein soll und wo Ruheraum sein soll und wo WC sein soll.
Was ist, wenn sich die Architektur für die Kombination von WC und Küche entscheidet? Ja, das ist eine Katastrophe.
Dies kann während der Modularisierung passieren, wenn der Entwickler nicht sehr erfahren ist.
Beantwortung von OP-Fragen zusätzlich zu zusätzlichen Informationen
Hier beantworte ich op gestellte Fragen in den Kommentaren
Warum sollte ein separater Gradle die Anzahl der referenzierten Methoden erhöhen? Und für separate Abhängigkeiten: Wenn das Endergebnis eine einzelne APK ist, denke ich nicht, dass doppelte Abhängigkeiten in 'App' und Feature-Modul zur Anzahl der referenzierten Methoden beitragen würden.
Da Module erstellt, getestet und debuggt werden können, MÜSSEN sie ihre eigenen Gradle & Dependencies haben.
Während das Projekt mit mehreren Modulen ausgeführt wird, generiert der Compiler mehrere .dex
Dateien, darunter:
- eine
.dex
Datei für vollständig integrierte Abhängigkeiten
- Module
.dex
s
Die Abhängigkeitsdatei .dex
ist eine Integration aller Modul-Gradles
Schauen wir uns an, wie sich ein Modulgradle auf die endgültige Anzahl der referenzierten Motten auswirkt.
Es gibt 2 APK
s mit dem gleichen Ergebnis, aber der Unterschied in der Anzahl der referenzierten Methoden.
Bei beiden handelt es sich um leere Aktivitäten, bei denen die 1.7k
Anzahl der referenzierten Methoden sehr hoch ist und die von ihrer Funktionalität abhängt. Der Hauptunterschied liegt im Gradle ihres Moduls, für den einer von ihnen konfiguriert wurde
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
}
Ein anderer konfiguriert für
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.2.0-alpha01'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4'
}
Obwohl es sich nur um leere Aktivitäten handelt, verursachte ein minimaler Unterschied in Gradle einen Unterschied in der Anzahl der 1.7k
referenzierten Methoden.
Und App Gradle ist
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation project(path: ':module')
}
Hauptanliegen ist, warum sich das Hinzufügen einer individuell referenzierten Methodenanzahl von der Gesamtzahl der referenzierten Methoden in Apk Analyzer unterscheidet.
Dies ist nur IDE-Filter nichts anderes. Wenn Sie nur eine .dex
Datei auswählen, entspricht die Anzahl der Referenzmethoden der Summe der Zeilenanzahl der referenzierten Methoden. Wenn Sie jedoch mehrere .dex
Dateien auswählen , werden Sie Unterschiede in der Summe und der tatsächlichen Anzahl feststellen, die aufgrund der Gleichheit der Referenzen, die Analyzer bevorzugt hat filtern Sie sie.
In Ihren Screenshots haben Sie mehrere .dex
Dateien ausgewählt und dann die Gleichheit des Analyzer-Filters.
In unserem Projekt verwenden wir die zentralisierte Datei dependencies.gradle, sodass keine Chance auf eine andere Version besteht. Denken Sie also, selbst wenn wir dieselben / exakten Abhängigkeiten und deren Versionen in Feature-Modulen haben, wird dies die Anzahl der referenzierten Methoden erhöhen?
Theoretisch sollte es NICHT die Anzahl der referenzierten Methoden erhöhen. ABER , wie ich es erklärt habe, wirkt sich Developer Experience stark auf das Endergebnis aus.
Team Analyzer sollte Leistungsprobleme vor der Veröffentlichung wie prüfen und beheben
- Proguard Regeln
- geschrumpfte und minimierte Ressourcen
- androidManifest.xml
- Gradle-Einstellungen
Jetzt möchte ich klarstellen, wie sich die Entwicklererfahrung und die Codepflege auf das Endergebnis auswirken. AUCH wenn Ihre APK zentralisierte Abhängigkeiten verwendet
Im obigen Beispiel habe ich die Anzahl der 5.1k
referenzierten Methoden erhöht, AUCH WENN ich zentralisierte Abhängigkeiten hatte !!!!!
Wie ist es möglich?
Die Antwort lautet: Ich habe gerade eine nutzlose und versteckte .jar
Datei im libs
Verzeichnis des Projekts hinzugefügt . genauso einfach wie du sehen kannst habe ich das Endergebnis beeinflusst.
Wie Sie sehen können, wirkt sich die Entwicklererfahrung auf das Endergebnis aus. Infolgedessen ist es praktisch möglich, dass die Anzahl der referenzierten Methoden erhöht wird, obwohl dies theoretisch NICHT der Fall sein sollte .
Und warum gibt es keinen Unterschied in der Anzahl der referenzierten Methoden, wenn ich nur das App-Modul kompiliere, indem ich die parallele Kompilierung deaktiviere? Es hätte abnehmen sollen, da nur die Abhängigkeiten des 'App'-Moduls verwendet worden wären, oder?
Die Kompilierung hat keine Beziehung zu den Anzahl der referenzierten Methoden. Sie entspricht den Anforderungen des Entwicklers.
Fazit
Ich habe alle Möglichkeiten rund um das Thema abgedeckt. In der Tat kann es aus verschiedenen Situationen hervorgehen, und ein Entwickler kann das Problem mithilfe dieser Richtlinie beheben.
- Ich würde hoffen, dass Sie herausgefunden haben, warum die referenzierten Methoden erhöht wurden und warum sie in einigen Fällen drastisch erhöht werden könnten.
- Module haben ihre Module Gradle & Dependencies und Modularisierung erhöhen. daher diese Methodenreferenzen.
- Die Modularisierung wirkt sich zwar ignorierbar auf die App-Leistung aus, verbessert jedoch die App-Wartung erheblich.
- Die Erfahrung der Entwickler in der Modularisierung wirkt sich auch stark auf das Endergebnis aus.
WICHTIGER HINWEIS: Fast alle Aussagen sind meine Untersuchungen und Forschungen. In der Tat kann es zu Fehlern und Fehlern kommen, die aktualisiert werden, um in Zukunft viel mehr Informationen hinzuzufügen.