Articles of android lint

解析自定义lint规则中的资源值

我有一个很大的Android代码库,我正在编写一个自定义lint规则,用于检查某些属性的值是否在给定范围内。 例如,我有这个组件: 我想写一个lint规则,提醒开发人员my:animation_factor应该谨慎使用my:animation_factor > = 1的值。 我按照http://tools.android.com/tips/lint-custom-rules上的说明操作,并设法使用以下代码检索my:animation_factor的值: import com.android.tools.lint.detector.api.*; public class XmlInterpolatorFactorTooHighDetector { …. @Override public Collection getApplicableElements() { return ImmutableList.of(“MyCustomComponent”); } @Override public void visitElement(XmlContext context, Element element) { String factor = element.getAttribute(“my:animation_factor”); … if (value.startsWith(“@dimen/”)) { // How do I resolve @dimen/xyz to 1.85? } else { String value = Float.parseFloat(factor); } } […]

内联注释会产生语法错误

我很喜欢ADT rev 17的新Lint API检查,但是新的API Correctness Check让我很难过。 我有以下代码行: listView.setOverScrollMode(OVER_SCROLL_NEVER); Lint报道了这一行: 呼叫需要API级别9(当前最小值为4) 根据文档 ,我应该能够在行上方添加注释,如下所示: @TargetApi(9) listView.setOverScrollMode(OVER_SCROLL_NEVER); 但是,这会在Java 1.6中出现语法错误: 令牌上的语法错误,错放的构造(s)

如何使用Lint Option StopShip使Grade发布版本失败?

我已经阅读了很多关于StopShip Android Lint Check和Gradle支持的内容 http://tools.android.com/tips/lint-checks http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Lint-support http://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.LintOptions.html#com.android.build.gradle.internal.dsl.LintOptions:checkReleaseBuilds Android lint启用gradle检查 lint任务上的gradle构建失败 http://developer.android.com/tools/help/lint.html http://developer.android.com/tools/debugging/improving-w-lint.html 我想使用SO中的一些已经提到的,而不是TODO或FIXME注释,使用它来确保用于开发/调试/测试的代码块不能达到生产。 为此,我想做两件事: – 启用StopShip检查,因为它默认是禁用 – 将严重性从警告(默认)更改为错误 (假设我们在gradle配置上使用abortOnError true )。 我没能做到这一点! 无论我尝试什么,如果我在我的代码中添加// STOPSHIP注释,android构建都不会失败。 这很奇怪,因为在textEditor中它突出显示为错误,如果我运行Lint检查(Analyze> Inspect Code …),它将被列为问题之一。 这是我在build.gradle尝试过的build.gradle lintOptions { checkReleaseBuilds true // Or, if you prefer, you can continue to check for errors in release builds, // but continue the build even when […]

Android库的Android API级别注释

