我正在尝试更好地了解Android Studio在构建Android应用程序时幕后发生的情况。我一直在阅读Gradle,但有一点我无法弄清楚如何查看Gradle调用的相应CLI命令和参数。它似乎是抽象的,没有记录到Gradle Console
或Event Log
。
我最接近看到Gradle内部发生的事情是AOSP代码。
2.2.2来源:
目标
我希望能够看到Android Studio中Gradle任务生成的相应CLI命令。
用例示例
我想深入了解Legacy Android Build Process。这包括通过以下内容:
源代码/图书馆代码 - > javac - > Java字节码(.class) - > proguard - >最小化字节码(.class) - > dex - > DEX字节码(.dex)
例如,我希望看到javac
调用的相应AndroidJavaCompile
命令。 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
我担心这样做的唯一方法是直接查看源代码,甚至直接从源代码构建。
尽职调查
我已经在Google,Android博客,Google I / O会谈,Android书籍等方面进行了大量搜索。我一直无法找到直截了当的答案。
答案 0 :(得分:6)
不可能。简单地说,因为大多数Gradle任务都不会调用CLI命令。
每个Gradle构建文件都是一段Groovy代码,它与Gradle API(用Java编写)一起在JVM中执行。因此,您可以直接在任何JVM语言中实现任何任务或配置功能,大多数插件都使用该语言而不是执行命令行工具。不过,这可以通过使用或扩展Exec
任务来实现。
编译步骤由AndroidJavaCompile
任务处理,该任务通过某些版本检查和JavaCompile
功能扩展了常见Instant Run 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任务的良好实现应该在日志中提供所有必要的信息。