Android Lint规则大全(翻译)

  • Lint规则

lint规则包含以下几个分类

1、Correctness 正确性方面 

2、CorrectnessMessages 更正信息方面

3、Security 安全性方面

4、Performance 性能方面

5、UsabilityTypography 更好的可用性方面

6、UsabilityIcons Icon的更好的可用性方面

7、Usability 可用性方面

8、Accessibility 可访问性方面

9、Internationalization 国际化方面

1、Correctness  正确性方面

  • 1.1 AdapterViewChildren 布局

摘要:检查AdapterView是否未在XML中定义其子级

优先级:10/10

严重性:警告

类别:正确性

AdapterViews(如ListViews)必须使用Java代码(如ListAdapter)中的数据进行配置。

  • 1.2 OnClick 代码

摘要:onClick方法不存在

优先级:10/10

严重性:错误

类别:正确性

onClick属性值应该是单击视图时要调用的视图上下文中的方法的名称。此名称必须对应于只接受一个View类型参数的公共方法。

必须是字符串值,使用“\;”为unicode字符转义诸如“\n”或“\uxxxx”之类的字符。

  • 1.3 FindViewByIdCast 代码

摘要:添加显式强制转换

优先级:9/10

严重性:警告

类别:正确性

在Android O中,findViewById签名切换为使用泛型意味着在大多数情况下,您可以省略显式强制转换,只进行赋值对特定视图类的变量进行findViewById调用的结果。

然而,由于Java 7和8之间的语言变化,这种变化可能会导致在没有显式强制转换的情况下不编译的代码。这个皮棉检查是为了找这些场景,并建议现在添加强制转换,以便代码继续。

如果语言级别更新到1.8,则进行编译。

  • 1.4 FontValidationWarning文件

摘要:字体文件的验证

优先级:9/10

严重性:警告

类别:正确性

查找各种字体文件中的问题。

  • 1.5 MissingPermission 代码

摘要:缺少权限

优先级:9/10

严重性:错误

类别:正确性

此检查扫描您的代码和库,并查看已使用,并根据访问这些权限所需的权限集进行检查API。如果在运行时调用使用这些API的代码,那么程序将

崩溃。此外对于可撤销的许可(使用targetSdkVersion 23),客户端代码还必须准备好处理抛出异常的调用,如果用户在运行时拒绝对权限的请求。

  • 1.6 MissingSuperCall 代码

摘要:缺少super()

优先级:9/10

严重性:错误

类别:正确性

某些方法,如View#onDetachedFromWindow,要求您也调用super作为方法的一部分。

  • 1.7 SuspiciousImport 代码

摘要:检查“import android.R”语句,这些语句通常是偶然的

优先级:9/10

严重性:警告

类别:正确性

导入android.R通常不是故意的;它有时会在您使用IDE时出现,并要求它在项目的R类不存在时自动添加导入。

导入完成后,您可能会收到很多“令人困惑”的错误消息,因为droid.R中可用的字段当然不是您只需查看自己的R类所期望的字段。

  • 1.8 UsesMinSdkAttributes代码 全局配置文件

摘要:未定义最小SDK和目标SDK属性

优先级:9/10

严重性:警告

类别:正确性

清单应包含一个<uses-sdk>元素,该元素定义了最小API运行应用程序所需的级别,以及目标版本(您测试过该版本的最高API级别)。

  • 1.9 WrongViewCast 代码

摘要:查找根据XML属于不同类型的视图的不正确强制转换

优先级:9/10

严重性:错误

类别:正确性

跟踪与id相关联的视图类型,如果在Java代码中发现id的用法,则确保将其视为相同的类型。

  • 1.10 AaptCrash代码 资源类xml

总结:潜在的AAPT崩溃

优先级:8/10

严重程度:致命

类别:正确性

定义一个将android:id设置为动态生成的id的样式可能会导致资源打包工具aapt的许多版本都崩溃了。解决问题这样,就可以使用<item type=“id”name=“…”/>显式声明id。

  • 1.11 DuplicatePlatformClasses 导包相关

摘要:重复的平台类

优先级:8/10

严重程度:致命

类别:正确性

有许多库不仅复制了Android平台,但使用与中提供的类名完全相同的Android类名——例如apachehttp类。这可能会导致意外崩溃。

要解决这个问题,你需要找到一个新版本的库。

这个问题持续时间更长,或者重新打包库(及其所有依赖项),或者最后重写使用不同API的代码(例如,对于http代码,请考虑使用HttpUrlConnection或类似okhttp的库)。

  • 1.12 FontValidationError 字体

摘要:字体文件的验证

优先级:8/10

严重性:错误

类别:正确性

查找各种字体文件中的问题。

  • 1.13 GradleCompatible 导包和代码

摘要:不兼容的渐变版本

优先级:8/10

严重程度:致命

类别:正确性

有一些库或工具与库的组合,它们是不兼容,或可能导致错误。其中一种不兼容是使用不是最新版本的Android支持库版本(或特别是低于targetSdkVersion的版本)。

  • 1.14 GradlePluginVersion gradle配置

摘要:不兼容的Android Gradle插件

优先级:8/10

严重性:错误

类别:正确性

并非所有版本的Android Gradle插件都与所有版本兼容SDK的一部分。如果您更新了工具,或者您正试图打开一个项目是用旧版本的工具构建的,您可能需要更新插件版本号。

  • 1.15 HighAppVersionCode gradle配置

摘要:版本代码过高

优先级:8/10

严重性:错误

类别:正确性

声明的versionCode是一个Integer。确保版本号不是接近极限。建议单调增加这个数字应用程序的每个次要或主要版本。请注意,使用versionCode over Integer.MAX_VALUE不可能。

  • 1.16 IllegalResourceRef gradle配置

摘要:名称和版本必须是整数或字符串,而不是资源

优先级:8/10

严重性:警告

类别:正确性

对于versionCode属性,您必须指定一个实际的整数文本;不能对@dimen/name资源使用间接寻址。类似地versionName属性应该是一个实际的字符串,而不是字符串资源url。

  • 1.17 MergeMarker SVN等标记检查

摘要:代码包含合并标记

优先级:8/10

严重性:错误

类别:正确性

许多版本控制系统在未合并的文件中留下诸如<<in之类的标记源代码。此检查查找这些标记,这些标记有时意外地留在了中,特别是在资源文件中,这些文件不会被破坏汇编

  • 1.18 MissingLeanbackLauncher 全局配置文件

摘要:缺少Leanback Launcher意向过滤器。

优先级:8/10

严重性:错误

类别:正确性

打算在电视设备上运行的应用程序必须声明启动器活动用于在其清单中使用android.intent.tegory.LEANBACK_LAUNCHER的电视<intent-fillter>。

  • 1.19 MockLocation 全局配置文件

摘要:在生产中使用模拟位置提供程序

优先级:8/10

严重程度:致命

类别:正确性

使用模拟位置提供程序(通过要求权限android.permission.ACCESS_MOCK_LOCATION)只能在调试构建中完成(或来自测试)。在Gradle项目中,这意味着您应该只请求测试或调试源集特定清单文件中的权限。

要解决此问题,请在调试文件夹中创建一个新的清单文件,然后移动<使用权限>元素。调试清单覆盖的典型路径Gradle项目中的文件是src/debug/AndroidManifest.xml。

  • 1.20 MissingPrefix 布局和xml

摘要:检测不使用Android命名空间的XML属性  xmlns:自定义类型的标签

优先级:8/10

严重性:警告

类别:正确性

大多数Android视图在Android命名空间中都有属性。当引用这些属性时,您*必须*包括命名空间前缀,或者您的属性将被aapt解释为一个自定义属性。

  • 1.21 NamespaceTypo 布局和xml

摘要:查找命名空间声明中的拼写错误

优先级:8/10

严重性:警告

类别:正确性

命名空间声明中的意外拼写错误可能会导致一些非常模糊的错误消息。这项检查寻找潜在的线索来帮助追踪这些线索。

  • 1.22 NotInterpolated 代码kotlin

摘要:插值不正确

优先级:8/10

严重性:错误

类别:正确性

要插入变量的值,可以在字符串中使用${variable}

字面意思,但前提是您使用的是双引号!

  • 1.23 PendingBindings 代码 jetpack框架的databind用 

摘要:缺少挂起的绑定

优先级:8/10

严重性:错误

类别:正确性

在onBindViewHolder方法中使用ViewDataBinding时,必须调用executeendingBindings(),然后方法退出;否则数据绑定运行时将在下一个动画帧中更新UI,导致延迟。如果项目调整大小,则更新和潜在的跳转。

  • 1.24 Proguard 混淆文件

摘要:使用过时的ProGuard配置

优先级:8/10

严重程度:致命

类别:正确性

在proguard配置文件中使用-keepclasseswithmembernames是不正确的;它可能会导致某些符号被重命名,而这些符号不应该被重命名。

早期版本的ADT用于创建带有错误的proguard.cfg文件

总体安排使用-keepclasseswithmembername而不是-keepclasses withmembers,因为旧标志也意味着“允许收缩”,这意味着只有符号从XML而不是Java(例如可能的CustomViews)引用可以获得删除。

  • 1.25 RecyclerView 代码

摘要:RecyclerView问题

优先级:8/10

严重性:错误

类别:正确性

当数据集中的项更改,除非该项本身无效或新的位置无法确定。因此,在获取时应仅使用位置参数。此方法中的相关数据项,不应保留其副本。如果您稍后需要项目的位置(例如在点击监听器中),请使用getAdapterPosition(),它将具有更新的适配器位置。

  • 1.26 ReferenceType xml

摘要:引用类型不正确

优先级:8/10

严重程度:致命

类别:正确性

生成资源别名时,所指向的资源必须是与别名类型相同

  • 1.27 ResourceCycle xml

摘要:资源定义中的周期

优先级:8/10

严重程度:致命

类别:正确性

资源定义中不应存在循环,因为这可能导致运行时例外情况。

  • 1.28 ResourceName xml 前缀

摘要:前缀错误的资源

优先级:8/10

严重程度:致命

类别:正确性

在Gradle项目中,您可以指定一个资源前缀

项目必须符合。这样可以更容易地确保意外地组合了来自不同库的资源,因为它们最终都会在相同的共享应用程序命名空间中。

  • 1.29 ScrollViewCount 布局

摘要:检查ScrollViews是否只有一个子窗口小部件  

优先级:8/10

严重性:警告

类别:正确性

ScrollViews只能有一个子窗口小部件。如果您想要更多的子项,请将它们包装在容器布局中。

  • 1.30 StringShouldBeInt

摘要:字符串应为int

优先级:8/10

严重性:错误

类别:正确性

compileSdkVersion、minSdkVersion和targetSdkEdition的财产为通常是数字,但当您使用附加组件时可以是字符串(在这种情况下compileSdkVersion)或预览平台(用于其他两个财产)。但是,您不能使用数字作为字符串(例如,“19”而不是19);那个将导致在生成/同步时出现未找到平台的错误消息。

  • 1.31 TranslucentOrientation 代码和主题  半透明布局不支持固定横竖屏

摘要:混合屏幕方向和半透明 

优先级:8/10

严重性:警告

类别:正确性

不支持使用半透明主题指定固定屏幕方向

在targetSdkVersion O或更高版本的应用程序上,因为可能还有其他版本在具有冲突请求的活动后面可见的活动。

例如,您的活动请求横向和后面的可见活动

你半透明的活动请求画像。在这种情况下,系统只能接受其中一个请求,并且当前更愿意接受来自的请求非半透明活动,因为它们后面什么都看不见。运行平台版本O或更高版本的设备将在您的

如果检测到此状态,请应用。

  • 1.32 StyleCycle  style.xml

摘要:在样式定义中查找循环

优先级:8/10

严重程度:致命

类别:正确性

样式定义中不应该有循环,因为这可能导致运行时异常。

  • 1.33 UnknownId 布局

摘要:检查RelativeLayout中其他地方未定义的id引用

优先级:8/10

严重程度:致命

类别:正确性

“@+id/”语法引用了一个现有的id,或者在其他地方尚未定义的情况下创建一个新的id。然而,这意味着,如果您的引用中有拼写错误,或者引用的视图不存在,则不会收到警告,因为id将根据需要创建。如果您重命名了id,但没有更新对它的所有引用,则此检查会捕获错误。

  • 1.34 WrongFolder res目录

摘要:资源文件位于错误的res文件夹中

优先级:8/10

严重程度:致命

类别:正确性

资源文件有时会放错文件夹,这可能会导致难以理解的细微错误。此检查查找此中的问题区域,例如试图将布局“别名”文件放置在布局/文件夹中而不是它所属的值/文件夹。

  • 1.35 CommitTransaction 代码

摘要:缺少commit()调用

优先级:7/10

严重性:警告

类别:正确性

创建FragmentTransaction后,通常还需要提交它

  • 1.36 DalvikOverride 代码 重名

摘要:Dalvik认为方法被推翻

优先级:7/10

严重性:错误

类别:正确性

Android虚拟机将在一个类中处理包私有方法作为在其超类中重写包私有方法,即使它们位于单独的包装。这可能令人惊讶,但出于兼容性原因行为尚未改变。

如果您确实打算让此方法覆盖另一个方法,请将方法被保护。

如果您不打算重写,请考虑将该方法设为私有方法,或者更改其名称或签名。

  • 1.37 DeviceAdmin 全局配置文件

摘要:设备管理员格式不正确

优先级:7/10

严重性:警告

类别:正确性

如果您注册了一个充当设备管理员的广播接收器,您必须

还为操作注册一个<intent filter>android.app.action.DEVICE_ADMIN_ENABLED,没有任何<数据>,这样设备管理员可以被激活/停用。要执行此操作,请添加

<intent-filter><action android:name=“android.app.action.DEVICE_ADMIN_ENABLED”/></intent-filter>发送到您的<receiver>。

  • 1.38 DuplicateIds 布局

一个Layout内部的id应该是唯一的。

摘要:检查单个布局中的重复id

优先级:7/10

严重性:警告

类别:正确性

在布局中,id应该是唯一的,因为其他方式findViewById()可能会返回意外的视图。

  • 1.39 HalfFloat 代码

摘要:不正确的半浮

优先级:7/10

