Proguard entfernt die überschriebenen Methoden in einer abstrakten Klasse als unbenutzt, obwohl sie in der Elternklasse verwendet werden. Hier ist eine Referenzimplementierung, die das Verhalten zeigt
%Vor%Die Keep-Attribute sind definiert als:
%Vor% Proguard entfernt die überschriebenen Methoden born()
in der Klasse Human als unbenutzt, obwohl sie vom Konstruktor der Klasse Animal verwendet werden. Die resultierende Zuordnungsdatei ist
Dieses Problem besteht nicht, wenn die Klasse Human
nicht abstrakt ist. Wenn die Klasse Human
nicht abstrakt ist, lautet die resultierende Zuordnungsdatei
Wie wir sehen können, bleibt in diesem Fall die Methode born()
erhalten.
Ist das ein Bug in Proguard? Oder gibt es eine Optimierungseinstellung, die das gewünschte Verhalten bereitstellen kann?
Ich benutze Progard mit Android Studio.
Da das Problem nur auftritt, wenn diese Klassen Teil einer Bibliothek sind (und ohne eine konkrete Implementierung in der Bibliothek), habe ich den einfachen Weg genommen und -dontshrink
hinzugefügt, um (mit Verschleierung) alle Klassen und Methoden beizubehalten.
In den meisten Fällen; Klassen- und Methodenschrumpfung muss nicht durchgeführt werden, wenn eine Bibliothek freigegeben wird.
Immer noch glaube ich, dass es ein Fehler im Verwendungsgraphen ist, die überschriebenen Methodenimplementierungen zu ignorieren. Ich habe einen Bug im Proguard Bug Tracker abgelegt. Ссылка
Sie konfigurieren ProGuard, um öffentliche Methoden beizubehalten, während born()
Paket privat ist. Ihre Konfiguration sollte eher so sein.
Es werden alle privaten Paket (Standard) -Methoden der menschlichen Klasse beibehalten.
Wenn Sie Methoden behalten möchten, aber trotzdem Verschleierung zulassen, können Sie etwas wie folgt verwenden:
%Vor%