mad*_*are 13 android android-sdk-tools android-lint
我正在写一个Android库.lbirary中的绝大多数界面都支持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 {
}
Run Code Online (Sandbox Code Playgroud)
问题是我找不到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>
Run Code Online (Sandbox Code Playgroud)
这导致lint以与Android API相同的方式触发NewApi问题.我喜欢这种类型的解决方案,因为它不会重新发明轮子,因此以这种方式抛出的任何错误都会利用Eclipse或Android Studio中编写的建议解决方案来处理问题(即Eclipse中的"快速修复").这个解决方案的问题在于它需要api-versions.xml随Android SDK一起提供的编辑,这使得该解决方案在释放库时不会非常便携,原因如下:a)api-versions.xml文件不是项目的本地文件,并且改变了lint的行为所有android项目,包括那些不使用库的项目; 和b)api-versions.xml将被覆盖每次SDK从Android SDK的管理器,它会覆盖所做的任何更改更新时间.
我想知道是否有更简单的解决方案来实现这个"最小API错误/警告",或者是否有办法编写一个类似于api-versions.xml可以放在项目目录中的单独文件,只要lint运行,lint就可以读取该文件关于有问题的项目(类似于lint.xml).
感谢您在这个问题的长期描述中与我联系,我提前感谢您的帮助.
yuv*_*val 13
无需创建自己的注释,Android支持库的@RequiresApi注释就是您要寻找的.例如:
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
public void someMethod() {}
Run Code Online (Sandbox Code Playgroud)
此注释告诉lint警告是否someMethod()在可能具有较低API级别的上下文中使用.
请注意,这@TargetApi是不同的:它用于确保linter仅使用目标API调用带注释的方法,否则会警告您不要使用该方法.因此@TargetApi可以用来沉默由引发的lint警告@RequiresApi.
| 归档时间: |
|
| 查看次数: |
8393 次 |
| 最近记录: |