严重性:错误

类别:正确性

半精度浮点存储在短数据类型中,并且应该使用android.util.Half类进行操作。此检查标记以下用途这些值的使用似乎不正确。

  • 1.40 InconsistentArrays    strings.xml

摘要:字符串国际化中,同一名字的的String-Array对应的item值不相同 检查数组中元素数量的不一致性

优先级:7/10

严重性:警告

类别:正确性

当一个数组在不同的区域设置中转换时,它通常应该具有与原始数组相同数量的元素。当向数组中添加或移动元素时,很容易忘记更新所有的区域设置,而这个lint警告会发现这样的不一致。

然而,请注意,在某些情况下,您可能真的想在每个配置中声明不同数量的数组项(例如,这里的数组表示可用的选项,而这些选项因不同的布局方向等而不同),所以请根据自己的判断来判断这是否真的是一个错误。

如果它在您的项目中发现错误,您可以取消显示此错误类型。

  • 1.41 NestedScrolling 布局

摘要:检查滚动小部件中是否有嵌套的滚动小部件

优先级:7/10

严重性:警告

类别:正确性

滚动小部件(如ScrollView)不应包含任何嵌套的滚动小部件,因为这存在各种可用性问题

  • 1.42 ResourceAsColor  代码

摘要:Looksfor调用setColor,其中传递的是资源id,而不是解析的颜色

优先级:7/10

严重性:错误

类别:正确性

采用整数形式的颜色的方法应该传递RGB三元组,而不是实际的颜色资源id。必须首先调用getResources().getColor(resource)来解析实际的颜色值。

  • 1.43 ResourceType 代码

摘要:资源类型错误

优先级:7/10

严重性:错误

类别:正确性

确保传递给API的资源id是正确的类型;例如调用Resources.getColor(R.string.name)是错误的。

  • 1.44 crollViewSize  布局

摘要:检查ScrollViews是否在滚动维度中使用wrap_content

优先级:7/10

严重性:警告

类别:正确性

ScrollView子级必须在滚动维度中将其layout_width或layout_height属性设置为wrap_content,而不是fill_rent或match_parent

  • 1.45 TextViewEdits  代码

摘要:检查是否TextViews用于输入

优先级:7/10

严重性:警告

类别:正确性

使用<TextView>输入文本通常是错误的,您应该使用<EditText>。EditText是TextView的一个子类,TextView提供了一些编辑支持,因此可以在TextView上设置一些与输入相关的属性。然而,将TextView与输入属性一起使用通常是剪切和粘贴错误。要输入文本,您应该使用<EditText>。

此检查还检查TextView的子类,如Button和CheckBox,因为它们有相同的问题:它们不应与可编辑属性一起使用。

  • 1.46 WebViewLayout 布局

摘要:wrap_content父级中的WebViews

优先级:7/10

严重性:错误

类别:正确性

WebView实现具有某些性能优化,如果父视图使用wrap_content而不是match_parent。这可能会导致细微的UI错误。

  • 1.47 AppCompatMethod 代码

摘要:使用错误的AppCompat方法

优先级:6/10

严重性:警告

类别:正确性

使用appcompat库时,应该调用一些替代的方法;例如,getSupportActionBar()而不是getActionBar()。此lint检查查找对错误方法的调用。

  • 1.48 ApplySharedPref 代码

摘要:在SharedPreferences上使用apply()

优先级:6/10

严重性:警告

类别:正确性

考虑使用apply(),而不是对共享首选项进行提交。鉴于承诺立即阻止并将其数据写入持久存储,应用程序将在后台处理它。

  • 1.48 Assert 断言的语法检查

摘要:断言

优先级:6/10

严重性:警告

类别:正确性

在运行时不检查断言。有一些方法可以要求他们由Dalvik使用(adb-shell setprop-debug.assert 1),但请注意,这不是在ART(较新的运行时)中实现,甚至在Dalvik中,属性也是

在许多地方被忽视,不能依赖。相反,执行if(BuildConfig.DEBUG){}块内部的条件检查。那个常数是一个静态的最终布尔值,在调试版本中为true,在发布版本中为false构建,Java编译器完全删除if主体中的所有代码从应用程序。

例如,您可以将assert speed>0替换为if(BuildConfig.DEBUG&&!(速度>0)){抛出新的断言错误()}。

(注意:此lint检查不会标记纯粹断言为null或非零性;这些通常更多地用于工具而不是运行时检查。)

  • 1.48 CanvasSize 代码

摘要:画布尺寸错误

优先级:6/10

严重性:警告

类别:正确性

在自定义视图的绘制实现中,通常应该调用getWidth和getHeight在自定义视图本身上,而不是在画布实例上。

画布宽度和高度是画布的宽度和高度,而不是始终与视图的大小相同。

在硬件加速路径中,画布的宽度和高度通常为始终与视图的匹配,因为每个视图都会转到自己录制的显示列表。但在软件渲染中,只有一个画布被剪裁并在穿过视图树时进行转换,否则

对于每个View的绘制方法,保持相同的Canvas对象。

您应该只使用“画布”状态来调整绘制量,例如quickReject用于提前避免工作,如果它将被修剪掉,但不是你画什么。

  • 1.49 CheckResult 代码

摘要:忽略结果

优先级:6/10

严重性:警告

类别:正确性

有些方法没有副作用,一种在不做任何事情的情况下调用它们没有结果是可疑的。

  • 1.50 CommitPrefEdits  代码

摘要:查找编辑SharedPreference但忘记对其调用commit()的代码

优先级:6/10

严重性:警告

类别:正确性

在SharedPreference上调用edit()后,必须在编辑器上调用commit()或apply()来保存结果。

  • 1.51 CustomViewStyleable 布局

摘要:可设置样式/自定义视图名称不匹配

优先级:6/10

严重性:警告

类别:正确性

自定义视图的约定是使用名称声明的式表与自定义视图类名匹配。IDE依赖于这样的约定

例如,可以为自定义中的属性提供代码完成视图布局中的XML资源文件。

(同样,布局参数类应该使用后缀_layout。)

  • 1.52 CutPasteId 代码

摘要:可能的剪切和粘贴错误

优先级:6/10

严重性:警告

类别:正确性

此lint检查查找您剪切并粘贴了对的调用的情况findViewById,但忘记更新R.id字段。

有可能您的代码只是重复地(冗余地)查找字段,但lint无法将其与您想要初始化的情况区分开来

字段prev和next,然后剪切并粘贴findViewById(R.id.prev),然后忘记了以将第二初始化更新为R.id.next。

  • 1.53 DefaultLocale 代码

摘要:大小写转换中隐含的默认区域设置

优先级:6/10

严重性:警告

类别:正确性

调用字符串#toLowerCase()或#toUpperCase()而不指定显式区域设置是常见的错误来源。原因是这些方法将使用用户设备上的当前区域设置,即使代码似乎工作正常,但将在其他地区失败。

例如,在土耳其语言环境中,大写替换因为我不是我。

如果希望方法只执行ASCII替换,例如转换枚举名称,改为调用String#toUpperCase(Locale.US)。如果你如果真的想使用当前的区域设置,请调用字符串#toUpperCase(Locale.getDefault())。

  • 1.54 DuplicateDefinition 资源xml

摘要:资源的重复定义

优先级:6/10

严重性:错误

类别:正确性

您可以在不同的资源文件夹中多次定义资源;在同一资源文件夹中多次定义同一个资源是一个错误。

  • 1.55 DuplicateIncludedIds 布局

摘要:检查与include标记组合的布局中的重复id

优先级:6/10

严重性:警告

类别:正确性

两个独立的布局使用相同的id是可以的。但是,如果布局与include标记相结合,那么id在任何包含的布局链中都必须是唯一的,否则Activity#findViewById()可能会返回意外的视图。

  • 1.56 ExifInterface 代码

摘要:使用android.media.ExifInterface

优先级:6/10

严重性:警告

类别:正确性

android.media.ExifInterface 旧版本的Android实现中存在一些已知的安全漏洞。要使用是版本API

  • 1.57 GradleDeprecated gradle配置

摘要:不推荐的Gradle方法

优先级:6/10

严重性:警告

类别:正确性

此检测器查找不推荐使用的Gradle构造,这些构造当前可以工作,但在将来的更新中可能会停止工作。

  • 1.59 GradleGetter gradle配置

摘要:Gradle隐式Getter调用

优先级:6/10

严重性:错误

类别:正确性

Gradle将允许您将构建脚本中的特定常量替换为方法调用,因此您可以例如动态计算版本字符串

基于您当前的版本控制修订号,而不是硬编码一个数字。

例如,在计算版本名时,很容易调用执行getVersionName。但是,当您将该方法调用放入defaultConfig块,实际上您将为versionName属性。因此,您需要命名您的方法与现有的隐式getter不冲突的东西。考虑使用compute作为前缀而不是get。

  • 1.60 ImpliedTouchscreenHardware 全局配置文件

摘要:硬件功能触摸屏未明确标记为可选

优先级:6/10

严重性:错误

类别:正确性

默认情况下,应用程序需要android.hardware.touchscreen功能。如果你愿意你的应用程序要在电视上播放,你还必须明确声明不需要触摸屏,如下所示:

<uses feature android:name=“android硬件触摸屏”android:required=“false”/>

  • 1.61 IncompatibleMediaBrowserServiceCompatVersion 代码

摘要:MediaBrowserServiceCompat的过时版本

优先级:6/10

严重性:警告

类别:正确性

MediaBrowserServiceCompat支持v4版本23.2.0至23.4.0库使用了专用API,将与的未来版本不兼容安卓系统N之外的安卓系统。请升级到版本24.0.0或更高版本支持库。

  • 1.62 InconsistentLayout 布局

摘要:布局不一致

优先级:6/10

严重性:警告

类别:正确性

这会发现您不小心忘记将小部件添加到所有布局的变化,这可能会导致一些人的运行时崩溃

findViewById()失败时的资源配置。

有些情况下这是故意的。例如,您可能有专用的大型平板电脑布局,添加了一些额外的小工具出现在手机版本的布局中。只要代码访问布局资源要小心处理,这是有效的。那样的话可以对给定的额外视图或缺失视图取消此lint检查,或者整体布局

  • 1.63 InlinedApi 代码

摘要:在旧版本上使用内联常量

优先级:6/10

严重性:警告

类别:正确性

此检查扫描中的所有Android API字段引用

应用程序并标记某些常量,例如静态最终整数和字符串,在后来的版本中引入。事实上将是复制到类文件中,而不是被引用,这意味着即使在旧设备上运行,值也可用。在某些情况下很好,在其他情况下,它可能会导致运行时崩溃或不正确行为这取决于上下文,所以仔细考虑代码并做出决定它是否安全并且可以被抑制,或者代码是否需要受到保护。

如果你真的想使用这个API并且不需要支持旧的设备只需在build.gradle或AndroidManifest.xml文件中设置minSdkVersion即可。如果您的代码有意访问更新的API,并且您已经确保(例如。具有条件执行),该代码将只在支持的平台,然后您可以使用

@TargetApi注释指定要应用的本地最低SDK,例如@TargetApi(11),因此此检查考虑的是11而不是您的清单文件的最低SDK作为所需的API级别。

  • 1.64 Instantiatable 全局配置文件

摘要:注册的类不可实例化

优先级:6/10

严重程度:致命

类别:正确性

清单文件中登记的活动、服务、广播接收器等(或对于布局文件中的自定义视图)必须由系统,这意味着类必须是公共的,它必须有一个空的公共构造函数,如果它是内部类,则必须是静态内部类班

  • 1.65 IntentReset 代码

摘要:setType和setData的可疑混合

优先级:6/10

严重性:警告

类别:正确性

Intent提供了以下API:setData(Uri)和setType(String)。

不幸的是,设置一个会清除另一个。如果要同时设置两者,则应改为调用setDataAndType(Uri,String)。

  • 1.66 InvalidAnalyticsName 代码

摘要:无效的分析名称

优先级:6/10

严重性:错误

类别:正确性

事件名称和参数必须遵循中定义的命名约定“FirebaseAnalytics#logEvent()”文档。

  • 1.67 InvalidId 布局

摘要:无效的ID声明

优先级:6/10

严重程度:致命

类别:正确性

id定义的形式必须为@+id/yourname。工具没有过去拒绝了@+foo/bar形式的字符串,但这是一个错误,并且

由于id整数的分配方式,可能会导致棘手的错误。

如果您真的想为您的id设置不同的“作用域”,请使用前缀诸如login_button1和login_button 2。

  • 1.68 InvalidImeActionId 布局

摘要:无效的imeActionId声明

优先级:6/10

严重性:错误

类别:正确性

android:imeActionId不应该是resourceId,例如@+id/resName。它必须是整数常量或整数资源引用,如中所定义编辑器信息。

  • 1.69 InvalidPackage jar的检查

摘要:Android中未包含软件包

优先级:6/10

严重性:错误

类别:正确性

此检查扫描库,查找对以下API的调用包含在Android中。

当您创建Android项目时,类路径被设置为可以仅访问Android中包含的API包中的类。然而如果将其他项目添加到libs/文件夹中,则无法保证这些.jar文件是使用特定于Android的类路径构建的,并且特别是,他们可能正在访问不受支持的API,如java.applet。

此检查扫描库jar并查找对API包的引用,未包含在Android中的,并对其进行标记。这只是一个错误,如果您的代码调用一个库类,该类最终引用不支持的程序包。

  • 1.70 InvalidResourceFolder

摘要:无效的资源文件夹

优先级:6/10

严重性:错误

类别:正确性

此lint检查查找不是有效资源文件夹的文件夹名称,这些将被忽略,并且不会被Android Gradle插件打包。

请注意,资源的顺序非常重要;例如,你不能

在网络代码之前指定一种语言。

同样,请注意,要使用3个字母的地区代码,必须使用特殊的BCP47语法:前缀b+后跟BCP47语言标记,但带+作为单独的分隔符,而不是-。因此,对于BCP47语言标签nl ABW你必须使用b+nl+ABW。

  • 1.71 InvalidUsesTagAttribute 配置

摘要:use元素的name属性无效。

优先级:6/10

严重性:错误

类别:正确性

