2016-04-05 14 views
3

Ich benutze Proguard, um meinen Code zu verkleinern. Meine Strategie besteht darin, es zu aktivieren und dann den Warnungen zu folgen, um alles zu behalten, worüber es sich beschwert. Wenn es externe Bibliotheken gibt, versuche ich den Proguard-Anweisungen zu folgen, die die Autoren zur Verfügung stellen. Viele Anweisungen enthalten eine -dontwarn Flagge. Wenn ich das Flag -dontwarn deaktiviere, erhalte ich Warnungen. Wenn wir die meisten Klassen über -keep Flagge halten, warum Warnungen noch auftauchen? Beispiel:Proguard Warnungen trotz gehaltener Klassen

-keep class javax.** { *; } 

# for butterknife 
-keep class butterknife.** { *; } 
-dontwarn butterknife.internal.** 
-keep class **$$ViewBinder { *; } 

-keepclasseswithmembernames class * { 
    @butterknife.* <fields>; 
} 

-keepclasseswithmembernames class * { 
    @butterknife.* <methods>; 
} 

Warning:butterknife.internal.ButterKnifeProcessor: can't find referenced class javax.annotation.processing.AbstractProcessor 
Warning:butterknife.internal.ButterKnifeProcessor: can't find referenced class javax.annotation.processing.ProcessingEnvironment 
Warning:butterknife.internal.ButterKnifeProcessor: can't find referenced class javax.lang.model.element.TypeElement 
Warning:butterknife.internal.ButterKnifeProcessor: can't find referenced class javax.lang.model.element.Element 
Warning:butterknife.internal.ButterKnifeProcessor: can't find referenced class javax.annotation.processing.Filer 
Warning:butterknife.internal.ButterKnifeProcessor: can't find referenced class javax.tools.JavaFileObject 
... 

Antwort

6

Es gibt viele Warnungen in ProGuard was bedeutet, verschiedene Dinge. Diese besondere one:

Warning:A: can't find referenced class B 

bedeutet, dass während ProGuard Klasse A verarbeitet wurde es Bezug auf Klasse B Klasse B begegnet aber wurde nicht als Quelle (-injars class_path) oder als Bibliothek (-libraryjars class_path) enthalten.

Bitte beachten Sie, dass für diese spezielle Warnung im Falle der Standard Android Build-Kette -keep Regeln nicht helfen. ProGuard behält den referenzierten Code transitiv bei.

Diese Warnung kann aus verschiedenen Gründen auftreten. Oft kann eine Bibliothek X Code enthalten, der eine andere Bibliothek Y verwendet. Und X verwendet Y optional - nur wenn Y im Klassenpfad vorhanden ist, erzwingt X keine Anwesenheit von Y. Auf diese Weise kann ProGuard keine Klassen von Y finden. To Befreien Sie sich von den Warnungen, indem Sie entweder Y als Abhängigkeit hinzufügen oder die entsprechenden Warnungen ignorieren.

Im Falle von ButterKnife ist die Situation etwas anders. Butterknife verwendet Annotationsverarbeitung. Und es enthält sowohl den Bibliotheks- als auch den Annotationsprozessor in einer Abhängigkeit (neueste Version 7.0.1). Daher ist die Klasse butterknife.internal.ButterKnifeProcessor immer noch in den kompilierten Klassen vorhanden (obwohl ihre Arbeit bereits beendet ist - wird während der Java-Kompilierung verwendet). Und ProGuard versucht es zu verarbeiten. ProGuard findet die fehlenden Klassen nicht, weil sie nur während der Annotationsverarbeitung verwendet wurden und nicht für die ProGuard-Verarbeitung vorhanden sind. In diesem Fall ist es wirklich notwendig, die Warnungen zu ignorieren.

+0

Ich sehe. Dann sollte ich "-injars" und "-libraryjars" verwenden, wenn ich externe Bibliotheken kompiliere? – Vas

+0

Wenn Sie Gradle Build für Ihre Android-Projekte verwenden, richtet es alle "-Jars" und "-Libraryjars" für Sie basierend auf den Projektabhängigkeiten ein. Keine Notwendigkeit für eine zusätzliche Einrichtung. – Tomik

+0

Ah macht Sinn. Vielen Dank! – Vas

Verwandte Themen