作者:rannman | 来源:互联网 | 2023-02-02 12:47
我正在尝试更好地了解Android Studio在构建Android应用程序时幕后发生的情况.我一直在阅读Gradle,但有一点我无法弄清楚如何查看Gradle调用的相应CLI命令和参数.它似乎是抽象的,没有记录到Gradle Console
或Event Log
.
我最接近看到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中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书籍等方面进行了大量搜索.我一直无法找到直截了当的答案.
1> Lukas Körfer..:
那是不可能的.简单地说,因为大多数Gradle任务都不会调用CLI命令.
每个Gradle构建文件都是一段Groovy代码,它与Gradle API(用Java编写)一起在JVM中执行.因此,您可以直接在任何JVM语言中实现任何任务或配置功能,大多数插件都使用该语言而不是执行命令行工具.然而,这可以通过使用或扩展Exec
任务来实现.
编译步骤由AndroidJavaCompile
任务处理,该JavaCompile
任务通过某些版本检查和即时运行功能扩展了常见的Gradle任务.但是,您不知道Gradle如何实际编译.java
文件.在内部的源文件为JavaCompile
的摇篮API的任务,似乎有不同的实现(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中调用.如果您想获得更好的洞察力,可以增加Gradle日志级别.Gradle任务的良好实现应该在日志中提供所有必要的信息.