2017-06-01 72 views
8

我想要了解Android Studio中構建Android應用程序時幕後發生的情況。我一直在閱讀Gradle,但我無法弄清楚的一件事是如何查看由Gradle調用的相應CLI命令和參數。它似乎是抽象的,並沒有登錄到Gradle ConsoleEvent Log如何查看由Android Studio中的Gradle任務執行的CLI命令?

我最近看到Gradle裏面發生了什麼是AOSP代碼。

2.2.2來源:

https://android.googlesource.com/platform/tools/base/+/gradle_2.2.2/build-system/gradle-core/src/main/java/com/android/build/gradle/tasks

目標

我希望能夠看到搭載Android Studio中的搖籃任務所產生的相應的CLI命令。

使用案例

我要查看深入傳統的Android構建過程。這包括通過以下幾點:

源代碼/庫代碼 - > javac - > Java字節碼(.class) - > proguard - >最小化字節碼(.class) - > dex - > DEX字節碼(.dex)

例如,我想查看由AndroidJavaCompile調用的相應javac命令。 https://android.googlesource.com/platform/tools/base/+/gradle_2.2.2/build-system/gradle-core/src/main/java/com/android/build/gradle/tasks/factory/AndroidJavaCompile.java

我擔心要做到這一點的唯一方法是直接查看源代碼,甚至直接從源代碼構建。

盡職調查

我已經做了相當多的搜索在谷歌,Android的博客,谷歌I/O會談,Android的書籍,以及更多。我一直無法找到一個直接的答案。

回答

4

那就是不可能。簡而言之,因爲大多數Gradle任務都不會調用CLI命令。

每個Gradle構建文件都是一段Groovy代碼,隨同Gradle API(用Java編寫)一起在JVM中執行。因此,您可以直接以任何JVM語言實現任何任務或配置功能,大多數插件都使用該語言,而不是執行命令行工具。儘管如此,通過使用或擴展Exec任務也是可行的。

編譯步驟由AndroidJavaCompile任務處理,該任務通過某些版本檢查和Instant Run功能擴展了常見的JavaCompile Gradle任務。但是,您不知道Gradle如何實際編譯.java文件。在Gradle API的JavaCompile任務的internal source files中,似乎有各種實現(DaemonJavaCompiler,JdkJavaCompiler甚至CommandLineJavaCompiler)。既然你可以指定CompilerOptions與你的任務,Gradle似乎根據這些選項選擇真正的編譯器。請注意,即使存在CommandLineJavaCompiler,也有可能(也很有可能),Gradle傾向於使用javax.tools包及其JavaCompiler實現來編譯源文件,而不是調用命令行工具。

我還查看了示例構建過程中的ProGuard步驟:ProGuard可以用作命令行工具,您可以在其中指定參數以定義其工作方式。但ProGuard還提供了一個Gradle任務(ProGuardTask),該任務在不從命令行調用ProGuard的情況下執行。 ProGuard Java代碼將在Gradle JVM中執行。你可以看到,即使每個Gradle任務可能被一個(或多個)CLI命令取代,Gradle也不會執行這些命令。相反,該功能在Gradle JVM中直接調用。如果你想得到更好的見解,你可以increase the Gradle log level。 Gradle任務的良好實現應該在日誌中提供所有必要的信息。

+0

感謝您花時間回答這個問題!除了增加Gradle日誌級別外,是否有一種相當簡單的方法來調試這些內部gradle任務以查看發生了什麼?我認爲這不是微不足道的。 –

+0

說實話,我從來沒有試過去調試Gradle和/或其插件的內部代碼,因爲我從來沒有遇到這樣複雜的問題。這與任何特定問題有關嗎? –