Articles of lint

运行GTM诊断错误

当我尝试在Eclipse中清理我的android项目时,我总是收到此错误: An internal error occurred during: “Running GTM diagnose”. com.android.tools.lint.detector.api.XmlContext: method (Lcom/android/tools/lint/client/api/LintDriver;Lcom/android/tools/lint/detector/api/Project;Lcom/android/tools/lint/detector/api/Project;Ljava/io/File;Lcom/android/resources/ResourceFolderType;)V not found 任何帮助将非常感激。

./gradlew lint说“没有问题”,但分析 – >检查代码发现问题

我在Android Studio中遇到了一个奇怪的问题:手动启动linter via Analyze -> Inspect Code -> “Whole project” find一些问题,但是如果我这样做的话 ./gradlew lint 它说,在控制台中 Ran lint on variant release:find0个问题 Ran lint on variant debug:find0个问题 我的gradle文件中没有lintOptins ,但使用lint.xml ,这里是: 我的问题:如何使控制台显示与android studio中的检查相同的错误?

如何确保Android中未调用不受支持的(更高级别)API?

我正在为我的AndroidManifest.xml中的Gingerbread构建一个应用程序,并且minSdkVersion=10和targetSdkVersion=17 。 我知道在调用之前我应该​​检查API是否受支持,例如: private void removeRule(RelativeLayout.LayoutParams params, int rule) { if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { // API 17 params.removeRule(rule); } else { params.addRule(rule, 0); } } 但有时我会忘记/或者不知道我正在调用更高级别的API,偶尔会因为NoSuchMethodErrorexception而崩溃我的程序。 所以在我发布我的应用程序之前,我总是将我的项目设置为使用Android SDK 2.3.3,并确保我没有进行非法的方法调用(例如,我得到的所有错误都包含在检查android SDK版本的if语句中),然后将SDK设置回4.2.2。 有没有更好的方法可以确保在不切换SDK的情况下不调用不支持的API? (PS我正在使用IntelliJ)

同一个xml中的Selector,Layer-list和shape / bitmap

我在drawable文件夹中的xml中有这个代码: 我使用它来获得具有2种状态的图像(用作按钮)。 一切都在模拟器和设备上按预期工作。 我知道我可以创建不同的可绘制xml并进行引用以实现相同的结果。 我刚刚切换到Android Studio,它向我显示了这个消息: Element XXX is not allowed here 。 它警告我有关Layer-list及其中的所有标签。 但是,正如我所说,这段代码运行得很好。 我应该将代码切换为单独的XML(知道我只会使用它们一次),还是Android Studio的Inspector Code中的“错误”? 注意:我认为我的代码可以优化,但我还没弄清楚如何。

由于GCM SenderId Android无法生成APK发布

我在我的应用中实施了GCM(Google Cloud Messaging)。 Google Play服务库具有自动生成的values.xml ,其senderId为: 123 问题是我有其他语言环境,App Release期间的Lint给我一个错误: Error:(3) Error: “gcm_defaultSenderId” is not translated in “fr” (French) [MissingTranslation] 因为它是自动生成的,所以我无法设置translable = false 。 我该如何解决这个问题?

防止代码意外进入生产

我正在寻找一种简单的方法来确保将我的Android项目导出到APK时我的static final boolean DEBUG标志设置为false。 我已经尝试过使用这里提到的“STOPSHIP”评论标记,但它似乎对apk导出没有任何影响,或者我使用它错了。 为此目的建立一个lint扩展看起来有点矫枉过正,有没有更简单的方法呢? 编辑 使用自动生成的BuildConfig.DEBUG标志,结合一些难以错过的屏幕指示,你在调试模式下运行(加上一个心理记录永远不会在快速修复后凌晨4点上传apk) – 可能会让你满意。 但它仍然不是我发布此问题的100%万无一失的方法。 仍然有人抱怨 BuildConfig.DEBUG随机无法按预期运行。 所以这个问题仍然存在 – 是否有一个皮棉技巧或类似的技巧呢?

使用minSdkVersion管理Android项目中的“已弃用”警告

我讨厌警告。 我们的Android项目现在有151个,我相信在列表的某个地方有一个实际上警告我们免受潜在的麻烦。 这些警告中的一种是关于不推荐使用的字段和方法。 这可能很有用,除了Manifest包含 ,这些警告只考虑target SDK即android-17 。 这些警告很容易静音 – 在违规行或整个方法之前添加@SuppressWarnings(“deprecation”)注释。 但这忽略了它的全部要点 – 如果/当我们决定更改minSdkVersion=”11″ ,在10级弃用的API仍然不会出现,并且有人将不得不在我们所有的项目中完成所有注释,find必须重写的代码。 是否有一些解决方案可以根据我的minSdkVersion管理这些警告? 似乎Mark在下面发布了一个有趣的答案,甚至提出了一个受我的问题启发的function请求 ,并不同意我对minSdkVersion的重要性。 他希望看到基于目标API级别的弃用警告(很可能来自Lint,类似于@TargetApi(NN)注释)。 但我不同意这种做法。 考虑一个打开相机的简单应用程序。 它可能想要检查预览帧速率 。 但是这种方法在API 9中已弃用,现在我们必须检查预览FPS范围 。 如果我们使用platforms/android-8/android.jar ,Java编译器将不会显示弃用警告。 但即使应用程序在支持此类查询的设备上运行,它也不允许我们find首选的video分辨率 。 我们可能会在@TargetApi(11)添加@TargetApi(11)注释,以确保应用程序是使用platforms/android-11/android.jar或更高版本构建的。 现在我们已经定位了Honeycomb及更高版本,将为getPreviewFrameRate()显示弃用警告,这正是困扰我的。 有一段时间,我想象中的应用程序必须支持一些Froyo设备,因此我别无选择, minSdkVersion=8设置minSdkVersion=8并使用不推荐使用的方法。 当然,我将在条件块中使用任何高级API,并且具有@TargetApi(NN) 。 幸运的是,对于Donut和更高版本,当检测到对不存在的方法或成员的调用时,类加载器不会崩溃,并且仅仅在if()中包装可疑调用就足够了。 那我该怎么办? 在对getPreviewFrameRate()的调用周围添加@SuppressWarnings(“deprecation”) )来静音警告? 添加@SuppressDeprecation(8)代替? 但在某些时候,我将决定与Froyo的向后兼容性不再重要。 我在我的Manifest中设置了 ,但getPreviewFrameRate()的弃用警告仍被抑制……好吧,新方法肯定比现有的注释更好,因为它更容易grep -R “@SuppressDeprecation(8)”在Manifest中进行更改后的整个项目。 但我更喜欢这里更紧密的集成:让Lint为我解析Manifest文件。 这现在更有意义吗?

如何针对已弃用的Androidfunction禁止特定的Lint警告?

我使用版本开关来支持较旧的Android版本。 int sdk = Build.VERSION.SDK_INT; if (sdk < Build.VERSION_CODES.HONEYCOMB) { ColorDrawable colorDrawable = new ColorDrawable(shapeColor); //noinspection deprecation viewHolder.shape.setBackgroundDrawable(colorDrawable); } else { viewHolder.shape.setColor(shapeColor); } 从命令行使用Gradle构建项目时,Lint会输出以下警告: app/src/main/java/com/example/MyApp/CustomListAdapter.java:92: warning: [deprecation] setBackgroundDrawable(Drawable) in View has been deprecated viewHolder.shape.setBackgroundDrawable(colorDrawable); ^ 我可以注释特定的行或方法来静音警告(因为我是故意这样做的)吗? 我不想禁用所有警告。

在升级到v22之后,signingConfigs标记在build.gradle中给出了一个Lint错误

我在build.gradle(app)文件中有以下代码: signingConfigs { release { storeFile file(“D:\\Android\\keystore\\myApp.jks”) storePassword “myStorePw” keyAlias “myKeyAlias” keyPassword “MyKeyPw” } } 我刚刚升级到targetSdkVersion = 22,这意味着将SDK和构建工具升级到22。 现在整个部分在Android Studio(141.1793788)中以黄色突出显示,并显示以下消息: ‘signingConfigs’ cannot be applied to ‘(groovy.land.Closure)’ 我需要知道的v22有没有变化? 我找不到文档。

支持v7 MenuPopupHelper现在隐藏并限制为LIBRARY_GROUP

最近我在使用android.support.v7.view.menu.MenuPopupHelper遇到了一个lint错误,现在它被隐藏并限制为仅在其库组中使用。 确切的消息: MenuPopupHelper constructor can only be called from within the same library group (groupId=com.android.support) 摘自MenuPopupHelper.java类: /** * Presents a menu as a small, simple popup anchored to another view. * * @hide */ @RestrictTo(LIBRARY_GROUP) public class MenuPopupHelper implements MenuHelper { 问题:任何想法何时以及为何发生这种情况? 或者我应该寻找的解决方法是什么?