如何生成android_stubs_current_intermediates目录中的.java文件?

Sas*_*and 5 android android-build android-source

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类生成存根.

Sta*_*kER 10

这里的"存根"是通过运行javadoc工具生成的框架API存根.

在大多数情况下,当我们在Android中讨论存根文件时,我们指的是由aidl工具生成的java文件.例如,请参阅如何在android中生成存根?- 堆栈溢出

特别是,Android构建系统包含一个调用的makefile droiddoc.mk,可用于生成文档,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 $@ 
Run Code Online (Sandbox Code Playgroud)

存根没什么关系的吗?别担心,注意有一个PRIVATE_DROIDDOC_OPTIONS变量,和

PRIVATE_DROIDDOC_OPTIONS := $(LOCAL_DROIDDOC_OPTIONS)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

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选项.

看看Doclava实现 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);
    }
  }
Run Code Online (Sandbox Code Playgroud)

它接收-stubs选项.以下是处理stubsDir的方法.

// Stubs
if (stubsDir != null || apiFile != null || proguardFile != null) {
  Stubs.writeStubsAndApi(stubsDir, apiFile, proguardFile, stubPackages);
}
Run Code Online (Sandbox Code Playgroud)

并跟踪执行情况Stubs.writeStubsAndApi,您可以看到存根文件中的内容为何如此.

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

  • 我已经更新了答案,希望这就是你所需要的.@SaswatAnand (2认同)