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

2023-11-21

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


这里的“stubs”是通过运行javadoc工具生成的框架API存根。

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

特别是,Android 构建系统包含一个名为droiddoc.mk可用于生成文档、java API 存根和 API xml 文件,这实际上调用了 javadoc。
droiddoc.mk在下面build/core. In 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)

The 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 option.

看看下面的 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);
    }
  }

它接收 -stubs 选项。以下是它处理 StubsDir 的方式。

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

并追踪执行情况Stubs.writeStubsAndApi,您可以看到为什么存根文件中的内容是这样的。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android_stubs_current_intermediates目录中的.java文件是如何生成的? 的相关文章

随机推荐

  • 我们如何将 Blockly 导入到 Angular 7 应用程序中?

    我尝试在 Angular 7 应用程序中使用 Blockly 但无法注入 Blockly 编辑器 我已经从以下位置下载了文件https developers google com blockly guides get started web
  • 尝试向 Python 类动态添加方法时遇到问题(即 django-tables2 'Table')

    因此 对于 Django 项目 我真的希望能够生成并显示表格 not基于查询集 动态地进行 无需事先了解内容或模式 它看起来像django tables2app 提供了很好的渲染表的功能 但它要求您通过在自定义定义的 Table 子类上声明
  • url 中带 www 和不带 www 的 Access-Control-Allow-Origin 问题

    我做了一个小的gwt应用程序并发布了它 但是今天我发现了一个严重的问题 我意识到同源策略问题 因此我将 gwt 应用程序和其余 json 应用程序放在同一服务器上 但显然浏览器不考虑http www xyz com and http xyz
  • 如何在Python中使用scipy.optimize中的leastsq函数来拟合数据集x和y的直线和二次线

    我如何使用 scipy optimize 中的 lesssq 函数将直线和二次拟合到下面的数据集 我知道如何使用 polyfit 来做到这一点 但我需要使用 lesssq 函数 以下是 x 和 y 数据集 x 1 0 2 5 3 5 4 0
  • 刷新 QueryTable 抛出“常规 ODBC 错误” - VBA Excel 2011 for Mac

    编辑 发现新错误 我可能刚刚发现为什么我的脚本不再起作用了 最近有一个 Office 更新 似乎他们已经实现了 microsoft 查询 它摆脱了我根据需要安装和配置的 ODBC 管理器 现在实际的问题可能是这个微软查询没有 UNICODE
  • 在R中计算加权多边形质心

    我需要根据单独的人口网格数据集计算一组空间区域的质心 感谢您在下面的示例中指导如何实现这一目标 提前致谢 require raster require spdep require maptools dat lt raster volcano
  • 如何使用 fstream 在 C++ 中追加文件? [复制]

    这个问题在这里已经有答案了 我尝试用 C 附加文件 启动时文件不存在 操作后 文件中只有一行而不是五行 此方法调用了 5 次 看起来文件正在创建 接下来每个写操作文件都被清除并添加新字符串 void storeUIDL char uidl
  • 如何使用 Enter 键作为事件处理程序 (javascript)? [复制]

    这个问题在这里已经有答案了 我试图进行自己的聊天 所以我有一个输入文本字段 提交按钮 甚至不是提交 它只是一个按钮 所以当按下回车键时 我需要的值输入字段出现在我的文本区域 只读 好吧 长话短说 我只想要一个基本的输入键事件处理程序 我知道
  • 来自另一张纸的条件格式

    我试图让工作表 A 上的一个单元格检查它是否 gt 或 A1 gt SheetB A1 但似乎不起作用 我使用绿色表示 gt 使用红色表示 是不是函数错了 或者是否不可能有条件格式甚至跨工作表搜索 由于某种原因 我承认我真的不知道为什么 条
  • 当 Ctrl+Cing 从无限循环中设置 -fbreak-on-exception 时,GHCi 挂起

    正如标题所示 我在 GHCi 中创建了一个无限循环 f x x 2 g x if f x lt x then g f x 2 else x g 2 通常按 Ctrl C 会产生 中断 并返回 GHCi 提示符 如果我 set fbreak
  • 访客模式,访客选择如何遍历

    据我了解 在Visitor模式的典型规范中 是被访问的对象决定如何遍历 而且一般只支持一种遍历顺序 参见 例如 here or here 是否有一个与双重调度相同的用途的名称 但访问者可以决定如何遍历对象层次结构 在我的应用程序中 一个非常
  • Swift 替换字符串中的第一个字符

    一个非常简单的问题 如何替换字符串的第一个字符 我可能做错了一些事情 但我就是无法让它发挥作用 我已经尝试过这个 var query url query stringByReplacingOccurrencesOfString withSt
  • Windeployqt 错过了一些库并获取了其他不需要的库

    通常要部署 Qt 项目 我要么 继续运行它并找到它抱怨丢失的库并添加它们 直到不再有为止 使用 dependency walker 完成大部分 如果不是全部 然后返回到选项 1 或者只是创建一个静态链接版本 有时会很痛苦 所以我现在想尝试w
  • 将 Python 数据结构输出到 reStructuredText 有哪些方法

    我有一个 Python 元组列表 我想将其输出到 reStructuredText 中的表中 docutils 库对将 reStructuredText 转换为其他格式有很大的支持 但我想直接从内存中的数据结构写入 reStructured
  • 为多项目中的子项目指定不同版本的 sbt?

    我有一个包含几个子项目的多项目 根项目的project build properties包含 sbt version 0 13 0 事实证明 其中一个子项目仅适用于该版本0 12 4由于依赖性问题 I put build propertie
  • “多可用区部署”和“只读副本多可用区部署”之间的区别

    Summary Amazon RDS 有两种主要不同类型的副本 多可用区副本和只读副本 很容易发现它们的区别 不过 只读副本已于 2018 年 1 月支持多可用区部署 多可用区部署 和 只读副本版本多可用区部署 之间的主要区别是什么 在当前
  • python 中的二维列表数组

    我正在尝试创建一个二维矩阵 以便每个单元格都包含一个字符串列表 矩阵尺寸在创建之前是已知的 我需要从一开始就访问任何元素 而不是动态填充矩阵 我认为需要某种预先分配空间 例如 我想要一个 2X2 矩阵 A B C d e f f 支持传统的
  • 访问 Thread.Start() 委托函数的返回值

    我有一个通过 Thread Start 执行方法的程序 该方法有一个我想访问的返回值 有没有办法做到这一点 这是一个样本 var someValue Thread t new Thread delegate someValue someOb
  • RestTemplate 设置每个请求的超时时间

    我有一个 Service有多种方法 每种方法使用不同的 Web api 每个调用都应该有一个自定义的读取超时 拥有一个 RestTemplate 实例并通过每个方法中的工厂更改超时是否是线程安全的 HttpComponentsClientH
  • android_stubs_current_intermediates目录中的.java文件是如何生成的?

    Android 构建过程为 android jar 中的每个类生成 Java 存根 并将它们存储在以下目录中 out target common obj JAVA LIBRARIES android stubs current interm