- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在编写一个 Android 库。 lbirary 中的绝大多数接口(interface)都支持 Android API 级别 10 或更高版本。但是,某些功能需要更高的 API 级别。例如,部分库需要用于低功耗蓝牙的 API 18。
为了具体起见,假设库生成了三个类 ClassA
, ClassB
和 ClassC
. ClassA
使用 API 10 中可用的功能,ClassB
使用 API 14 和 ClassC
中可用的功能使用 API 18 中提供的功能。
我希望能够在有人使用我的库中的类时在他们的项目中没有所需的 API 级别时触发 lint 问题(警告/错误)(除非他们使用适当的注释抑制警告),类似于lint 使用的已经内置的 NewApi 问题。
经过搜索,我找到了以下可能的解决方案:
1) 此解决方案与 lint 不一致:将库拆分为三个 .jar 文件,例如 lib_10.jar
其中包括使用 API 10 中可用功能的所有类(示例中的 ClassA),lib_14.jar
其中包括使用 API 14 中可用功能的所有类(示例中的 ClassB)和 lib_18.jar
其中包括使用 API 18 中可用功能的所有类(示例中的 ClassC)。该解决方案允许可移植性,但会使代码库的后期可维护性复杂化,并且可能还需要一些代码重复。
2) 创建我自己的注解(例如,@RequireAndroidApi(API_LEVEL)
指示被注解的类/方法/等所需的最低 API 级别...)并使用 lint-api.jar
( http://tools.android.com/tips/lint-custom-rules
) 创建一个自定义的 lint 规则,检查任何带注释的类/方法/等的使用...使用低于要求的 API。稍后看起来像这样的东西:
@RequireAndroidApi(10)
Class ClassA {
}
@RequireAndroidApi(14)
Class ClassB {
}
@RequireAndroidApi(18)
Class ClassC {
}
问题是我找不到很好的 lint API 文档,这似乎是重新发明 lint 已经支持的功能的轮子(lint 已经检查了“NewApi”问题)。
3)终于编辑成功了<SDK>/platform-tools/api/api-versions.xml
为了表明每个类需要的API级别如下:
<api version="1">
...
<class name="package/path/ClassA" since="10">
<extends name="java/lang/Object" />
<method name="<init>()V" />
</class>
<class name="package/path/ClassB" since="14">
<extends name="java/lang/Object" />
<method name="<init>()V" />
</class>
<class name="package/path/ClassC" since="18">
<extends name="java/lang/Object" />
<method name="<init>()V" />
</class>
</api>
这导致 lint 以与 Android API 相同的方式触发 NewApi 问题。我喜欢这种类型的解决方案,因为它不会重新发明轮子,而且以这种方式抛出的任何错误都会利用在 Eclipse 或 Android Studio 中编程的建议解决方案来处理问题(即 Eclipse 中的“快速修复”)。此解决方案的问题在于它需要编辑 api-versions.xml
随 Android SDK 一起提供,这使得该解决方案对于发布库来说不是很便携,原因包括:a) api-versions.xml
文件不是项目的本地文件,它会更改所有 android 项目的 lint 行为,包括那些不使用该库的项目;和 b) api-versions.xml
每次从 Android SDK 管理器更新 SDK 时都会被覆盖,这将覆盖所做的任何更改。
我想知道是否有更简单的解决方案来实现此“最少的 API 错误/警告”,或者是否有一种方法可以编写类似于 api-versions.xml
的单独文件可以放置在项目目录中,只要在相关项目上运行 lint 时,lint 就可以读取该目录(类似于 lint.xml
)。
感谢您在对问题进行如此长的描述期间耐心等待,感谢您提前提供的任何帮助。
最佳答案
不需要自己创建注解,android支持库的@RequiresApi
注释是你要找的。例如:
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
public void someMethod() {}
如果在可能具有较低 API 级别的上下文中使用 someMethod()
,此注释告诉 lint 发出警告。
请注意,@TargetApi
是不同的:它用于确保 linter 仅使用目标 API 调用带注释的方法,否则它会警告您不要使用该方法.因此 @TargetApi
可用于消除由 @RequiresApi
触发的 lint 警告。
关于Android 库的 Android API 级注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29272925/
注解@CrossOrigin 出于安全原因,浏览器禁止Ajax调用驻留在当前原点之外的资源。例如,当你在一个标签中检查你的银行账户时,你可以在另一个选项卡上拥有EVILL网站。来自EVILL的脚本
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章深入理解Java高级特性——注解由作者收集整理,如果你对这篇文章有兴趣,
概述 在这个快速教程中,我们将探索 Spring 的 @RequestParam 注解。 简单地说,我们可以使用 @RequestParam 从请求中提取查询参数、表单参数甚至文件。我们将讨论如何使用
我有一个关于 Spring @Async 注释的问题。我有一个 Controller 自动连接了一个服务(GnInsuranceDetailsService) @RequestMapping(va
我在使用注释来调用注释所属的方法时遇到了一些麻烦......我将举一个例子: class MyEventHandlers { @handler(id=“1”) public doSom
我是.Net程序员,但是这次我正在从事Java项目,并且遇到了一些困难。这个 java 项目不是我的,它是由其他开发人员开发的,并且使用 Hibernate。 当我运行 Ant 构建器时,我收到此错误
我在 Grails 文档(第 9 章:测试)中读到过这个注解。但是我不明白这是什么... 问题是我需要模拟 GORM 的动态方法,有一种方法可以自动模拟它们,而不必编写我需要的所有方法吗? 最佳答案
这个问题在这里已经有了答案: How to get annotation class name, attribute values using reflection (2 个答案) 关闭 5 年前。
如何了解 Java EE 6 JMS 注释规范支持的所有有效属性集@ActivationConfigProperty Java EE 6 Documentation for @ActivationCo
我认为这是不可能的,但也许我错了。所以我问你,如果可能的话。 ;-) 如果我定义了一个注释,它只接受类引用,它扩展了一些可能的接口(interface)或类: Class serviceIFProv
我正在尝试使用 javax.validation 验证一些 DTO,但似乎注释 @NotEmpty 没有检查参数是否为 null。 这是我的类(class): Person.class public
我是 hibernate 新手,我正在尝试学习它,但在尝试使一对多关系正常工作时遇到了问题。我尝试了几个例子,但似乎没有一个起作用。 有人可以看一下下面的代码并告诉我哪里出了问题吗?我尝试了很多不同的
这个问题已经有答案了: Why doesn't Java offer operator overloading? (17 个回答) 已关闭 9 年前。 每个人都知道 Java 中的简单算术如何用于基元
有人知道如何用 Python 处理这种 XML 注释,这是我第一次看到。 <?link id="752760" resource-uuid="UUID-9f0575a3-1847-1cde-fd
我遇到了这个link这解释了如何继承 bean。假设此示例中的 HelloWorld 类使用 @Component 注释作为 bean 公开,如何创建另一个继承此 bean 的 bean?我可以使用
谁能告诉我这段代码是否: public class OvTester { @Override public int hashCode() { return toStri
我有一个实体,它有一个非键列,我已将其设置为在我的数据库中自动生成。 我不能使用 @GeneratedValue,因为据我所知,它仅适用于关键字段。 在这种情况下,如何指示非键列是自动生成的? 最佳答
所以可能像很多人一样,我通常会临时注释掉代码,主要是为了调试目的。我目前放了类似 **DEBUG** 或任何容易搜索的内容,但我认为让编译器在发现临时注释掉的代码时输出警告(甚至错误)可能很有用。我想
此组件解决的问题是: 「谁」在「什么时间」对「什么」做了「什么事」 本组件目前针对 Spring-boot 做了 Autoconfig,如果是 SpringMVC,也可自己在 xml 初始化 b
配置全局乱码过滤器 参数绑定注解@RequestParam 注解@RequestParam的参数使用说明 获得Restful风格的参数 自定义类型转换器 自定义转换器的开发步骤: 获得Servlet相
我是一名优秀的程序员,十分优秀!