2017-09-18 1 views
6

Angenommen ich Struktur haben:Proguard, halten alle referenzierten Klassen

import some.other.Clazz; 

public class A { 

    Clazz clazz; 
    B b; 

    public class B { 
     C c; 
     //... 
    } 

    public static class C { 
     //... 
    } 
} 

Gibt es eine nette proguard Trick, der mir zu rekursivkeep alle Klassen erlauben würde, die A von meiner Klasse verwendet werden? Also auch alle Klassen, die intern durch B, C und Clazz referenziert werden?

+0

Können Sie erklären, warum brauchen Sie eine solche 'geschicktes trick'? Was ist dein Anwendungsfall? – larsgrefer

+0

@larsgrefer Sicher, ich erstelle ein Tool, das überprüft, dass die Klasse, die ich in Schritt halten muss, die richtige Proguard-Regel hat. Es wäre für mich einfacher, das Vorhandensein einer einzelnen Regel für eine Klasse "A" zu überprüfen, als manuell alle referenzierten Klassen herauszufinden und die Regelpräsenz für alle zu überprüfen. –

+0

Ist das eine Android-Frage? –

Antwort

2

Ich glaube nicht, dass Sie das nur mit Proguard machen können und ich bezweifle wirklich, dass es eine einfache Lösung (Plugin, die Sie verwenden können) mit MVN \ GRADLE \ sbt \ was auch immer dafür.

Wenn Sie mit dem Ausführen von Code- oder Shellbefehlen während der Erstellung einverstanden sind, kann ich Ihnen einige Bausteine ​​empfehlen, aber da sie zusammengesetzt sind, hängt davon ab, wie Sie Ihr Projekt erstellen zusammen.


Die allgemeine Idee ist:

(1) Verwendung jdeps (Teil und mit jdk verteilt) Abhängigkeiten zu holen (einschließlich transitiv) von kompilierten .class Dateien von Interesse.

In Ihrem Fall der Ausgabe rekursive Abhängigkeiten von some.class (begrenzt auf root_package) soll so etwas wie:

jdeps -v -R -e "root_package.*" some.class 

(2) greifen jdeps Ausgang und verwandelt es in proguard config (Liste der Klassen -keep) .

(3) In Ihrer Hauptprogard-Konfigurationsdatei include Konfigurationsdatei, die Sie in (2) erstellt haben.


Schritt (2) erfordert die meisten Beinarbeit und kann anders angegangen werden.

Mein Vorschlag ist, was auch immer Skript-Fähigkeiten Ihr Build-System jdeps ausführen und Umwandlung ausführen muss.

Maven zum Beispiel hat plugin that allows groovy scripts to be executed während Build.

Wenn Sie sich wohler mit Lauf Shell-Skripte sind, können Sie wie folgt vorgehen:

  1. Rohr jdeps Ausgang in so etwas wie:

    grep -Po classname_regex

    ... nur Klassennamen zu halten Sie möchten beibehalten (Sie können Assertionen der Länge Null verwenden, um classname_regex zu erstellen).

  2. Rohr Ausgang grep in so etwas wie:

    awk '{print "-keep class " $0}

    ... proguard Config zu erhalten und Ausgabe einer Datei speichern.

+1

Es ist nicht perfekt, aber ich könnte in der Lage sein, mit 'Jdeps' zu arbeiten (von denen ich Existenz vorher nicht kannte). Vielen Dank –

Verwandte Themen