Wie kann ich den CLI-Befehl anzeigen, der von einer Gradle-Aufgabe in Android Studio ausgeführt wird?

8

Ich versuche mir ein besseres Bild davon zu machen, was hinter den Kulissen in Android Studio passiert, wenn ich eine Android-Anwendung erstelle. Ich habe Gradle gelesen, aber eine Sache, die ich nicht herausfinden kann, ist, wie man den jeweiligen CLI-Befehl und die Argumente sieht, die von Gradle aufgerufen werden. Es scheint abstrahiert und nicht in Gradle Console oder Event Log geloggt zu sein.

Der AOSP-Code ist mir am nächsten, wenn ich sehe, was in Gradle vor sich geht.

2.2.2 Quelle:

Ссылка

Ziele

Ich möchte den jeweiligen CLI-Befehl sehen können, der von den Gradle-Aufgaben in Android Studio generiert wird.

Anwendungsbeispiel

Ich möchte den Legacy Android-Build-Prozess ausführlich ansehen. Dazu gehört auch Folgendes:

Quellcode / Bibliothekscode - & gt; javac - & gt; Java-Bytecode (.class) - & gt; Proguard - & gt; minimierter Bytecode (.class) - & gt; dex - & gt; DEX-Bytecode (.dex)

Zum Beispiel würde ich den entsprechenden javac -Befehl sehen wollen, der von AndroidJavaCompile aufgerufen wird. Ссылка

Ich befürchte, dass der einzige Weg, dies zu tun, darin besteht, direkt durch den Quellcode zu schauen oder sogar direkt aus der Quelle zu bauen.

Due Diligence

Ich habe ziemlich viel auf Google, Android-Blogs, Google I / O-Talks, Android-Büchern und vielem mehr gesucht. Ich konnte keine direkte Antwort finden.

    
Jon Douglas 01.06.2017, 18:10
quelle

1 Antwort

4

Das ist nicht möglich . Einfach, weil die meisten Gradle-Tasks CLI-Befehle nicht aufrufen.

Jede Gradle-Build-Datei ist ein Stück Groovy-Code, der in einer JVM zusammen mit der Gradle-API (in Java geschrieben) ausgeführt wird. Daher können Sie beliebige Task- oder Konfigurationsfunktionen direkt in jeder JVM-Sprache implementieren, von der die meisten Plugins Gebrauch machen, anstatt Befehlszeilen-Tools auszuführen. Dies ist jedoch möglich, indem Sie die Aufgabe Exec verwenden oder erweitern .

Der Kompilierungsschritt wird von einem AndroidJavaCompile Aufgabe, die den allgemeinen JavaCompile Klassifizierungsaufgabe durch einige Versionsüberprüfungen und die Sofortige Ausführung Funktion. Sie wissen jedoch nicht, wie Gradle die .java -Dateien tatsächlich kompiliert. In der internen Quelle Dateien für die Aufgabe JavaCompile der Gradle-API, scheint es verschiedene Implementierungen zu geben ( DaemonJavaCompiler , JdkJavaCompiler und sogar CommandLineJavaCompiler ). Da Sie mit Ihrer Aufgabe CompilerOptions angeben können, scheint Gradle basierend auf diesen Optionen den echten Compiler auszuwählen. Bitte beachten Sie, dass es auch bei einem CommandLineJavaCompiler möglich ist (und sehr wahrscheinlich), dass Gradle es vorzieht, das javax.tools Paket und seine JavaCompiler -Implementierung, um die Quelldateien zu kompilieren, anstatt ein Befehlszeilentool aufzurufen.

Ich habe auch den ProGuard-Schritt in Ihrem Beispiel-Build-Prozess angeschaut: ProGuard kann als Befehlszeilen-Tool verwendet werden, wo Sie Argumente angeben können, um zu definieren, wie es funktioniert. Aber ProGuard bietet auch eine Aufgabe für den Gradle ( ProGuardTask ) wird ausgeführt, ohne dass ProGuard über die Befehlszeile aufgerufen wird. Der ProGuard Java Code wird in der Gradle JVM ausgeführt.

Wie Sie sehen können, führt Gradle diese Befehle nicht aus, selbst wenn jeder Gradle-Task durch einen (oder mehrere) CLI-Befehl (e) ersetzt wird. Stattdessen wird die Funktionalität direkt in der Gradle-JVM aufgerufen. Wenn Sie einen besseren Einblick erhalten möchten, können Sie die Gradle-Protokollstufe erhöhen . Gute Implementierungen von Gradle-Tasks sollten alle erforderlichen Informationen in Protokollen enthalten.

    
lu.koerfer 22.07.2017, 10:43
quelle