Proguard entfernt überschriebene Methoden in der abstrakten Klasse als unbenutzt

9

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

%Vor%

Dieses Problem besteht nicht, wenn die Klasse Human nicht abstrakt ist. Wenn die Klasse Human nicht abstrakt ist, lautet die resultierende Zuordnungsdatei

%Vor%

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.

    
adwiv 22.05.2015, 15:23
quelle

2 Antworten

1

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. Ссылка

    
adwiv 31.05.2015, 18:31
quelle
2

Sie konfigurieren ProGuard, um öffentliche Methoden beizubehalten, während born() Paket privat ist. Ihre Konfiguration sollte eher so sein.

%Vor%

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%     
sergej shafarenka 24.05.2015 16:09
quelle

Tags und Links