<automotiveApp>中的<uses>元素应包含name属性。有效值为媒体或通知。

  • 1.72 InvalidWakeLockTag 代码

摘要:唤醒锁定标记无效

优先级:6/10

严重性:错误

类别:正确性

唤醒锁定标记必须遵循`PowerManager中定义的命名约定`文档

  • 1.73 InvalidWearFeatureAttribute 全局配置文件

摘要:磨损使用功能的属性无效

优先级:6/10

严重性:错误

类别:正确性

对于android.hardware.type.watch使用的功能,android:required=“false”为不允许。不支持用于Wear和non-Wear设备的单个APK。

  • 1.74 LibraryCustomView 布局

摘要:库中的Flags custom属性,必须使用res-auto命名空间    xmlns:自定义类型的标签

优先级:6/10

严重性:错误

类别:正确性

在库项目中使用具有自定义属性的自定义视图时,布局必须使用特殊名称spacehttp://schemas.android.com/apk/res-auto而不是包含库项目自己的包的URI。当库资源合并到应用程序项目中时,这将用于自动调整属性的中间空间。

  • 1.75 LocaleFolder 代码

摘要:区域设置名称错误

优先级:6/10

严重性:警告

类别:正确性

从java.util.Locale文档中:请注意,Java使用了几个不推荐使用的两个字母的代码。希伯来语(“he”)语言代码改写为“iw”,印尼语(“id”)改写为“in”,意第绪语(“yi”)为“ji”。即使您构建了自己的Locale,也会发生这种重写对象,而不仅仅是各种查找方法返回的实例。

因此,如果您将本地化资源添加到例如值中,则它们将不会被使用,因为系统将查找值iw。要解决此问题,请使用不推荐使用的语言代码。

  • 1.76 ManifestResource 全局配置文件

摘要:清单资源引用

优先级:6/10

严重程度:致命

类别:正确性

清单中的元素可以引用资源,但这些资源不能不同配置(特殊情况除外,不同版本除外对于一些特定的包属性,如应用程序标题和图标)。

  • 1.77 MissingBackupPin xml

摘要:缺少备用引脚

优先级:6/10

严重性:警告

类别:正确性

强烈建议声明一个备份<pin>元素。没有当特定站点证书已轮换,应用程序尚未更新。

  • 1.78 MissingConstraints 布局

摘要:ConstraintLayout中缺少约束

优先级:6/10

严重性:错误

类别:正确性

布局编辑器允许您将小部件放置在画布上的任何位置使用designtime属性(例如layout_editor_absoluteX)。这些属性不会在运行时应用,因此如果

当你在设备上推送布局时,小部件可能会出现在不同的位置。要解决此问题,请确保小部件同时具有通过从边连接拖动来实现水平和垂直约束。

  • 1.79 MissingDefaultResource 资源

摘要:缺少默认值

优先级:6/10

严重程度:致命

类别:正确性

如果资源仅在带有诸如-land或-en之类限定符的文件夹中定义,并且在基本文件夹中没有默认声明(布局或值等),

如果在设备上访问该资源,则应用程序将崩溃。

作为一种特殊情况,不必在基本文件夹中指定可绘制内容;如果在密度文件夹(例如可绘制的mdpi)中有匹配的图像将被使用和缩放。但是请注意,如果您只指定了一个drawable en hdpi这样的文件夹,该应用程序在非英语地区会崩溃。

在某些情况下,您可能有一个资源,例如-fr drawable,仅从具有相同限定符的其他资源中引用(例如-fr样式),它本身具有安全的回退。然而,这仍然

使得有人可能不小心引用了drawable和崩溃,因此在基本文件夹中创建默认的虚拟回退更安全。或者,您可以通过添加tools:对元素忽略=“MissingDefaultResource”。

(这种情况经常发生在字符串翻译中,您可能删除代码和相应的资源,但忘记删除翻译该场景有一个专用的问题id为额外翻译。)

  • 1.80 MissingFirebaseInstanceTokenRefresh 代码 国内不用

摘要:缺少Firebase实例ID令牌刷新

优先级:6/10

严重性:警告

类别:正确性

检查Firebase实例ID的应用程序通常应实现FirebaseInstanceIdService#onTokenRefresh()回调以便观察变化。

  • 1.81 MissingIntentFilterForMediaSearch 全局配置文件

摘要:缺少带操作的意向筛选器android.media.action.media_PLAY_FROM_SEARCH(多媒体操作)

优先级:6/10

严重性:错误

类别:正确性

要支持Android Auto上的语音搜索,您还应该注册

动作android.media.action.media_PLAY_FROM_SEARCH的意图过滤器。要执行此操作,请添加

<intent-fillter>

    <action android:name=“android.media.action.media_PLAY_FROM_SEARCH”/>

</intent-fillter>

到您的<活动>或<服务>。

  • 1.82 MissingLeanbackSupport 全局配置文件

总结:缺少Leanback支持。

优先级:6/10

严重性:错误

类别:正确性

清单应声明Leanback用户界面的使用安卓电视。

要解决此问题,请添加<使用功能android:name=“android.software.leanback”android:required=“false”/>到你的舱单。

  • 1.83 MissingMediaBrowserServiceIntentFilter 全局配置文件

摘要:缺少带操作的意向筛选器android.media.brows.media浏览器服务。

优先级:6/10

严重性:错误

类别:正确性

汽车媒体应用程序需要导出扩展服务android.service.media.MediaBrowserService,带有操作的意向筛选器android.media.browse.MediaBrowserService可以浏览和播放媒体。

要执行此操作,请添加<intent-fillter><action android:name=“android.media.browse.MediaBrowserService”/></intent-fillter>到扩展android.service.media.MediaBrowserService的服务

  • 1.85 MultipleUsesSdk 全局配置文件

清单中有多个<uses-sdk>元素

优先级:6/10

严重程度:致命

类别:正确性

<uses-sdk>元素应该只出现一次;这些工具不会合并

所有元素的内容,因此如果将属性拆分为多个

元素,只有其中一个才会生效。要解决此问题,只需合并所有

将各种元素中的属性合并为一个<uses-sdk>元素。

  • 1.86 NotSibling 布局

摘要:无效约束

优先级:6/10

严重程度:致命

类别:正确性

给定ConstraintLayout或RelativeLayout中的布局约束应引用同一相对布局中的其他视图(但不引用其本身!)

  • 1.86 OldTargetApi 代码

摘要:目标SDK属性不针对最新版本

优先级:6/10

严重性:警告

类别:正确性

使用的API高于设置的targetSdkVersion版本。

若要解决此问题,请将targetSdkVersion设置为可用的最高值。

然后测试你的应用程序,确保一切正常。

  • 1.87 Override 代码

摘要:方法与新继承的方法冲突

优先级:6/10

严重性:错误

类别:正确性

假设您正在针对Android API 8进行构建,并且您已经将活动在您的子类中,您添加了一个名为isDestroyed()的新方法。稍后,一个具有相同名称和签名的方法被添加到Android中。你的方法现在将覆盖Android方法,并可能破坏其合约。

您的方法没有调用super.isDestroyed(),因为您的编译目标不知道该方法。

上面的场景就是这个皮棉探测器所寻找的。上面的例子是真实的,因为isDestroyed()是在API 17中添加的,但对于任何方法添加到Android类的子类中目标低于该方法引入时的版本。

要解决此问题,请重命名您的方法。

  • 1.88 OverrideAbstract 代码

摘要:不覆盖旧平台上的抽象方法

优先级:6/10

严重性:错误

类别:正确性

为了提高一些API的可用性,一些过去是抽象的方法已经通过添加默认实现而变得具体。这意味着使用新版本的SDK进行编译时,您的代码不必覆盖这些方法。

但是,如果您的代码也针对平台的旧版本这些方法仍然是抽象的,代码会崩溃。您必须覆盖所有方法,这些方法在您的目标的任何版本中都是抽象的应用程序的minSdkVersion。

  • 1.89 PinSetExpiry xml

摘要:验证<pin set>过期属性

优先级:6/10

严重性:警告

类别:正确性

确保<pin set>元素的过期属性有效,并且尚未过期或即将过期

  • 1.90 PrivateApi 代码

摘要:使用私有API

优先级:6/10

严重性:警告

类别:正确性

使用反射访问隐藏/私有的Android API是不安全的;它通常无法在其他供应商的设备上工作,而且可能会突然停止工作

(如果API被移除)或崩溃(如果API行为改变不能保证兼容性)。

  • 1.91 PropertyEscape 代码

摘要:属性转义不正确

优先级:6/10

严重性:错误

类别:正确性

.properties文件中的所有反斜杠和冒号都必须使用反斜杠进行转义. 这意味着在编写Windows路径时,必须对文件进行转义分隔符,因此路径MyFiles应写成key=\\My\\Files。

  • 1.92 Range 代码

摘要:超出范围

优先级:6/10

严重性:错误

类别:正确性

一些参数需要在特定的数值范围内;确保传递的参数在该范围内。对于数组,字符串和集合指的是大小或长度。

  • 1.93 RequiresFeature 代码

摘要:依赖的功能

优先级:6/10

严重性:警告

类别:正确性

某些API要求提供可选功能。这项检查确保对这些API的调用被一个强制执行这一点的检查所包围。

  • 1.94 SdCardPath 代码

摘要:/sdcard的硬编码参考

优先级:6/10

严重性:警告

类别:正确性

您的代码不应该直接引用/sdcard路径;改为使用Environment.getExternalStorageDirectory().getPath()。

同样,不要直接引用/data/data/路径;它可以在多用户场景。相反,请使用Context.getFilesDir().getPath()。

  • 1.95 ServiceCast 代码

摘要:错误的系统服务类型转换

优先级:6/10

严重性:错误

类别:正确性

当您调用Context.getSystemService()时,结果通常被强制转换为特定接口。这种检查可确保与返回值的预期类型相同。

  • 1.96 ShortAlarm 代码

摘要:短期或频繁报警

优先级:6/10

严重性:警告

类别:正确性

频繁的警报对电池寿命不利。自API 22起,AlarmManager将覆盖近期和高频报警请求,将报警延迟到未来至少5秒,并确保重复间隔为至少60秒。

如果你真的需要在5秒内完成工作,可以发布延迟消息或可运行到处理程序。

  • 1.97 ShowToast 代码

摘要:Toast已创建但未显示

优先级:6/10

严重性:警告

类别:正确性

Toast.makeText()创建Toast但不显示它。您必须在上调用show()

实际使Toast出现的结果对象。

  • 1.98 SimpleDateFormat 代码

摘要:日期格式的隐含区域设置

优先级:6/10

严重性:警告

类别:正确性

几乎所有调用方都应该使用getDateInstance()、getDateTimeInstance()或getTimeInstance()以获得一个现成的SimpleDateFormat实例用于用户的区域设置。创建此类实例的主要原因是因为您需要格式化/解析特定的机器可读

格式,在这种情况下,你几乎肯定想明确要求美国确保您得到的是ASCII数字(而不是阿拉伯数字)。

因此,您应该使用SimpleDateFormat构造函数的形式在其中传递显式区域设置,如locale.US,或使用实例方法,或者如果真的知道自己在做什么,就抑制这个错误。

  • 1.99 Slices 代码

摘要:切片

优先级:6/10

严重性:警告

类别:正确性

此检查分析切片API的使用情况,并提供最佳实践。

  • 1.100 Suspicious0dp 布局

摘要:可疑的0dp维度

优先级:6/10

严重性:错误

类别:正确性

