【问题标题】:Android Support Annotations @StringDef not working when exported in a .aar file在 .aar 文件中导出时,Android 支持注释 @StringDef 不起作用
【发布时间】:2016-06-04 15:23:53
【问题描述】:

@StringDef 支持注释有问题。当它们所在的库是项目的一部分(不是 .aar 文件)时,它们工作得非常好,但是当我将库编译为 .aar 文件并尝试在另一个项目中使用它们时,注释不会被强制执行。

http://tools.android.com/tech-docs/support-annotations

在“在您自己的库中使用注释”部分下它说

如果您使用这些注释对自己的库进行注释,并使用 Gradle 构建 AAR 工件,则 Android Gradle 插件将在构建时提取注释信息并将其发送到您的 AAR 文件中以供您的库的客户端使用。您可以查看记录信息的 AAR 内的 annotations.zip 文件;这是使用 IntelliJ 的外部注释 XML 格式。这是必要的,因为 .class 文件不能包含足够的注释信息来处理上面的 @IntDef 信息;请注意,我们需要记录对常量本身的引用,而不是它的值。当(且仅当)您的项目依赖于注解支持库时,Android Gradle 插件会将提取注解任务作为构建的一部分运行。 (请注意,只有源保留注释放在 .aar 文件中;类级别保留保留在 classes.jar 中。)

我打开 .aar 文件,里面有 annotations.zip 文件,如果我提取它,就会有一个包含所有正确注释的 XML 文件。

我正在使用@Retention(RetentionPolicy.SOURCE),因为它说我需要

我试图将它们用作 .aar 文件的应用确实依赖于支持库 compile 'com.android.support:support-annotations:23.1.1

让这些工作我缺少什么?

编辑:我仔细检查了使用这些作为 .aar 文件的项目是否也打开了注释处理器。

【问题讨论】:

  • “未强制执行注释”是什么意思?
  • 当我使用一个带有注释的方法,并且我不使用注释值时,它应该将其标记为红色并阻止我编译。例如。 “你好”与 SomeClass.HELLO_CONSTANT。它在库直接编译到项目中时有效,但在用作 .aar 文件时无效
  • 使用错误值时应该是什么样子的示例图像 - 0d9321c1-a-db1c6dfe-s-sites.googlegroups.com/a/android.com/…

标签: android annotations android-support-library android-library


【解决方案1】:

问题是接口是私有的。

由于某种原因,当一个库项目被它的宿主项目编译为子模块时,私有接口可以正常工作。

当库项目用作 .aar 文件时,私有接口不再起作用。

【讨论】:

  • 我遇到了同样的问题...您是否在独立的 java 文件中定义了您的 public @interface YourTypeDef {}?还是您创建了一个类来封装您的注解 typedef 实现?
【解决方案2】:

here 所述,用作@StringDef/@IntDef 值的常量的信息在编译成aar 文件后将丢失。剩下的只是常量的值。

@IntDef 注释不能是类保留,因为它们需要记录的东西(哪些常量是有效的)不能在 .class 文件中表达——唯一存储在那里的注释数据是常量的,而不是某种指向常量本身的指针。

【讨论】:

  • 好的,但这就是.aar 包含一个名为annotations.zip 的文件的原因。里面有一个.xml 文件,它对所有类型定义的信息进行编码。
猜你喜欢
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 1970-01-01
  • 2018-10-20
  • 2021-09-23
  • 1970-01-01
  • 2022-06-15
相关资源
最近更新 更多