我正在写一个Android库。 lbirary中的绝大多数界面都支持Android API级别10或更高级别。 但是,某些function需要更高的API级别。 例如,库的一部分需要API 18用于低功耗蓝牙。 为了具体起见,我们假设该库生成三个类ClassA , ClassB和ClassC 。 ClassA使用API​​ 10中提供的function, ClassB使用API​​ 14中提供的function, ClassC使用API​​ 18中提供的function。 我希望能够在有人使用我的库中的类而没有项目中所需的API级别时触发lint问题(警告/错误)(除非他们使用适当的注释来抑制警告),类似于已经构建的 – 在lint使用的NewApi问题中。 搜索后,我find了以下可能的解决方案: 1)此解决方案不符合lint:将库拆分为三个.jar文件,例如lib_10.jar ,其中包含使用API​​ 10中可用function的所有类(示例中为ClassA), lib_14.jar包含所有使用API​​ 14(示例中为ClassB)和lib_18.jar中可用function的类,其中包括使用API​​ 18中可用function的所有类(示例中为ClassC)。 此解决方案允许可移植性,但会使代码库的后续可维护性变得复杂,并且可能还需要一些代码重复。 2)创建我自己的注释(例如, @RequireAndroidApi(API_LEVEL)指示带注释的类/方法/等所需的最低API级别…)并使用lint-api.jar ( http://tools.android.com/tips/lint-custom-rules )创建一个自定义lint规则,用于检查任何带注释的类/方法/等的使用情况…… API低于要求的API。 以后看起来像这样的东西: @RequireAndroidApi(10) Class ClassA { } @RequireAndroidApi(14) Class ClassB { } @RequireAndroidApi(18) Class ClassC { } 问题是我找不到lint API的好文档,似乎这是重新发明lint已经支持的function的轮子(lint已经检查了“NewApi”问题)。 3)最后,我成功编辑了/platform-tools/api/api-versions.xml ,以便指出每个类所需的API级别,如下所示: … ()V” […]

在Android Studio上,检查“未使用的资源”不适用于我项目中的所有模块

我以这种方式运行它“菜单 – >分析 – >按名称运行检查 – >未使用的资源”,我选择整个项目,但它没有在我的主应用程序模块之外find任何未使用的资源。 所以我然后为单个模块运行它,它find了东西,但它也find了在其他模块上使用的项目。 例如,我有一个共享模块,其中包含一些常见字符串,如对话框的“关闭”。 该模块中未使用该字符串。 当我为该模块运行检查时,它发现它未使用。 另一方面,我在同一个共享模块上有一些字符串,我不再在任何地方使用它,当我运行整个项目的检查时,它将找不到该字符串。 我认为问题可能是我共享模块的方式,基本上它们在不同的目录上我导入它们将它放在settings.gradle上: include ‘:androidutils’ project(‘:androidutils’).projectDir = new File( ‘../sharedlibs/androidutils’) 然后在我的build.gradle中我只导入:androidutils作为依赖项。 其他人有这个问题吗? 谢谢。

Lint抱怨没有翻译gcm_defaultSenderId字符串

我已按照教程https://developers.google.com/cloud-messaging/android/client进行操作 。 它有效 – 我能够发送和接收通知。 但是当我尝试构建发布应用程序时,Android Lint抱怨: Error: “gcm_defaultSenderId” is not translated in … 因此,当Lint在build.gradle抱怨时,我可以禁用构建失败: lintOptions{ abortOnError false } 但显然这不是解决方案。 在我的应用程序中硬编码senderId也不是一个好主意(我们在google-services.json无论如何都有有效的gcm_defaultSenderId ,所以加倍它就是要求将来出现问题)。 Google Play服务开发人员有这种明显的疏忽吗? 编辑2015年12月2日OMG! 今天google actuallt开始在这个问题上做点什么, 请看这里 。 免责声明:这不是因为GCM SenderId Android而无法生成APK发布的副本 – 接受的答案对我来说是不可接受的。

Kotlin和android lint检查

我真的很喜欢最近在Kotlin编写Android应用程序 – 但我真的很想念lint。 任何人都知道如何取消(至少部分)。 有没有一个项目可以将android java lint规则改编为kotlin? AFAIK lint仅在字节码上运行,因此需要进行一些手动转换。 我目前的主要痛点是,当我使用函数<MINSDK级别时,我需要编译时错误。有人能指出我正确的方向吗?

活动未在清单Lint警告中注册

我有一个基本活动,我从中inheritance了其他几个活动。 我在清单中注册的其他活动,以便我可以在我的应用程序中使用它们。 但是,Android检查说,对于我的基本活动, “Activity not registered in the manifest” 。 我认为没有理由注册基本活动,因为我从未直接使用它。 但是,也许,我错过了一些东西,警告不应该被忽略? 为什么这个警告呢?

使自定义主题使用null背景(Android lint建议)

我正在阅读有关新的Android Lint规则,并且我发现要防止透支我应该使我的背景布局使用具有空背景的主题,以防止如果我只是要覆盖它来绘制背景。 问题是,如何定义具有空背景的自定义主题? 失败尝试1(不编译): null 失败尝试2(警告仍然存在): #00000000

如何修复不受保护的SMS BroadcastReceiver lint警告

我的应用程序需要能够接收短信。 一切正常,但我得到这个lint警告: 声明SMS_DELIVER或SMS_RECEIVED的intent-filter的BroadcastReceivers必须确保调用者具有BROADCAST_SMS权限,否则恶意actor可能会欺骗意图。 如何“确保调用者具有BROADCAST_SMS权限”? 在我的清单中,我有: 我的代码: public class SmsReceiver extends BroadcastReceiver { public SmsReceiver() {} @Override public void onReceive(final Context context, final Intent intent) { final Bundle bundle = intent.getExtras(); if (bundle != null) { final Object[] pdusObj = (Object[]) bundle.get(“pdus”); for (int i = 0; i < pdusObj.length; i++) { final SmsMessage currentMessage = […]