我正在编写一个Android库。大部分接口都支持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文件,例如包含使用API 10可用功能的所有类(示例中的ClassA)的lib_10.jar
,包含使用API 14可用功能的所有类(示例中的ClassB)的lib_14.jar
,以及包含使用API 18可用功能的所有类(示例中的ClassC)的lib_18.jar
。这个解决方案允许移植性,但会使代码库的后期维护变得复杂,并且可能需要一些代码复制。
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中的“快速修复”)。这种解决方案的问题在于,它需要编辑随Android SDK一起提供的api-versions.xml
文件,这使得将该库发布给多个用户时不太容易实现,原因包括:a) api-versions.xml
文件不是项目本地文件,而且更改它会影响所有Android项目的lint行为,包括那些不使用该库的项目;b)每次从Android SDK管理器更新SDK时,api-versions.xml
都会被覆盖,这将覆盖所有已做出的更改。
我想知道是否有更简单的解决方案来实现“最小API错误/警告”,或者是否有一种类似于lint.xml
的单独文件可以放置在项目目录中,每当针对该项目运行lint时,它就会被读取(类似于lint.xml
)。
感谢您在解释问题时耐心阅读,预先感谢任何帮助。