2017-06-04 1 views
7

TLDR: Wie übergeben Sie Proguard-Mapping zu javac, um gegen verschleierte Bibliothek zu kompilieren?Run Proguard auf Multi-Modul-Projekt als "One Piece"

Die lange, aber ich sehe nicht, wie es kürzer zu machen:

Hintergrund: Ich habe folgenden Produkt-Setup:

Android Studio-Projekt - Bibliothek Modul - (sub) Modulkern - (Unter-) Moduls A - (sub) Modul B - (sub) Modul C - Proben APP-Modul - ... Andere Module

Jedes der Bibliothek Submodule A, B, C Referenzklassen in Core, aber A, B, C unabhängig voneinander. Im Prinzip vergleichbar mit Play Services, bei denen der Benutzer nur Code und das erforderliche Submodul haben kann. Jedes der Bibliothek Submodule hat externe APIs, aber auch viele interne Klassen Ziel ist es, Core, A, B, C als unabhängige aar-s zu verteilen.

Ziel: obfuscate alle Submodule zusammen nur öffentliche APIs ausgesetzt, sondern Paket und verteilen sie separat in verschleierter/optimierte Form zu verlassen.

Ausgabe: Ich sehe nicht, wie man es mit einfacher Gradle-Konfiguration verwendet. Ein benutzerdefiniertes Build-System wird hier benötigt, es sei denn, es gibt eine bekannte Lösung?

Was benötigt wird, ist hier:

  • Java-Kompilieren alle Submodule zusammen
  • Proguard-verschleiern sie zusammen
  • Run den ganzen Rest des Build-Prozesses separat

Wo ist normaler Build-Prozess für jedes Modul ist: - Kompilieren -> alles inkl. Verschleierung -> Paket

Die direkte Einrichtung schlägt bei der Kompilierung des ersten Submoduls nach Core fehl. Wenn es nur möglich wäre, Proguard mapping.txt als Eingabe an den Java-Compiler zu übergeben ... Aber ich konnte eine solche Option nicht finden. Irgendwelche Ideen?

Danke !!!

Antwort

1

Ich hatte das gleiche Problem, und ich habe this post on my personal website geschrieben.

Im Wesentlichen, was Sie suchen, ist das maven-publish Gradle Plugin, mit dem Sie Ihre Bibliothek Module zu AAR packen und bequem verwalten und verteilen können, während die Informationen über ihre Abhängigkeiten beibehalten.

Sie können dieses Plugin so konfigurieren, dass es einen spezifischen buildType enthält, für den Sie die Progress-Verschleierung aktivieren können.

+0

würde für Kind-Module nicht Verschleierung gelten somit für jedes Modul bei der Kompilierung verschleierten alle Klassen zu machen? – Inverce

+3

Wenn Sie möchten, dass Ihre Module verschleiert werden, müssen Sie jedem Modul eine Proguard-Direktive hinzufügen, um alle öffentlichen Klassen zu behalten: -servic public class * {public protected *; } – Venator85

1

Problem: Ich sehe nicht, wie man es mit einfacher Gradle Konfiguration verwendet.Custom Build System wird hier benötigt, es sei denn, es gibt eine bekannte Lösung?

Also, Sie suchen nach einem "Custom Build System", da Sie nicht wissen, wie man es in Großbuchstaben macht. Aber wenn das in Großbuchstaben gelöst werden könnte, würdest du es gerne benutzen, oder?

Um Bibliotheken mit gradle proguarding, haben Sie 2 Möglichkeiten:

  • Run Proguard für jede Bibliothek unabhängig: In jedem Modul minifyEnabled true gesetzt und proguardFiles Funktion benutzen, um Ihre proguard.txt-Datei festlegen .
  • Run Proguard gerade in der App-Modul: In jedem Modul eingestellt minifyEnabled false, und verwenden Sie consumerProguardFiles Funktion der proguard.txt Datei aus jeder Bibliothek an das Hauptmodul zu übergeben.

Hier wird im Detail mit Codebeispielen erläutert, so werde ich die Antwort nicht replizieren: https://stackoverflow.com/a/42758629/1516973