在带有权重的水平LinearLayout中使用0dp作为宽度是有用的确保给子view量尺寸时只使用权重(而不是固有大小。

但是,如果将0dp用于相反的维度,则视图将为不可见,同时翻转所有子项中的0dp维度。

  • 1.101 UniquePermission 全局配置文件

摘要:权限名称不唯一

优先级:6/10

严重程度:致命

类别:正确性

不合格的名称或您的权限必须是唯一的。这样做的原因在构建时,aapt工具将生成一个名为Manifest的类其中包含用于您的每个权限的字段。这些字段命名为使用您的权限限定名称(即最后一个名称后面的名称部分点)。

如果多个权限映射到同一字段名,则该字段将任意命名其中一个。

  • 1.102 UnsupportedTvHardware 全局配置文件

摘要:不支持的电视硬件功能

优先级:6/10

严重性:错误

类别:正确性

<uses feature>元素不应需要此不受支持的电视硬件特色

任何未明确标记为required=“false”的uses功能都是在要安装的设备上是必需的。请确保可能会阻止将其安装在电视设备上如清单中未要求。

  • 1.103 UnusedAttribute xml

摘要:旧版本上未使用的属性

优先级:6/10

严重性:警告

类别:正确性

此检查查找在某个版本中引入的XML文件中设置的属性比应用程序目标的最旧版本更新(具有minSdkVersion属性)。

这不是一个错误;应用程序将简单地忽略该属性。

但是,如果属性对的外观或功能很重要

在您的应用程序中,您应该考虑找到另一种方法来实现

仅具有可用属性的相同结果,然后您可以选择

在布局vNN文件夹中创建布局的副本,该文件夹将用于API

NN或更高版本,您可以利用更新的属性。

注意:此检查不仅适用于属性。例如,一些标签可以

也未使用,例如API 21中引入的布局中的新<tag>元素。

  • 1.104 UseAlpha2 代码

摘要:使用3位代码

优先级:6/10

严重性:警告

类别:正确性

为了与早期设备兼容,您应该只使用3个字母的语言以及当不存在对应的2个字母的代码时的区域代码。

  • 1.105 ValidFragment 代码 Fragment的

摘要:片段不可实例化

优先级:6/10

严重性:错误

类别:正确性

从Fragment文档中:每个片段都必须有一个空的构造函数,因此可以在恢复其活动状态。强烈建议子类这样做

没有其他带参数的构造函数,因为这些构造函数不会被重新实例化时被调用;相反,参数可以是由具有setArguments(Bundle)的调用程序提供,稍后由带有getArguments()的片段。

  • 1.106 WifiManagerLeak 代码

摘要:WifiManager泄漏

优先级:6/10

严重性:错误

类别:正确性

在Android N(24)之前的版本上,通过初始化WifiManager

如果上下文不是

应用程序上下文。将context.getSystemService(…)更改为

context.getApplicationContext().getSystemService(…)。

  • 1.107 WifiManagerPotentialLeak 代码

总结:WifiManager潜在泄漏

优先级:6/10

严重性:警告

类别:正确性

在Android N(24)之前的版本上,通过初始化WifiManager

如果上下文不是应用程序上下文。

在许多情况下,从代码中看,上下文的来源并不明显

(例如,它可能是方法的参数,也可能是从各种初始化的字段方法调用)。传入的上下文可能是

应用程序上下文,但为了安全起见,您应该考虑更改context.getSystemService(…)到context.getApplicationContext().getSystemService(…)。

  • 1.108 WrongCall 代码

总结:使用错误的绘图/布局方法

优先级:6/10

严重性:错误

类别:正确性

自定义视图通常需要对其子级调用measure(),而不是on测量。onDraw、onLayout等同上。

  • 1.109 WrongConstant 代码

摘要:常量不正确

优先级:6/10

严重性:错误

类别:正确性

确保当方法中的参数只允许一组特定的常量,调用遵循这些规则。

  • 1.110 WrongManifestParent 全局配置文件

摘要:清单父级错误

优先级:6/10

严重程度:致命

类别:正确性

<uses-library>元素应定义为<application>标记下,而不是<manifest>标记或<activity>标记。类似地<uses-sdk>标记必须在根级别声明,依此类推

在清单中查找不正确的声明位置,并在元素位于错误的位置。

  • 1.111 WrongRegion 其他

摘要:可疑语言/地区组合

优先级:6/10

严重性:警告

类别:正确性

Android使用字母代码ISO 639-1作为语言,字母代码区域代码为ISO 3166-1。在许多情况下,语言代码和使用语言的国家是相同的,但也往往不是案例例如,虽然“se”指的是瑞典语的瑞典,但瑞典语的语言代码不是se(指的是北萨米语语言),语言代码是sv。类似地,sv的区域代码是El萨尔瓦多。

此lint检查查找可疑的语言和地区组合,以提供帮助发现您不小心使用了错误的语言或地区代码的情况。Lint知道一种语言最常见的地区,如果文件夹组合不是其中之一,它被标记为可疑。

然而,请注意,这可能不是一个错误:理论上你可以有扬声器在任何地区使用任何语言,并希望利用您的资源瞄准这一点,所以此检查旨在追踪可能的错误,而不是强制执行一组特定的地区和语言组合。

  • 1.112 WrongThread 代码

摘要:错误的线程

优先级:6/10

严重性:错误

类别:正确性

确保期望在特定线程上调用的方法

实际上是从那个线程调用的。例如,对小部件中的方法的调用应该始终在UI线程上进行。

  • 1.113 AppCompatResource 代码

摘要:Menu命名空间

优先级:5/10

严重性:错误

类别:正确性

使用appcompat库时,菜单资源应参考

应用程序中的showAsAction(或actionViewClass或actionProviderClass):命名空间,而不是android:命名空间。

类似地,当不使用appcompat库时,您应该使用android:showAsAction(或actionViewClass,或actionProviderClass)属性。

  • 1.114 DuplicateActivity 全局配置文件

摘要:活动注册了多次

优先级:5/10

严重程度:致命

类别:正确性

活动只应在清单中注册一次。如果是的话

意外注册不止一次,那么可能会发生细微的错误,因为

两个元素的属性声明没有合并,因此您可以

意外地删除了以前的声明。

  • 1.115 DuplicateUsesFeature 全局配置文件

摘要:功能声明了多次

优先级:5/10

严重性:警告

类别:正确性

给定的功能只能在清单中声明一次。

  • 1.116 FullBackupContent 全局配置文件

摘要:有效的完整备份内容文件

优先级:5/10

严重程度:致命

类别:正确性

确保由android:fullBackupContent属性在清单文件中是有效的

  • 1.117 IncludeLayoutParam 布局

摘要:包含时忽略布局参数

优先级:5/10

严重性:错误

类别:正确性

只有当您覆盖<include>标记上的layout_width和layout_height;否则他们将被忽略。

  • 1.118 InflateParams 布局

摘要:没有父级的布局膨胀

优先级:5/10

严重性:警告

类别:正确性

当展开布局时,避免将null作为父视图传递,否则,膨胀布局根上的任何布局参数都将忽略。

  • 1.119 InvalidVectorPath vector的xml

摘要:矢量路径无效

优先级:5/10

严重性:错误

类别:正确性

此检查可确保矢量路径有效。例如,它确保数字没有使用科学记数法(如1.0e3),这导致旧设备的运行时崩溃。作为另一个例子,它标记数字

比如.5,应该写为0.5,以避免在某些情况下棉花糖版本之前的设备崩溃。

  • 1.120 LogTagMismatch 代码

摘要:不匹配的日志标记

优先级:5/10

严重性:错误

类别:正确性

当使用Log.isLoggable(标记)保护Log.v(标记,…)调用时,通过对两个调用的标记应该相同。类似地,传入的级别Log.isLoggable通常应与Log调用的类型相匹配,例如,如果检查级别Log.DEBUG,对应的Log调用应该是Log.d,而不是Log.i。

  • 1.121 LongLogTag 代码

摘要:日志标记太长

优先级:5/10

严重性:错误

类别:正确性

日志标记最多只能有23个标记字符。

  • 1.122 ManifestOrder 全局配置文件

摘要:清单中元素的顺序不正确

优先级:5/10

严重性:警告

类别:正确性

<application>标记应该出现在声明哪个

您需要的版本、需要的功能、需要的库等等

在过去,有一些微妙的错误(例如主题没有得到

应用正确),当<application>标记出现在其中一些之前时

其他元素,因此最好在逻辑依赖项中对清单进行排序

  • 1.123 ManifestTypo 全局配置文件

摘要:清单标签中的打字

优先级:5/10

严重程度:致命

类别:正确性

此检查将查看清单,如果发现任何标签拼写错误,它们会被标记出来。

  • 1.124 MissingId 代码

摘要:片段应该指定一个id或标记

优先级:5/10

严重性:警告

类别:正确性

如果您没有在上指定android:id或android:tag属性<fragment>元素,则如果重新启动活动(例如方位旋转),您可能会失去状态。从片段文档来看:

“每个片段都需要一个唯一的标识符,系统可以使用该标识符进行恢复活动重新启动时的片段(以及可以用来捕获的片段执行事务(例如移除它)的片段。

*为android:id属性提供一个唯一的id。*为android:tag属性提供一个唯一的字符串。

如果您不提供前两项,系统将使用容器视图。

  • 1.125 NetworkSecurityConfig 全局配置文件

摘要:有效的网络安全配置文件

优先级:5/10

严重程度:致命

类别:正确性

确保<networksecurity-config>文件,该文件由android:networkSecurityConfig属性在清单文件中是有效的

  • 1.126 ProtectedPermissions 全局配置文件

摘要:使用系统应用程序权限

优先级:5/10

严重性:错误

类别:正确性

具有保护级别签名的权限,特权或signatureOrSystem仅授予系统应用程序。如果应用程序是常规应用程序、非系统应用程序,它将永远无法使用这些权限。

  • 1.127 SQLiteString 代码

摘要:使用STRING而不是TEXT

优先级:5/10

严重性:警告

类别:正确性

在SQLite中,任何列都可以存储任何数据类型;列的声明类型

更多的是关于数据在存储时应该转换为什么的提示。

存储字符串的方法有很多。TEXT、VARCHAR、CHARACTER和CLOB是字符串类型,但“string”不是。定义为STRING的列实际上是数字。

如果您试图将值存储在数字列中,SQLite将尝试将其强制转换为存储之前的浮点或整数。如果不能,它只会将其存储为一串

这可能会导致一些微妙的错误。例如,当SQLite遇到像1234567e1234这样的字符串,它会将其解析为浮点值,但结果是超出了浮点数字的范围,因此将存储Inf!类似地,看起来像整数的字符串将丢失前导零。

要解决此问题,您可以将架构更改为使用TEXT类型。

  • 1.128 StateListReachable  color或drawable的selector.xml

摘要:<选择器>中的不可访问状态

优先级:5/10

严重性:警告

类别:正确性

在选择器中,只有状态列表中的最后一个子级才应省略状态

合格者如果没有,则列表中的所有后续项目都将被忽略,因为

给定的项目将匹配所有项目。

  • 1.129 TestAppLink 全局配置文件

摘要:不匹配的URL

优先级:5/10

严重程度:致命

类别:正确性

使用一个或多个工具:验证testUrl=“some url”/>manifest允许检查intent筛选器中的链接属性matches。

  • 1.130 UnknownIdInLayout 布局

摘要:对不在当前布局中的id的引用

优先级:5/10

严重性:警告

类别:正确性

@+id/语法引用了一个现有的id,如果没有,则创建一个新的id

已经在其他地方进行了定义。然而,这意味着如果你在

您的引用,或者如果引用的视图不再存在,则不会得到

警告,因为id将按需创建。

这有时是故意的,例如,当你指的是一个视图时

其通过include以不同的布局提供。然而,通常

出现拼写错误或在未更新的情况下重命名视图的事故

所有对它的引用。

  • 1.131 UnlocalizedSms 代码

摘要:短信电话号码缺少国家/地区代码

优先级:5/10

严重性:警告

类别:正确性

短信目的地号码必须以国家/地区代码或应用程序代码开头

必须确保只有当用户所在的国家/地区与

接收器。

  • 1.132 ValidActionsXml xml文件

摘要:无效的操作描述符

优先级:5/10

严重程度:致命

类别:正确性

确保操作XML文件的格式正确

  • 1.133 ValidRestrictions xml文件

摘要:无效的限制描述符

优先级:5/10

严重程度:致命

类别:正确性

确保应用程序限制XML文件的格式正确

  • 1.134 VectorDrawableCompat 全局配置文件和xml

摘要:使用VectorDrawableCompat

优先级:5/10

严重性:错误

类别:正确性

要使用VectorDrawableCompat,您首先需要对项目设置android.defaultConfig.vectorDrawables.useSupportLibrary=在build.gradle文件中为true,其次,使用app:srcCompat而不是android:src指代向量可绘制内容。

  • 1.135 VectorRaster 资源

摘要:矢量图像生成

优先级:5/10

严重性:警告

类别:正确性

矢量图标需要API 21或API 24,具体取决于所使用的功能,

但当minSdkVersion小于21或24,Android Gradle插件1.4或更高版本使用时,放置在可绘制文件夹中的矢量可绘制文件将自动移动生成drawable-andypi-v21或drawable-adypi-v24和位图图像用于不同的屏幕分辨率以实现向后兼容性。

然而,这种光栅图像生成有一些限制lint检查标记不完全支持的元素和属性。你应该手动检查生成的输出是否可接受

  • 1.136 AppCompatCustomView 代码

摘要:Appcompat自定义小工具

优先级:4/10

严重性:错误

类别:正确性

为了支持着色等功能,appcompat库将自动加载内置小部件的特殊appcompat替换。

但是,这不适用于您自己的自定义视图。

与其直接扩展android.widget类,不如改为扩展android.support.v7.widget.AppCompat中的一个委托类。

  • 1.137 AppIndexingService 代码

摘要:应用程序索引后台服务

优先级:4/10

严重性:警告

类别:正确性

针对Android 8.0或更高版本的应用程序不能再依赖后台服务

同时侦听设备上索引的更新。使用BroadcastReceiverUPDATE_INDEX意图继续支持您的应用程序中的索引。

  • 1.138 EllipsizeMaxLines 布局

摘要:Ellipseize和Maxlines相结合

优先级:4/10

严重性:错误

类别:正确性

将ellipseize和maxLines=1组合在一起可能会导致某些设备崩溃。早期版本的lint建议将singleLine=true替换为maxLines=1但在使用省略号时不应该这样做。

  • 1.139 GradleDependency gradle配置

摘要:过时的渐变Gradle关系

优先级:4/10

严重性:警告

类别:正确

此检测器查找您正在使用的版本所在的库的使用情况

而不是当前的稳定释放。使用旧版本是可以的,并且有在某些情况下,您故意想使用旧版本。然而,你可能只是不知道有更新的版本,可用这个lint检查有助于找到什么。

  • 1.140 GradleDynamicVersion gradle配置

摘要:Gradle动态版本

优先级:4/10

严重性:警告

类别:正确性

在依赖项中使用+可以自动获取最新可用的版本,而不是特定的命名版本。然而,这不是推荐的;您的构建是不可重复的;你可能已经用与构建服务器使用的版本略有不同。(使用动态作为主要版本号的版本比在次要版本位置。)

  • 1.141 GradleIdeError gradle配置

摘要:GradleIDE支持问题

优先级:4/10

严重性:错误

类别:正确性

Gradle非常灵活,在Gradle文件中可以做一些事情,这可能会使IDE很难或不可能正确处理项目。此lint检查查找可能破坏IDE支持的结构。

  • 1.142 GradleOverrides gradle配置

摘要:值被Gradle生成脚本覆盖

优先级:4/10

严重性:警告

类别:正确性

(例如)minSdkVersion的值仅在未指定的情况下使用在build.gradle构建脚本中。当在Gradle构建脚本中指定时,清单值被忽略,可能会产生误导,因此应将其删除避免歧义。

  • 1.143 GradlePath gradle配置

摘要:渐变路径问题

优先级:4/10

严重性:警告

类别:正确性

Gradle构建脚本是跨平台的,因此文件路径使用Unix风格的路径分隔符(正斜杠)而不是Windows路径分隔符(反斜杠)。同样为了保持项目的可移植性和可重复性,避免在系统上使用绝对路径;将文件保留在项目中

相反要在项目之间共享代码,请考虑创建一个android库以及对AAR的依赖

  • 1.144 GridLayout 布局

摘要:GridLayout验证

优先级:4/10

严重程度:致命

类别:正确性

声明超出声明大小的layout_row或layout_column

GridLayout的rowCount或columnCount的错误通常是无意的错误。

  • 1.145 InOrMmUsage 布局

摘要:使用mm或尺寸

优先级:4/10

严重性:警告

类别:正确性

避免使用毫米或英寸作为尺寸单位。虽然它原则上应该工作,但不幸的是,许多设备没有报告正确的真实物理密度,这意味着尺寸计算无法正常工作。您最好使用dp(对于字体大小,请使用sp)。

  • 1.146 ObjectAnimatorBinding 代码

摘要:ObjectAnimationr属性不正确

优先级:4/10

严重性:错误

类别:正确性

此检查交叉引用String从中引用的ObjectAnimator和PropertyValuesHolder方法调用并确保相应的setter方法存在并且具有正确的签名。

  • 1.147 RestrictedApi 代码

摘要:受限API

优先级:4/10

严重性:错误

类别:正确性

此API已被标记为具有尚未满足的限制。

API限制示例:*方法只能由子类调用 *方法只能从同一个库(由gradle库组id)*方法只能从测试中访问。

您可以使用@RestrictTo注释添加自己的API限制。

  • 1.149 WrongCase 布局

摘要:视图标记的情况错误

优先级:4/10

严重程度:致命

类别:正确性

大多数布局标记,如<Button>,都引用了实际的视图类,开头大写。然而,也有例外,如<fragment>和<include>。此lint检查查找不正确的大写字母。

  • 1.151 ExtraText 资源

摘要:资源文件中的多余文本

优先级:3/10

严重性:警告

类别:正确性

布局资源文件应仅包含元素和属性。任何XML在文件中发现的文本内容很可能是偶然的(并且有潜在的危险如果文本类似于XML,并且开发人员认为文本是功能性)

  • 1.152 InnerclassSeparator 全局配置文件

摘要:内部类应该使用$而不是。

优先级:3/10

严重性:警告

类别:正确性

在清单文件中引用内部类时,必须改用“$”作为分隔符,即Outer$Inner而不是Outer.Inner。(如果您收到一个实际上不是内部类的类的警告,这是因为您在包名称中使用了大写字符,即不是常规的。)

  • 1.153 InvalidNavigation jetpack中navagation的graph.xml

摘要:未指定起始目的地

优先级:3/10

严重性:警告

类别:正确性

所有<navigation>元素都必须指定开始目的地,并且必须是<navigation>的直接子级。

  • 1.154 LocalSuppress 代码

摘要:@SuppressLint针对无效元素

优先级:3/10

严重性:错误

类别:正确性

@SuppressAnnotation用于抑制Java文件中的Lint警告。

然而,尽管许多lint检查都会分析Java源代码,但它们可以查找(例如)局部变量的注释,一些检查正在分析.class文件。在类文件中,注释只出现在类上,字段和方法。放置在局部变量上的注释将消失。如果你尝试为基于类文件的lint检查抑制lint错误

禁止注释无效。必须将注释移出到周围方法。

  • 1.155 ParcelClassLoader 代码

摘要:默认包裹类加载器

优先级:3/10

严重性:警告

类别:正确性

Parcel#readParcelable(ClassLoader)的文档(及其变体)表示您可以传入null来获取默认的类加载器。然而ClassLoader是一个系统类加载器,无法在您自己的应用程序中找到类。

如果您正在将自己的类写入Parcel(而不仅仅是像这样的SDK类字符串等等),那么您应该为您的应用程序提供一个ClassLoader,一个简单的方法就是打电话从您自己的类中获取getClass().getClassLoader()。

  • 1.156 ParcelCreator 代码

摘要:缺少Parcelable CREATOR字段

优先级:3/10

严重性:错误

类别:正确性

根据Parcelable接口文档,“实现Parcelable接口还必须有一个名为CREATOR的静态字段,该字段是实现Parcelable.Creator接口的对象。"

  • 1.157 ProguardSplit 混淆文件

摘要:Proguard.cfg文件包含通用的Android规则

优先级:3/10

严重性:警告

类别:正确性

早期版本的Android工具捆绑了一个单独的proguard.cfg文件包含适用于Android瘦身和混淆。然而,该版本被复制到了新项目中,这意味着随着我们改进默认的ProGuard,它不会继续更新Android的规则。

在新版本的工具中,我们将ProGuard配置拆分为两半:

*一个仅包含项目特定标志的简单配置文件,位于项目

*一个通用配置文件,包含一组推荐的ProGuard

Android项目的选项。此通用文件位于SDK安装中

目录,这意味着它会随着工具一起更新。

为了使其正常工作

project.properties文件现在引用一个路径,因此您可以同时引用

通用文件以及您自己的文件(以及任何其他文件)。要将项目迁移到新设置,请创建一个新的proguard-project.txt

项目中包含任何特定于项目的ProGuard标志的文件,以及

进行任何自定义,然后将project.properties文件更新为

包含:proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt文件

  • 1.158 ShiftFlags 代码

摘要:危险标记的常数声明

优先级:3/10

严重性:警告

类别:正确性

当定义多个常量用于标志时,建议的样式是使用形式1<<2、1<<3、1<<4,依此类推,以确保常数唯一且不重叠。

  • 1.159 SpUsage 布局和代码

总结:使用dp而不是sp来表示文本大小

优先级:3/10

严重性:警告

类别:正确性

设置文本大小时,通常应使用sp或“比例无关”像素”。这与dp单位类似,但也会根据用户的字体进行缩放尺寸偏好。建议您在指定字体大小时使用此单位,因此它们将根据屏幕密度和用户的偏爱

在某些情况下,您可能需要使用dp;通常情况下文本位于具有特定dp大小的容器中。这将阻止文本防止溢出到容器外。但请注意,这意味着用户的字体大小设置不受尊重,因此请考虑调整布局其本身更加灵活。

  • 1.160 SwitchIntDef 代码

摘要:Switch缺少@IntDef

优先级:3/10

严重性:警告

类别:正确性

如果switch语句没有显式包含所有由typedef@IntDef声明声明的值。

  • 1.161 UniqueConstants 代码

摘要:重叠枚举常量

优先级:3/10

严重性:错误

类别:正确性

@IntDef注释允许您创建轻量级的“枚举”或类型释义但是,可能会意外地为指定相同的两个或多个值,这可能导致难以检测的错误。这个将

查找此场景并标记任何重复的常量。

在某些情况下,重复的常量是有意的(例如,重命名常量转换为更直观的名称,并保留旧名称兼容性目的)。在这种情况下,只需通过添加@SuppressLint(“UniqueConstants”)注释。

  • 1.162 Deprecated 代码

摘要:使用不推荐使用的API

优先级:2/10

严重性:警告

类别:正确性

不推荐使用的视图、属性等都不推荐使用,因为存在更好方法。用新的方式去做。你已经被警告了。

  • 1.163 MissingVersion 全局配置文件和gragle配置

摘要:缺少应用程序名称/版本

优先级:2/10

严重性:警告

类别:正确性

您应该定义应用程序的版本信息。android:versionCode:一个整数值,表示应用程序代码,相对于其他版本。

android:versionName:一个字符串值,表示应用程序代码,因为它应该显示给用户。

  • 1.164 Orientation 布局

摘要:缺少明确的屏幕方向

优先级:2/10

严重性:错误

类别:正确性

LinearLayout的默认方向是水平的。这很容易相信布局是垂直的,在其中添加多个子项,并感到惊讶

为什么只有第一个子项可见(当后续子项关闭时屏幕右侧)。此lint规则通过警告帮助确定此问题

每当LinearLayout与隐式方向和多个View它还检查没有方向属性的空LinearLayouts还定义了一个id属性。这捕捉到了孩子们会可以动态添加到LinearLayout中。

  • 1.165 PxUsage 代码和布局

摘要:使用“px”维度

优先级:2/10

严重性:警告

类别:正确性

出于性能原因和保持代码更简单的原因,Android系统使用像素作为表示尺寸或坐标值的标准单位。

这意味着视图的维度总是在代码中表示使用像素,但始终基于当前屏幕密度。例如,如果

myView.getWidth()返回10,视图在当前屏幕,但在具有更高密度屏幕的设备上,返回的值可能是15。如果在应用程序代码中使用像素值来处理位图

没有针对当前屏幕密度进行预缩放,您可能需要缩放代码中使用的像素值,以匹配未缩放的位图来源

  • 1.166 SupportAnnotationUsage 代码

总结:不正确的支持注释用法

优先级:2/10

严重性:错误

类别:正确性

此lint检查确保支持注释(如@IntDef和@ColorInt)正确使用。例如,指定@IntRange,其中from值高于to值。

  • 1.167 NewApi 代码

摘要:在旧版本上调用新方法

优先级:6/10

严重性:错误

类别:正确性

此检查扫描应用程序中的所有Android API调用

警告任何调用,这些调用不是在此目标的所有版本上都可用

应用程序(根据清单中的最小SDK属性)。

如果你真的想使用这个API并且不需要支持旧的设备

只需在build.gradle或AndroidManifest.xml文件中设置minSdkVersion即可。

如果您的代码有意访问更新的API,并且您已经确保(例如。

具有条件执行),该代码将只在

支持的平台,然后您可以使用

@TargetApi注释指定要应用的本地最低SDK,例如

@TargetApi(11),因此此检查考虑的是11而不是您的清单

文件的最低SDK作为所需的API级别。

如果您有意在样式定义中设置android:属性,请制作

请确保将其放在values vNN文件夹中,以避免遇到

制造商添加了自定义的某些设备上的运行时冲突

id与以后平台上的新id冲突的属性。

类似地,您可以在XML文件中使用工具:targetApi=“11”来指示

该元素将仅在适当的上下文中被膨胀。

----------------------------------------------------------------------------------------------------------------

2、CorrectnessMessages 更正信息方面

  • 2.1 StringEscaping 代码

摘要:无效的字符串转义

优先级:9/10

严重性:错误

类别:正确性:消息

除非撇号(')出现在本身用双引号转义的字符串(“)。

  • 2.2 StringFormatInvalid 代码

摘要:无效的格式字符串

优先级:9/10

严重性:错误

类别:正确性:消息

如果字符串包含“%”字符,则该字符串可能是格式化字符串

将从Java代码传递到string.format以替换每个字符串的字符串

具有特定值的“%”出现。

此lint警告检查是否存在两个相关问题:

(1) 格式化无效的字符串,这意味着String.format将抛出

在运行时尝试使用格式字符串时出现异常。

(2) 包含不是格式化字符串的“%”的字符串正在传递给

字符串格式调用。在这种情况下,需要将“%”转义为“%%”。

注意:并非所有看起来像格式化字符串的字符串都适用

按字符串格式;例如,它们可能包含用于android.text.format.Time#format().Lint不能总是弄清楚字符串是一种日期格式,因此在这些情况下可能会收到错误的警告。请参阅有关如何在这种情况下抑制错误的信息,请参阅抑制帮助主题。

  • 2.3 StringFormatMatches 代码

摘要:String.format字符串与XML格式字符串不匹配

优先级:9/10

严重性:错误

类别:正确性:消息

这种皮棉检查可确保以下内容:

(1) 如果格式字符串有多个翻译,则所有

翻译对相同编号的参数使用相同的类型

(2) Java中格式字符串的使用与格式一致

字符串,这意味着传递给string.format的参数类型与

在格式字符串中。

  • 2.4 MissingQuantity 布局

摘要:缺少数量翻译

优先级:8/10

严重性:错误

类别:正确性:消息

不同的语言有不同的语法一致性规则

例如,在英语中,数量1是一个特例。我们写作“1本书”,但对于任何其他数量,我们都会写“n本书”。这种区别单数和复数之间很常见,但其他语言会做得更好区别。

这个lint检查查看<复数>的每个翻译,并确保给定语言所考虑的所有数量字符串都是由这个提供的翻译

例如,英文翻译必须为quantity=“one”提供一个字符串。

同样,捷克语翻译必须为quantity=“few”提供一个字符串。

  • 2.5 MissingTranslation xml

摘要:翻译不完整

优先级:8/10

严重性:错误

类别:正确性:消息

如果一个应用程序有多个区域设置,那么在中声明的所有字符串

一种语言也应该翻译成所有其他语言。

如果不应该翻译字符串,可以添加属性translateable=“false”在<string>元素上,或者您可以定义一个名为donottranslate.xml的资源文件中的不可翻译字符串。或者可以使用工具忽略该问题:ignore=“MissingTranslation”属性。

您可以告诉lint(和其他工具)哪种语言是中的默认语言通过为根指定工具:locale=“languageCode”资源文件中的<resources>元素。(工具前缀指的是命名空间声明http://schemas.android.com/tools.)

  • 2.6 Typos 代码

摘要:拼写错误

优先级:7/10

严重性:警告

类别:正确性:消息

此检查检查字符串定义,如果发现任何单词看起来像是拼写错误的,它们会被标记出来。

  • 2.7 ExtraTranslation 字符串xml

摘要:额外翻译

优先级:6/10

严重程度:致命

类别:正确性:消息

如果字符串出现在特定语言的翻译文件中,但没有默认区域设置中的相应字符串,则此字符串可能是未使用。(从技术上讲,您的申请可能仅用于在特定的区域设置中运行,但提供回退仍然是一个好主意。)

请注意,如果在任何语言环境没有提供翻译,所以清理它们很重要。

  • 2.8 Untranslatable 字符串xml

摘要:翻译不可译

优先级:6/10

严重性:警告

类别:正确性:消息

字符串可以标记为translateable=false,以表明它们不是打算翻译,但存在于其他的资源文件中

(例如,非显示字符串应因其他原因而有所不同诸如屏幕大小或API级别的配置限定符)。

在有些情况下,翻译人员无论如何都会意外地翻译这些字符串,并且lint将通过该lint检查来标记这些事件。

  • 2.9 ImpliedQuantity 字符串xml

摘要:隐含数量

优先级:5/10

严重性:错误

类别:正确性:消息

复数字符串通常应包括%s或%d格式参数。在里面在像英语这样的地区,一个数量只适用于一个值1,但是

并非所有地方都是这样。例如,在斯洛文尼亚语中,一个数量将适用于1101201301等等。类似地,也有一些地方多个值与零和两个量相匹配。

在这些区域设置中,如果消息没有包含格式参数(如“%d”),因为它将无法从中清除数量字符串所描述的语法。

  • 2.10 PluralsCandidate 字符串xml

摘要:潜在复数

优先级:5/10

严重性:警告

类别:正确性:消息

此lint检查查找国际化中的潜在错误

翻译了一条涉及数量的信息,它看起来像字符串的某些部分可能需要更改语法。

例如,与其这样:

<string name=“try_again”>请在%d秒后重试</字符串>

你应该使用复数:

<plurals name=“try_again”>

    <item quantity=“one”>%d秒后重试</item>

    <item quantity=“other”>%d秒后重试</item>

</plurals>

这将确保其他语言的正确翻译为不同的数量类别提供。

(此检查取决于一些启发式方法,因此可能无法准确确定字符串是否真的应该是一个量。可以使用工具:忽略到过滤掉假阳性。

  • 2.11 StringFormatCount 字符串xml

摘要:格式化参数类型不完整或不一致

优先级:5/10

严重性:警告

类别:正确性:消息

当格式化字符串接受参数时,通常需要引用

所有翻译中的参数相同(如果没有,则为所有参数翻译)。

有些情况并非如此,所以这个问题是一个警告而不是默认情况下的错误。然而,当一种语言不是正确翻译或更新。

  • 2.12 UnusedQuantity 代码

摘要:未使用的数量翻译

优先级:3/10

严重性:警告

类别:正确性:消息

Android定义了许多不同的数量字符串,如零、一、几个

还有很多。然而,许多语言在语法上并不区分所有语言

这些不同的数量。

此lint检查查看为每个翻译和标记任何未使用的数量字符串(因为该语言不生成数量上的区别,因此Android不会查找)。

例如,在中文中,只使用其他数量,所以即使你提供零和一的翻译,当调用getQuantityString(),即使使用0或1也是如此。

----------------------------------------------------------------------------------------------------------------

3、Security 安全性方面

  • 3.1 AddJavascriptInterface 代码

摘要:调用了addJavascriptInterface

优先级:9/10

严重性:警告

类别:安全

对于为低于17的API级别构建的应用程序,WebView#addJavascriptInterface

由于目标网页上的JavaScript具有使用反射访问注入对象的公共字段的能力,以及从而以非故意的方式操纵主机应用程序。

  • 3.2 DeletedProvider 代码

摘要:使用已删除的Provider

优先级:9/10

严重性:错误

类别:安全

加密货币提供商已在Android P中完全删除(并且在早期版本中已弃用)。这意味着代码将抛出NoSuchProviderException,应用程序将崩溃。即使代码捕捉到了

更高级别的异常,这是不安全的,不应该使用。

  • 3.3 DeprecatedProvider 代码

摘要:使用BC提供程序

优先级:9/10

严重性:警告

类别:安全

BC提供程序已被弃用,将不会在以下情况下提供targetSdkVersion为P或更高版本。

  • 3.4 GetInstance 代码

摘要:带有ECB的Cipher.getInstance

优先级:9/10

严重性:警告

类别:安全

无论是否使用ECB作为密码模式,都不应调用密码#getInstance设置密码模式,因为android上的默认模式是ECB,即缺乏信心的

  • 3.5 SecureRandom 代码

摘要:使用SecureRondom的固定种子

优先级:9/10

严重性:警告

类别:安全

指定固定种子将导致实例返回可预测的数字序列。这可能对测试有用,但不合适以确保安全使用。

  • 3.6 ExportedPreferenceActivity 全局配置文件

摘要:首选项活动不应导出  第一个Activity不建议export=true

优先级:8/10

严重性:警告

类别:安全

片段注入给任何可以发送偏好活动的人一个意向

在您的过程中加载任何片段和任何参数的能力。

  • 3.7 JavascriptInterface 代码          

摘要:方法上缺少@JavascriptInterface

优先级:8/10

严重性:错误

类别:安全

从API 17开始,您必须在向addJavascriptInterface方法,带有@JavascriptInterface注释。

  • 3.8 PackageManagerGetSignatures

不要引用多个秘钥

  • 3.9 PackagedPrivateKey

秘钥不要打包

  • 3.10 GrantAllUris 全局配置文件

摘要:内容提供商共享所有内容

优先级:7/10

严重性:警告

类别:安全

<grant uri permission>元素允许共享特定的路径。这检测器检查路径URL是否只有“/”(所有内容),这可能不是你想要什么;您应该限制对子集的访问。

  • 3.11 AllowAllHostnameVerifier 代码

摘要:主机名验证程序不安全

优先级:6/10

严重性:警告

类别:安全

此检查查找其验证的HostnameVerifier实现的使用总是返回true(因此信任任何主机名),这可能导致信任TLS/SSL中的任意主机名导致的不安全网络流量同行提供的证书。

  • 3.12 AuthLeak 代码

总结:代码可能包含身份验证泄漏

优先级:6/10

严重性:警告

类别:安全

java应用程序中的字符串可以通过反编译应用程序来发现,这个lint检查可能包含带有用户名和暗语

  • 3.13 BadHostnameVerifier 代码

摘要:主机名验证程序不安全

优先级:6/10

严重性:警告

类别:安全

此检查查找验证方法为HostnameVerifier的实现总是返回true(因此信任任何主机名),这可能导致信任TLS/SSL中的任意主机名导致的不安全网络流量同行提供的证书。

  • 3.14 HardwareIds 代码

摘要:硬件Id使用情况

优先级:6/10

严重性:警告

类别:安全

除了高值之外,不建议使用这些设备标识符欺诈预防和高级电话使用案例。对于广告使用情况,使用AdvertisingIdClient$Info#getId,对于分析,使用InstanceId#getId。

  • 3.15 SSLCertificateSocketFactoryCreateSocket 代码

摘要:对SSLCertificateSocketFactory.createSocket()的不安全调用

优先级:6/10

严重性:警告

类别:安全

使用InetAddress调用SSLCertificateSocketFactory.createSocket()时作为第一个参数,不执行TLS/SSL主机名验证,这可能导致由于信任任意对等方提供的TLS/SSL证书中的主机名。在这种情况下,开发人员必须确保根据

通过其他方式颁发证书,例如通过调用`SSLCertificateSocketFactory.getDefaultHostnameVerifier()以获取HostnameVerifier并调用HostnameVerifier.verify()。

  • 3.16 SSLCertificateSocketFactoryGetInsecure 代码

摘要:调用SSLCertificateSocketFactory.getInsecure()

优先级:6/10

严重性:警告

类别:安全

SSLCertificateSocketFactory.getInsecure()方法返回SSLSocketFactory禁用了所有TLS/SSL安全检查,这可能导致由于信任任意TLS/SSL证书而导致的不安全网络流量由同行介绍。除非特殊情况需要,否则应避免使用此方法

诸如调试之类的环境。应使用SSLCertificateSocketFactory.getDefault()。

  • 3.17 SetJavaScriptEnabled 代码

摘要:使用setJavaScriptEnabled

优先级:6/10

严重性:警告

类别:安全

如果您不确定您的应用程序确实需要JavaScript支持。

  • 3.18 SetWorldReadable 代码

摘要:File.setReadable()用于使文件世界可读

优先级:6/10

严重性:警告

类别:安全

将文件设置为世界可读是非常危险的,并且可能会导致安全问题

应用程序中的漏洞。强烈反对;相反,应用程序应该使用更正式的机制进行交互,例如ContentProvider,广播接收机和服务。

  • 3.19 SetWorldWritable 代码

摘要:File.setWritable()用于使文件世界可写

优先级:6/10

严重性:警告

类别:安全

将文件设置为全局可写是非常危险的,并且可能会导致安全问题

应用程序中的漏洞。强烈反对;相反,应用程序应该使用更正式的机制进行交互,例如ContentProvider,广播接收机和服务。

  • 3.20 TrustAllX509TrustManager 代码

摘要:不安全的TLS/SSL信任管理器

优先级:6/10

严重性:警告

类别:安全

此检查查找其checkServerTrusted的X509TrustManager实现或checkClientTrusted方法不执行任何操作(因此信任任何证书链)

这可能会导致由于信任任意对等方提供的TLS/SSL证书。

  • 3.21 UnprotectedSMSBroadcastReceiver 代码

摘要:未受保护的SMS广播接收器

优先级:6/10

严重性:警告

类别:安全

为SMS_DELIVER或CEIVED必须确保呼叫者具有BROADCAST_SMS权限,否则,恶意行为者就有可能伪造意图。

  • 3.22 UnsafeProtectedBroadcastReceiver 代码

摘要:不安全保护的BroadcastReceiver

优先级:6/10

严重性:警告

类别:安全

声明受保护广播的意图筛选器的BroadcastReceiver操作字符串必须检查接收到的意向的操作字符串是否与预期值,否则恶意行为者可能进行欺骗

  • 3.23 UseCheckPermission 代码

摘要:使用检查权限调用的结果

优先级:6/10

严重性:警告

类别:安全

您通常希望使用检查权限的结果;返回是否持有该权限;有权限再去作相应操作。

  • 3.24 UsingHttp 代码

摘要:使用HTTP而不是HTTPS

优先级:6/10

严重性:警告

类别:安全

Gradle Wrapper既可以通过HTTP也可以通过HTTPS使用。HTTPS更安全因为它可以防止中间人的攻击等。旧项目在Android Studio中创建时使用了HTTP,但我们现在默认为HTTPS,并建议升级现有项目。

  • 3.25 ExportedContentProvider 全局配置文件

摘要:内容提供商不需要权限

优先级:5/10

严重性:警告

类别:安全

默认情况下导出内容提供程序,并导出系统上的任何应用程序

可以潜在地使用它们来读取和写入数据。如果内容提供商提供对敏感数据的访问,应通过指定export在清单中为false,或者通过使用可以授予其他申请。

  • 3.26 ExportedReceiver 全局配置文件和代码

摘要:接收者不需要权限

优先级:5/10

严重性:警告

类别:安全

导出的receivers (将export设置为true或包含intent-fillter和不指定exported=false)应定义为了启动receivers 或绑定到receivers 而必须具有的权限实体。

没有这个,任何应用程序都可以使用这个receivers 。

  • 3.27 ExportedService 全局配置文件和代码

摘要:导出的服务不需要权限

优先级:5/10

严重性:警告

类别:安全

导出的服务(将Exported设置为true或包含intent筛选器和不指定exported=false)应定义为了启动服务或绑定到服务而必须具有的

权限实体,如果没有,任何应用程序都可以使用此服务。

  • 3.28 HardcodedDebugMode 全局配置文件

摘要:android的硬编码值:清单中的Debug模式

优先级:5/10

严重程度:致命

类别:安全

最好在清单中去掉android:debuggable。如果

如果你这样做了,那么当构建APK以在模拟器或设备上进行调试。当你发布版本,例如导出APK,它会自动将其设置为false。

另一方面,如果您在清单文件中指定了一个特定的值,那么工具将始终使用它。这可能会导致意外发布您的带有调试信息的应用程序。

  • 3.29 InvalidPermission 代码

摘要:权限属性无效

优先级:5/10

严重性:错误

类别:安全

并非所有元素都支持权限属性。如果在上设置了一个无效的权限,它是一个no-op并被忽略。确保此权限在正确的元素上设置了属性,以保护正确的组件。

  • 3.30 UnsafeDynamicallyLoadedCode 代码

摘要:用于动态加载代码的加载

优先级:4/10

严重性:警告

类别:安全

从应用程序库以外的位置动态加载代码目录或Android平台的内置库目录是危险的,

因为代码被篡改的风险增加了。

应用程序应尽可能使用loadLibrary,它提供了确保从这些更安全的位置之一加载库。应用程序开发人员应该使用他们开发的功能将应用程序本机库放置到的lib目录中的环境他们编译的APK。

  • 3.31 UnsafeNativeCodeLocation 代码

摘要:库目录外的Native代码

优先级:4/10

严重性:警告

类别:安全

一般来说,应用程序本机代码应该只放在应用程序的库目录,而不是在其他位置,如res或assets目录。将代码放在库目录:

保证代码在应用后不会被篡改

安装应用程序开发人员应将应用程序本机库放入库的开发环境

他们编译的APK的目录。嵌入本机非共享库应尽可能避免将可执行文件写入应用程序。

  • 3.32 WorldReadableFiles 代码

摘要:openFileOutput()或类似调用传递MODE_WORLD_READABLE

优先级:4/10

严重性:警告

类别:安全

在某些情况下,应用程序编写全局可读文件是合适的,但应仔细审查这些文件,以确保

不包含泄露给其他应用程序的私人数据。

  • 3.33 WorldWriteableFiles 代码

摘要:openFileOutput()或类似调用传递MODE_WORLD_WRITEABLE

优先级:4/10

严重性:警告

类别:安全

在某些情况下,应用程序编写world是合适的可写文件,但应仔细检查这些文件,以确保不包含私人数据,并且如果文件被恶意软件修改应用程序—它不会欺骗或损害您的应用程序。

  • 3.34 ProxyPassword 代码

摘要:明文中的代理密码

优先级:2/10

严重性:警告

类别:安全

如果此文件是通过版本控制共享。如果这是故意的,或者这是真正的私人行为项目,取消显示此警告。

----------------------------------------------------------------------------------------------------------------

4、Performance 性能方面

  • 4.1 DrawAllocation 代码

摘要:图形代码中的内存分配

优先级:9/10

严重性:警告

类别:性能

应避免在图形或布局操作期间分配对象。

这些都是频繁调用的,因此平滑的UI可能会被对象分配导致的GC打断。

通常处理这种情况的方法是预先分配所需的对象并在每次绘图操作中重复使用它们。

有些方法代表您分配内存(如Bitmap.create)应该以同样的方式处理。

  • 4.2 Wakelock 代码

摘要:WakeLock使用不正确

优先级:9/10

严重性:警告

类别:性能

未能正确释放唤醒锁可能会使Android设备处于高电源模式,这会缩短电池寿命。造成这种情况的原因有几个,例如

由于在onDestroy()中而不是在onPause()中释放唤醒锁,未能

在acquire()之后的所有可能的代码路径中调用release(),依此类推。

注意:如果您使用锁只是为了保持屏幕打开,您应该强烈考虑改用FLAG_KEEP_SCREEN_ON。此窗口标志将

当用户在应用程序和不需要特别许可。看见http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_KEEP_SCREEN_ON。

  • 4.3 WakelockTimeout 代码

摘要:使用wakeLock而不超时

优先级:9/10

严重性:警告

类别:性能

Wakelocks有两种获取方法:一种有超时,另一种没有。你通常应该总是使用有超时的。典型的超时为10分钟

如果任务所花费的时间比它发生的关键时间长(即。不能使用JobScheduler),那么也许他们应该考虑前台服务(这是一个更强的运行保证,让用户知道一些事情

长期/重要的事情正在发生)。

  • 4.4 Recycle 代码

摘要:缺少recycle()调用

优先级:7/10

严重性:警告

类别:性能

许多资源,如TypedArrays、VelocityTrackers等,应该使用后回收(使用recycle()调用)。此皮棉检查是否丢失recycle()调用。

  • 4.5 ObsoleteLayoutParam 代码

摘要:过时的布局参数

优先级:6/10

严重性:警告

类别:性能

给定的layout_param不是为给定的布局定义的

  • 4.6 ObsoleteSdkInt 代码和资源

摘要:过时的SDK_INT版本检查

优先级:6/10

严重性:警告

类别:性能

此检查标记不必要的版本检查,因为

minSdkVersion(或周围已知的API级别)已经至少高达

检查的版本。

同样,它也在-vNN文件夹中查找资源,例如values-v14

其中,版本限定符小于或等于minSdkVersion,其中

内容应该合并到最佳文件夹中。

  • 4.7 StaticFieldLeak 代码

摘要:静态现场泄漏

优先级:6/10

严重性:警告

类别:性能

静态字段将泄漏上下文。

非静态内部类具有对其外部类的隐式引用。

例如,外部类是Fragment或Activity,那么这个引用意味着长时间运行的处理程序/加载程序/任务将保存对阻止其收集垃圾的活动。

类似地,对这些活动和片段的直接引用运行时间较长的实例可能会导致泄漏。

ViewModel类不应指向视图或非应用程序上下文。

  • 4.8 UseCompoundDrawables 代码

摘要:节点可以替换为具有复合可绘制内容的TextView

优先级:6/10

严重性:警告

类别:性能

包含ImageView和TextView的LinearLayout可以更有效地作为复合可绘制(单个TextView,使用drawableTop、drawableLeft、drawaableRight和/或drawableBottom属性绘制与文本相邻的一个或多个图像)。

如果这两个窗口小部件之间有边距偏移,则可以替换为drawablePadding属性。

有一个lint快速修复程序可以在Eclipse插件中执行此转换。

  • 4.9 ViewTag 代码

摘要:标记的对象泄漏

优先级:6/10

严重性:警告

类别:性能

在Android 4.0之前,View.setTag(int,Object)的实现将

将对象存储在一个静态映射中,其中的值被强烈引用。

这意味着,如果对象包含任何指向上下文,上下文(指向几乎所有其他内容)将泄漏。

如果传递视图,该视图将提供对创建的上下文的引用

类似地,视图持有者通常包含一个视图,而光标有时也与视图相关联。

  • 4.10 VectorPath vector xml

摘要:长矢量路径

优先级:5/10

严重性:警告

类别:性能

使用长矢量路径对性能不利。有几种方法可以制作

路径数据较短:*使用较少的精度*删除一些次要细节*使用Android Studio矢量转换工具*光栅化图像(转换为PNG)

  • 4.11 ViewHolder 代码

摘要:ViewHolder候选人

优先级:5/10

严重性:警告

类别:性能

在实现视图适配器时,应避免无条件地创建新布局;如果传递了一个可用的项以供重用,则应该尝试使用取而代之的是那个。这有助于例如ListView滚动更光滑。

  • 4.12 AnimatorKeep 代码

摘要:动画财产缺少@Keep

优先级:4/10

严重性:警告

类别:性能

使用属性动画时,可以通过反射访问财产。

这些方法应该用@Keep进行注释,以确保在发布生成时,这些方法不会被视为未使用和已删除,或者

仅作为内部处理,并将其重命名为较短的名称。该检查还将标记它遇到的其他潜在反射问题,例如缺少属性、参数类型错误等。

  • 4.13 DuplicateDivider 代码

摘要:不必要的分隔符Copy,直接用系统的

优先级:4/10

严重性:警告

类别:性能

旧版本的RecyclerView库不包括分隔符decorator,但在支持演示中提供了一个示例。这个分隔器类已被广泛复制/粘贴到各种项目中。

在最新版本的支持库中,分隔符decorator现在是包括在内,因此您可以将自定义副本替换为“内置”版本,android.support.v7.widget.DividerItemDecoration。

  • 4.14 HandlerLeak 代码

摘要:Handler参考泄漏

优先级:4/10

严重性:警告

类别:性能

由于此Handler被声明为内部类,因此它可能会阻止外部类的GC收集。如果Handler正在使用Looper或主线程以外的线程的MessageQueue,则没有问题。

如果Handler正在使用主线程的Looper或MessageQueue,则需要修复Handler声明,如下所示:将Handler声明为静态类;在外部类中,实例化一个指向外部的WeakReference类,并在实例化处理程序时将此对象传递给处理程序;

使用WeakReference对外部类的成员进行所有引用对象

  • 4.15 MergeRootFrame

摘要:FrameLayout可以替换为<merge>标记

优先级:4/10

严重性:警告

类别:性能

如果<FrameLayout>是布局的根,并且不提供背景或填充等,它通常可以被一个<merge>标签取代,这个标签更高效。请注意,这取决于上下文,因此请确保您理解在继续,<merge>标记是如何工作的。

  • 4.16 UseSparseArrays 代码

摘要:HashMap可以替换为SparseArray

优先级:4/10

严重性:警告

类别:性能

对于键为integer类型的映射,通常更有效的做法是使用Android SparseArray API。此检查确定了您

为了更好,可能需要考虑使用SparseArray而不是HashMap

当值类型是诸如int之类的基元时,这是特别有用的,其中可以使用SparseIntArray并避免将值从int自动装箱到整数

如果您需要构造HashMap,因为您需要在需要Map的控件,可以使用来抑制此警告例如@SuppressLint注释。

  • 4.17 UseValueOf 代码

摘要:应使用valueOf而不是new

优先级:4/10

严重性:警告

类别:性能

您不应该直接调用包装类的构造函数,例如newInteger(42)。相反,调用valueOf工厂方法,例如Integer.valueOf(42)。这通常会使用较少的内存,因为常见诸如0和1之类的整数将共享一个实例。

  • 4.18 DisableBaselineAlignment 布局

摘要:缺少baselineAligned属性

优先级:3/10

严重性:警告

类别:性能

当使用LinearLayout按比例嵌套布局,应关闭基线对齐属性以使布局计算速度更快。

  • 4.19 FloatMath 代码

摘要:使用FloatMath而不是Math

优先级:3/10

严重性:警告

类别:性能

在旧版本的Android中,出于性能原因,建议在浮点操作时使用Android.util.FloatPath。然而,在现代硬件上,double的速度和float一样快(尽管它们需要更多的内存),而在最近版本的Android中,FloatMath实际上比使用

java.lang.Math慢,由于JIT优化java.lang.Math的方式。因此,如果您只针对Froyo和在上面。

  • 4.20 InefficientWeight 布局

摘要:布局权重效率低下

优先级:3/10

严重性:警告

类别:性能

当LinearLayout中只有一个小部件定义权重时,为其分配0dp的宽度/高度会更有效,因为它无论如何都会吸收所有剩余空间。声明的宽度/高度为0dp时,它不必先测量自己的大小。

  • 4.21 NestedWeights

摘要:嵌套布局权重

优先级:3/10

严重性:警告

类别:性能

布局权重需要对小部件进行两次测量。当权重为非零的LinearLayout嵌套在另一个权重为非零值的LinearLayout中时,测量数量将呈指数级增加。

  • 4.22 Overdraw 布局

摘要:过度绘制

优先级:3/10

严重性:警告

类别:性能

如果在根视图上设置了可绘制的背景,则应使用主题背景为空的自定义主题。否则,主题背景将首先绘制,只是为了让您的自定义背景完全覆盖它;这被称为“透支”。

注意:该检测器依赖于找出与哪些布局相关联

基于扫描Java代码的活动,以及它目前正在做的

使用不精确的模式匹配算法。因此,它可以

错误地得出布局与哪个活动相关联的结论,然后

错误地抱怨隐藏了背景主题。

如果你想在多个页面上使用自定义背景,那么你应该考虑用自定义背景制作一个自定义主题,只使用该主题而不是根元素背景。

当然,你的定制抽绳可能是半透明的,你想要

将其与背景混合。然而,你会得到更好的表现

如果您将背景与绘图预混合,并将生成的图像或颜色用作自定义主题背景。

  • 4.23 UnusedResources 资源

摘要:未使用的资源

优先级:3/10

严重性:警告

类别:性能

未使用的资源会使应用程序变得更大,并降低生成速度。

  • 4.24 UselessLeaf 布局

摘要:无用的叶子布局

优先级:2/10

严重性:警告

类别:性能

没有子项或没有背景的布局通常可以被删除(因为是不可见的),以获得更平坦和更高效的布局层次。

  • 4.25 UselessParent 布局

摘要:无用的父布局

优先级:2/10

严重性:警告

类别:性能

子布局没有同级,不是滚动视图或根布局,也没有背景,可以删除子布局,并将其子布局直接移动到父布局中,以获得更平坦、更高效的布局层次结构

  • 4.26 TooDeepLayout 布局

摘要:布局层次结构太深

优先级:1/10

严重性:警告

类别:性能

嵌套过多的布局对性能不利。考虑使用更平坦的布局(如RelativeLayout或GridLayout)。默认的最大深度为10,但可以使用环境变量ANDROID_LINT_MAX_depth进行配置。

  • 4.27 TooManyViews 布局

摘要:布局视图过多

优先级:1/10

严重性:警告

类别:性能

在一个布局中使用过多的视图对性能不利。考虑使用复合绘图或其他技巧来减少此布局中的视图数量。

最大视图计数默认为80,但可以使用环境变量ANDROID_LINT_MAX_view_count进行配置。

  • 4.28 UnusedNamespace 代码

摘要:未使用的命名空间

优先级:1/10

严重性:警告

类别:性能

未使用的命名空间声明占用空间,并且需要进行不必要的处理

----------------------------------------------------------------------------------------------------------------

5、UsabilityTypography 更好的可用性方面

  • 5.1 AllCaps 布局

摘要:组合使用textAllCaps和标记

优先级:8/10

严重性:警告

类别:可用性:排版

textAllCaps文本转换最终将调用CharSequence上的toString,这具有删除任何标记(如<b>)的净效果。此检查查找包含标记的字符串的用法,这些标记也指定textAllCaps=true。

  • 5.2 TypographyDashes string文件和代码

摘要:连字符可以替换为短划线

优先级:5/10

严重性:警告

类别:可用性:排版

“n dash”(–,&#8211;)和“m dash)(-,&#8212;)字符用于范围(n dash)和中断(m dash)。使用这些字符而不是普通的连字符可以使文本更容易阅读,并且您的应用程序看起来更精致。

  • 5.3 TypographyEllipsis 字符串文件和代码

摘要:省略号字符串可以替换为省略号字符

优先级:5/10

严重性:警告

类别:可用性:排版

您可以将字符串“…”替换为专用省略号,省略号字符(…,&#8230;)。这有助于提高文本的可读性。

  • 5.4 TypographyFractions  字符串文件和代码

摘要:分数字符串可以替换为分数字符

优先级:5/10

严重性:警告

类别:可用性:排版

您可以将某些字符串(如1/2和1/4)替换为专用字符,如½(&#189;)和¼(&#188;)。这有助于提高文本的可读性。

----------------------------------------------------------------------------------------------------------------

6、UsabilityIcons Icon的更好的可用性方面

  • 6.1 IconNoDpi 资源

摘要:图标同时出现在-nodpi和dpi文件夹中

优先级:7/10

严重性:警告

类别:可用性:图标

出现在可绘制nodpi文件夹中的位图将不会被Android框架缩放。如果相同名称的可绘制资源同时出现在-nodpi文件夹和dpi文件夹(如可绘制hdpi)中,则这种行为是不明确的,可能不是故意的。删除其中一个或另一个,或为图标使用不同的名称。

  • 6.2 IconXmlAndPng 资源

摘要:图标被指定为.xml文件和位图

优先级:7/10

严重性:警告

类别:可用性:图标

如果一个可绘制资源在drawable/文件夹中以.xml文件的形式出现,通常不希望它也以使用相同名称的位图的形式出现;通常,您希望可绘制的XML文件定义状态,并且每个状态都有相应的可绘制位图。

  • 6.3 ConvertToWebp 资源

摘要:转换为WebP

优先级:6/10

严重性:警告

类别:可用性:图标

注意:此问题在默认情况下已禁用!

您可以通过添加--enable ConvertToWebp来启用它

WebP格式通常比PNG和JPEG更紧凑。从Android 4.2.1开始,它还支持透明和无损转换。请注意,IDE中有一个快速修复程序,可以让您执行转换。

启动器图标必须为PNG格式。

  • 6.4 IconColors icon

摘要:图标颜色不符合推荐的视觉样式

优先级:6/10

严重性:警告

类别:可用性:图标

通知图标和操作栏图标应仅为白色和灰色。

有关更多详细信息,请参阅Android设计指南。注意Lint的决定方式

图标是动作栏图标还是通知图标是基于

文件名前缀:ic_menu_表示操作栏图标,ic_stat_表示通知

图标等。这些与中记录的命名约定相对应

http://developer.android.com/guide/practices/ui_guidelines/icon_design.html

  • 6.5 IconLauncherShape icon

摘要:启动器图标形状应使用独特的轮廓

优先级:6/10

严重性:警告

类别:可用性:图标

根据Android设计指南(http://developer.android.com/design/style/iconography.html)你的启动程序图标应该“使用一个独特的轮廓”,一个“三维的前视图,有一个轻微的视角,就像从上面看一样,这样用户就可以感知到一些深度。”独特的轮廓意味着你的启动器图标不应该是一个填充的

广场

  • 6.6 WebpUnsupported 资源

摘要:不支持WebP

优先级:6/10

严重性:错误

类别:可用性:图标

WebP格式需要Android 4.0(API 15)。某些功能,如无损编码和透明度,需要Android 4.2.1(API 18;API 17 4.2.0.)

  • 6.7 GifUsage 资源

摘要:不鼓励对位图使用.gif格式

优先级:5/10

严重性:警告

类别:可用性:图标

不鼓励使用.gif文件格式。请考虑使用.png(首选)或.jpg(可接受)。

  • 6.8 IconDipSize 资源

摘要:图标密度独立尺寸验证

优先级:5/10

严重性:警告

类别:可用性:图标

检查以多种密度提供的所有图标,所有图标都计算为大致相同的密度无关像素(凹陷)大小。这会捕获错误,即图像被放置在错误的文件夹中,或者图标被更改为新的大小,但有些文件夹被遗忘了。

  • 6.9 IconDuplicatesConfig 资源

摘要:不同配置中的位图相同

优先级:5/10

严重性:警告

类别:可用性:图标

如果图标是在不同的配置参数下提供的,例如可绘制的hdpi或-v11,它们通常应该是不同的。该检测器捕获在不同的配置文件夹中提供相同图标的情况,这通常不是故意的。

  • 6.10 IconLocation 资源

摘要:图像定义在密度无关的可绘制文件夹中

优先级:5/10

严重性:警告

类别:可用性:图标

res/drawable文件夹用于与密度无关的图形,例如XML中定义的形状。对于位图,请将其移动到可绘制的mdpi,并考虑在可绘制的ldpi、可绘制的hdpi和可绘制的xhdpi中提供更高和更低分辨率的版本。如果图标确实与密度无关(例如纯色),则可以将其放置在可绘制的nodpi中。

  • 6.11 IconMixedNinePatch 资源 

摘要:碰撞PNG和9-PNG文件

优先级:5/10

严重性:警告

类别:可用性:图标

如果您不小心将两个独立的资源命名为file.png和file.9.png

图像文件和九个补丁文件都将映射到同一个可绘制资源@drawable/file,这可能不是预期的。

  • 6.12 MipmapIcons icon

摘要:使用Mipmap启动器图标

优先级:5/10

严重性:警告

类别:可用性:图标

应在mipmap资源目录中提供启动器图标。这与可绘制资源目录相同,只是在创建密度特定的APK时,mipmap目录中的资源不会被剥离。

在某些情况下,Launcher应用程序可能会使用更高分辨率的资产(比通常为设备计算的分辨率更高)来显示大型应用程序快捷方式。

如果设备分辨率以外的密度的可绘制项被删除,那么应用程序快捷方式可能会显得模糊。要解决此问题,请将启动程序图标从`drawable-`dpi移动到`mipmap-`dpi,并将引用从@drawable/和R.drawable更改为@mipmap/和R.mipmap。在Android Studio中,此lint警告具有快速修复功能,可以自动执行此操作。

  • 6.13 MissingApplicationIcon icon

摘要:缺少应用程序图标

优先级:5/10

严重性:警告

类别:可用性:图标

您应该为整个应用程序设置一个图标,因为没有默认设置。此属性必须设置为对包含图像的可绘制资源的引用(例如@drawable/icon)。

  • 6.14 IconDensities icon 

摘要:图标密度验证

优先级:4/10

严重性:警告

类别:可用性:图标

如果为每个主要的屏幕密度类别(低、中、高、超高)提供自定义版本,图标将看起来最好。此皮棉检查可识别在密度范围内没有完全覆盖的图标。

低密度已经不再被实际使用了,所以这次检查忽略了ldpi密度。要强制lint包含它,请设置环境变量ANDROID_lint_include_LDPI=true。

  • 6.15 IconDuplicates icon

摘要:不同名称下的重复图标

优先级:3/10

严重性:警告

类别:可用性:图标

如果一个图标以不同的名称重复出现,您可以合并并只使用其中一个图标,然后删除其他图标,使您的应用程序更小。然而,重复的图标通常不是故意的,有时可能指向被意外覆盖或意外未更新的图标。

  • 6.16 IconExtension icon

摘要:图标格式与文件扩展名不匹配

优先级:3/10

严重性:警告

类别:可用性:图标

确保图标具有正确的文件扩展名(例如.png文件实际上是png格式,而不是名为.png的GIF文件)。

  • 6.17 IconMissingDensityFolder icon

摘要:缺少密度文件夹

优先级:3/10

严重性:警告

类别:可用性:图标

如果为每个主要的屏幕密度类(低、中、高、超高、超超高)提供自定义版本,图标将看起来最好。此lint检查可识别丢失的文件夹,例如可绘制的hdpi。

低密度已经不再被实际使用了,所以这次检查忽略了ldpi密度。要强制lint包含它,请设置环境变量ANDROID_lint_include_LDPI=true。

----------------------------------------------------------------------------------------------------------------

7、Usability 可用性方面

  • 7.1 ButtonOrder

摘要:按钮顺序

优先级:8/10

严重性:警告

类别:可用性

根据Android设计指南, “操作按钮通常为“取消”和/或“确定”,“确定”表示首选或最有可能的操作。但是,如果选项由特定操作组成,如“关闭”或“等待”,而不是对内容中描述的操作的确认或取消,则所有按钮都应该是活动动词。通常,对话框的否定操作总是在左边,而肯定操作选项在右边。"

此检查查找按钮栏和看起来像取消按钮的按钮,并确保这些在左边。

  • 7.2 MenuTitle xml菜单资源

摘要:缺少菜单标题

优先级:5/10

严重性:错误

类别:可用性

从操作栏文档中:

“重要的是,你要始终为每个菜单项定义android:title,即使你没有声明标题与操作项一起出现,原因有三:

*如果操作栏中没有足够的空间放置操作项,则菜单项将显示在溢出菜单中,并且只显示标题。

*视障用户的屏幕阅读器读取菜单项的标题。

*如果操作项目仅显示图标,则用户可以长按该项目以显示显示操作项目标题的工具提示。android:图标始终是可选的,但推荐使用。

  • 7.3 TextFields 布局

摘要:缺少inputType

优先级:5/10

严重性:警告

类别:可用性

在文本字段上提供inputType属性可以提高可用性,因为根据要输入的数据,可以向用户显示优化的键盘(例如电话号码的数字和括号)。

lint检测器还会查看视图的id,如果id提供了字段用途的提示(例如,id包含短语phone或email),那么lint还会确保inputType包含相应的类型属性。

如果您真的想保持文本字段的通用性,可以通过设置inputType=“text”来抑制此警告。

  • 7.4 SmallSp 布局

摘要:文本大小太小

优先级:4/10

严重性:警告

类别:可用性

避免使用小于12sp的尺寸。

  • 7.5 AlwaysShowAction menu布局和代码

摘要:showAsAction=always的用法

优先级:3/10

严重性:警告

类别:可用性

在菜单XML中使用showAsAction=“always”,或在Java代码中使用MenuItem.SHOW_AS_ACTION_always,通常会偏离用户界面样式指南。请改用ifRoom或相应的MenuItem.SHOW_AS_ACTION_IF_ROOM。

如果总是谨慎使用,通常不会出现问题,行为大致相当于ifRoom,但优先于其他ifRoom项目。在同一菜单中使用两次以上是个坏主意。

此检查将查找包含两个以上“始终”操作的菜单XML文件,或者一些“始终”动作而没有ifRoom动作的菜单XML。在Java代码中,它查找包含对MenuItem.SHOW_AS_ACTION_ALWAYS的引用而没有对MenuItems.SHOW_AS_ACTION_IF_ROOM的引用的项目。

  • 7.6 Autofill 布局

摘要:使用自动填充

优先级:3/10

严重性:警告

类别:可用性

在针对SDK版本26或更高版本时指定autofillHints属性,或者明确指定视图对自动填充不重要。您的应用程序可以通过提供每个可自动填充的视图的含义来帮助自动填充服务正确地对数据进行分类,例如表示用户名、密码、信用卡字段、电子邮件地址等的视图。

提示可以有任何值,但建议使用预定义的值,如用户名的“username”或信用卡号的“creditCardNumber”。有关所有预定义的自动填充提示常量的列表,请参阅位于

https://developer.android.com/reference/android/view/View.html.

通过在视图或父视图上指定importantForAutofill属性,可以将该视图标记为对自动填充不重要。看见https://developer.android.com/reference/android/view/View.html#setImportan用于自动填充(int)。

  • 7.7 ViewConstructor 代码

摘要:缺少用于XML膨胀的视图构造函数

优先级:3/10

严重性:警告

类别:可用性

一些布局工具(如Android布局编辑器)需要找到一个具有以下签名之一的构造函数:

*视图(上下文上下文)

*视图(上下文上下文,AttributeSet属性)

*视图(上下文上下文、AttributeSet属性、int defStyle)

如果您的自定义视图需要执行在布局编辑器中使用时不适用的初始化,您可以在给定的代码周围检查view#isInEditMode()是否为false,因为该方法在运行时将返回false,但在用户界面编辑器中返回true。

  • 7.8 ButtonCase 代码

摘要:取消/确定对话框按钮大写

优先级:2/10

严重性:警告

类别:可用性

确定/取消对话框的标准大写为“确定”和“取消”。为了确保您的对话框使用标准字符串,您可以使用资源字符串@android:string/ok和@android:string/cancel。

----------------------------------------------------------------------------------------------------------------

8、Accessibility 可访问性方面

  • 8.1 GetContentDescriptionOverride 代码

摘要:覆盖视图上的getContentDescription()

优先级:9/10

严重性:错误

类别:无障碍

重写getContentDescription()可能会阻止某些辅助功能服务正确导航视图公开的内容。相反,当需要更改内容描述时,请调用setContentDescription()。

  • 8.2 ClickableViewAccessibility 代码

摘要:自定义视图中的辅助功能

优先级:6/10

严重性:警告

类别:无障碍

如果覆盖onTouchEvent或使用OnTouchListener的视图不同时实现performClick并在检测到单击时调用它,则视图可能无法正确处理辅助功能操作。理想情况下,处理点击操作的逻辑应该放在View#performClick中,因为一些辅助功能服务会在点击操作发生时调用performClick。

  • 8.3 ContentDescription  布局

摘要:没有内容的图像描述

优先级:3/10

严重性:警告

类别:无障碍

像ImageViews和ImageButtons这样的非文本小部件应该使用contentDescription属性来指定小部件的文本描述,这样屏幕阅读器和其他辅助工具就可以充分描述用户界面。

请注意,应用程序屏幕中纯粹是装饰性的、不提供任何内容或不启用用户操作的元素不应具有可访问性内容描述。在这种情况下,只需使用tools:ignore=“ContentDescription”属性来抑制lint警告。

请注意,对于文本字段,不应同时设置提示和contentDescription属性,因为提示永远不会显示。只要设置提示即可。这http://developer.android.com/guide/topics/ui/accessibility/checklist.html#spec-诉讼案件。

  • 8.4 KeyboardInaccessibleWidget 代码

摘要:键盘无法访问的小部件

优先级:3/10

严重性:警告

类别:无障碍

声明为可点击但未声明为可聚焦的小部件无法通过键盘访问。请同时添加可聚焦属性。

  • 8.5 LabelFor 布局

摘要:缺少辅助功能标签

优先级:2/10

严重性:警告

类别:无障碍

可编辑文本字段应提供android:hint,或者,如果您的minSdkVersion至少为17,则它们可能会被具有android:labelFor属性的视图引用。

使用android:labelFor时,请确保提供android:text或android:contentDescription。

如果您的视图被标记,但被包括此布局的不同布局中的标签所标记,只需从lint中抑制此警告即可。

----------------------------------------------------------------------------------------------------------------

9、Internationalization 国际化方面

  • 9.1 ByteOrderMark 文件

摘要:文件中的字节顺序标记

优先级:8/10

严重性:错误

类别:国际化

Lint将标记它在文件中间找到的任何字节顺序标记(BOM)字符。由于我们希望文件使用UTF-8编码(请参阅EnforceUTF8问题),因此BOM字符不是必需的,并且并非所有工具都能正确处理这些字符。例如,如果在一个特定的翻译中,将BOM表作为资源名称的一部分,则该名称将不被视为与基本资源的名称相同,并且不会使用该翻译。

  • 9.2 ConstantLocale 代码

摘要:常量区域设置

优先级:6/10

严重性:警告

类别:国际化

将Locale.getDefault()分配给常量是可疑的,因为在应用程序运行时,区域设置可能会更改。

  • 9.3 SetTextI18n 代码

摘要:文本视图国际化

优先级:6/10

严重性:警告

类别:国际化

调用TextView#setText时

*永远不要调用Number#toString()来格式化数字;它将无法正确处理分数分隔符和特定于区域设置的数字。请考虑使用具有正确格式规范(%d或%f)的String#格式。

*不要传递字符串文字(例如“Hello”)来显示文本。硬编码文本无法正确翻译成其他语言。请考虑使用Android资源字符串。

*不要通过串联文本块来构建消息。此类信息无法正确翻译。

  • 9.4 EnforceUTF8 xml

摘要:资源文件中使用的编码不是UTF-8

优先级:5/10

严重程度:致命

类别:国际化

XML支持以各种各样的字符集进行编码。然而,并非所有工具都能正确处理XML编码属性,而且几乎所有的Android应用程序都使用UTF-8,因此通过使用UTF-8,您可以在使用非ASCII字符时保护自己免受细微错误的影响。

特别是,Android Gradle构建系统将合并资源XML文件,假设资源文件使用UTF-8编码。

  • 9.5 HardcodedText 布局

摘要:硬编码文本

优先级:5/10

严重性:警告

类别:国际化

直接在布局文件中硬编码文本属性是不好的,原因有几个:

*创建配置变体(例如横向或纵向)时,必须重复实际文本(并在进行更改时保持最新)

*仅通过为现有字符串资源添加新的翻译,无法将应用程序翻译为其他语言。

有一些快速修复程序可以自动将此硬编码字符串提取到资源查找中。

  • 9.6 RelativeOverlap 布局

摘要:RelativeLayout中的重叠项目

优先级:3/10

严重性:警告

类别:国际化

如果相对布局的文本或按钮项目左右对齐,则由于本地化的文本扩展,它们可以相互重叠,除非它们具有toEndOf/toStartOf等相互约束。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值