Android构建过程为android.jar中的每个类生成(?)Java存根,并将它们存储在以下目录中:
./out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/src/
例如,上述目录的子目录java/lang/
包含对应于java.lang。*类的.java文件,子目录`android / app /'包含对应于android.app的.java文件。*类。这些.java文件不包含实际代码,只是包含虚拟实体的签名。
我假设这些.java文件是使用工具从实际源代码生成的。我的问题是,这个工具是什么,它是否可以在Android构建过程之外使用?
我想使用该工具为非Android Java类生成存根。
答案 0 :(得分:9)
这里的“存根”是通过运行javadoc工具生成的框架API存根。
在大多数情况下,当我们在Android中讨论存根文件时,我们指的是由aidl工具生成的java文件。例如,请参阅How to generate stub in android? - Stack Overflow
特别是,Android构建系统包含一个名为droiddoc.mk
的makefile,可用于生成文档,java API存根和API xml文件,实际上调用javadoc。
droiddoc.mk
位于build/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 $@
存根没有任何关系?别担心,请注意有一个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
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
的实现,您可以看到为什么存根文件中的内容是这样的。
您甚至可以编写自己的java文件并生成存根,就像build/tools/droiddoc/test
下的测试用例一样。