gpt4 book ai didi

android - android_stubs_current_intermediates 目录下的.java 文件是如何生成的?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:16:09 25 4
gpt4 key购买 nike

Android 构建过程为 android.jar 中的每个类生成(?)Java stub ,并将它们存储在以下目录中:

./out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/src/

例如,上述目录的子目录java/lang/中包含java.lang.*类对应的.java文件,子目录`android/app/中包含对应的.java文件到 android.app.* 类。这些 .java 文件不包含实际代码,而只是带有虚拟主体的签名。

我假设这些 .java 文件是使用工具从实际源代码生成的。我的问题是,这个工具是什么,它可以在 Android 构建过程之外使用吗?

我想使用该工具为非 Android Java 类生成 stub 。

最佳答案

这里的“stubs”是运行javadoc工具生成的框架API stub 。

In most cases, when we talk about stub file in Android, we mean the java file generated by aidl tool. For example see How to generate stub in android? - Stack Overflow

特别是,Android 构建系统包含一个名为 droiddoc.mk 的 makefile,可用于生成文档、java API stub 和 API xml 文件,这些文件实际上调用了 javadoc。
droiddoc.mkbuild/core 下。在 build/core/config.mk 中有一个名为 BUILD_DROIDDOC 的变量,可以更轻松地包含 droiddoc.mk

查看droiddoc.mk,它调用了javadoc:

javadoc \
\@$(PRIVATE_SRC_LIST_FILE) \
-J-Xmx1280m \
$(PRIVATE_PROFILING_OPTIONS) \
-quiet \
-doclet com.google.doclava.Doclava \
-docletpath $(PRIVATE_DOCLETPATH) \
-templatedir $(PRIVATE_CUSTOM_TEMPLATE_DIR) \
$(PRIVATE_DROIDDOC_HTML_DIR) \
$(addprefix -bootclasspath ,$(PRIVATE_BOOTCLASSPATH)) \
$(addprefix -classpath ,$(PRIVATE_CLASSPATH)) \
-sourcepath $(PRIVATE_SOURCE_PATH)$(addprefix :,$(PRIVATE_CLASSPATH)) \
-d $(PRIVATE_OUT_DIR) \
$(PRIVATE_CURRENT_BUILD) $(PRIVATE_CURRENT_TIME) \
$(PRIVATE_DROIDDOC_OPTIONS) \
&& touch -f $@

stub 什么都没有吧?别担心,注意有一个 PRIVATE_DROIDDOC_OPTIONS 变量,和

PRIVATE_DROIDDOC_OPTIONS := $(LOCAL_DROIDDOC_OPTIONS)

AOSP 中的许多Android.mk 文件,例如framework/base/Android.mk,都包含include $(BUILD_DROIDDOC) 来生成文档。在framework/base/Android.mk中,有一段代码:

LOCAL_DROIDDOC_OPTIONS:=\
$(framework_docs_LOCAL_DROIDDOC_OPTIONS) \
-stubs $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android_stubs_current_intermediates/src \
-api $(INTERNAL_PLATFORM_API_FILE) \
-nodocs

LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk

LOCAL_UNINSTALLABLE_MODULE := true

include $(BUILD_DROIDDOC)

LOCAL_DROIDDOC_OPTIONS 包含一个 -stubs 选项。最终会放入droiddoc.mk使用的javadoc命令中。

但是,我们可能会注意到 javadoc 不包含任何选项,如 -stubs。关键是您可以使用 doclet 自定义 Javadoc 工具输出的内容和格式。 Javadoc 工具有一个默认的“内置”doclet,称为标准 doclet,它生成 HTML 格式的 API 文档。您可以修改或子类化标准 doclet,或编写您自己的 doclet 以生成 HTML、XML、MIF、RTF 或任何您喜欢的输出格式。

我们可以使用 -doclet 选项来指定我们自定义的 doclet。 droiddoc.mk 中的 javadoc 命令使用 -doclet com.google.doclava.Doclava。该 doclet 接收 -stubs 选项。

查看external/doclava/src/com/google/doclava/Doclava.java下的Doclava实现

  else if (a[0].equals("-stubs")) {
stubsDir = a[1];
} else if (a[0].equals("-stubpackages")) {
stubPackages = new HashSet<String>();
for (String pkg : a[1].split(":")) {
stubPackages.add(pkg);
}
}

它接收 -stubs 选项。这是它处理 stubsDir 的方式。

// Stubs
if (stubsDir != null || apiFile != null || proguardFile != null) {
Stubs.writeStubsAndApi(stubsDir, apiFile, proguardFile, stubPackages);
}

然后跟踪Stubs.writeStubsAndApi的实现,就可以看出为什么 stub 文件中的内容是这样的。

您甚至可以编写自己的 java 文件并生成 stub ,就像 build/tools/droiddoc/test 下的测试用例一样。

关于android - android_stubs_current_intermediates 目录下的.java 文件是如何生成的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16074794/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com