Android Lint 检查案例分析

[摘要] 好的代码不仅要能高效的完成功能的实现,还得经得起时间和tester的考验,lint的忽然露面,让程序员写的代码不能再像以前那样随心所愿~


一.什么是Lint?

根据Android官网的介绍,lint是android推荐的开发IDE Android Studio提供的一款静态代码识别工具。目的是通过Android官方规定的一系列代码标准规则,帮助开发者在不运行app或者写测试case的情况下识别并纠正警告和错误。这个工具会为每一个识别到的错误或者警告用一个描述性的消息和严重程度报告出来,这样攻城狮们就可以快速的首先去优化严重程度比较高的项。当然,有些项也可以不用修改,这时候,就需要在相应的lint.xml里面ignore这些检查项。


二. Lint的检查项


从上图可以看出,lint会结合每个app下的lint.xml(如果存在的话)的声明来对app源码进行扫描,得出的是一个html文档,里面会对检查出的Error和Warning进行分类,我们可以直接打开,如下图这样(packages/app/Tag 用lint检查扫描出来的report截图):


下面简单的对lint中的一些检查项作一个介绍。

Lint Report 一共分为两部分:

第一部分是对检查出来的问题进行一个总体的统计(蓝线Correctness以上的部分)

第二部分是具体的每个问题的详情(蓝线Correctness以下的部分)


Lint Check会有两种典型的标签:

1.categories : 在上面中显示出来的就是Correctness, Performance, Usability:Icons 等这些。

2.issue : 即是每个category下面具体的项,例如 UsesMinSdkAttributes, InlinedApi等。


Lint Check会对每种issue用两种类型的符号标注:

三角形的灰色感叹号表示warning, 红色感叹号表示error。

因为上面只贴出了部分报告的截图,有些category和issue部分同学不清楚,我们可以通过运行以下命令查看全部。

lint --list

 (项目太多,这里就不贴出来了)


三. 如何生成Lint Report

上面说了那么多,那么如何生成一份lint Report呢,方法很简单,找到本机的SDK路径,然后这样:
你本机的SDK路径/tools/lint --html ~/lint_check.html --classpath  out/target/common/obj/APPS/你对应工程的生成/classes/   你有的工程目录
例如(packages/app/Tag):
./lint --html ~/lint_check.html --classpath ~/jerry_work/Project1/out/target/common/obj/APPS/Tag_intermediates/classes ~/jerry_work/Project1/packages/apps/Tag/

其中 lint --html是以html格式生成报告,~/lint_check.html, 因为在linux里面,~表示根目录,所以这块表示在根目录下生成lint_check.html文件。

执行完上面的操作,terminal中会打出类似下面的额信息提示(我这里是保存到1.html),然后就可以去根目录下去找到生成的同名html文件,打开就像上面截图那样。



四. 如何“干掉”Lint报的各种warning和error

对于开发app的哥们来说,因为是自己写的,如果安全按照Android Studio的提示来做,这种Lint的报错应该会比较的少。但是对于维护平台的来说,就比较悲剧了。。。
代码的来源很多,有的是android原生的,有的是vendor提供的,(吐槽一下: vendor厂商如nxp一样的欧美公司,代码的风格没有那么严谨,各种tab,各种不对齐)这种情况下,Lint Check一个目录,可能会报两三千个的warning和error,如果一个个去解决,程序员们都会崩溃的。
所以个人认为去掉一些unused的资源即可,毕竟能省点内存就省点。但是如果老大说,不管怎么样,你就得给我把所有的error和warning去掉,那么我们可以通过自定义Lint check的规则来达到这一目的。

例如上面提到的InlinedApi, 我们可以让lint检查时忽略这一项。
 <!-- Disable InlinedApi check under Tag app -->
  <issue id="InlinedApi" severity="ignore" />
上面的issue id表示检查的项,severity表示严重程度,包括,default,warning,error,fatal,information和ignore,这里我们设置为ignore,lint在检查的过程中就会忽略到这一项
当然,如果我们对于某些项有特别的要求,我们可以自行提高它的severity程度到error,甚至fatal。

对于其中的另一些些项,可能我们只需要在某一个指定的文件里面不去检查,其他的文件照旧要去check,这时候我们可以按照下面的形式去做。
<!-- Disable UnusedResources check in the specified file -->
  <issue id="UselessParent">
      <ignore path="res/layout/tag_viewer.xml" />
  </issue>
我们指定了ignore的path为一个xml,所以这个xml就会在lint的检查中被忽视。

下面贴出一份完整的lint.xml

<?xml version="1.0" encoding="UTF-8"?>
<lint>
  <issue id="UsesMinSdkAttributes" severity="ignore" />

  <!-- Disable Calling new methods on older versions check under Tag app -->
  <issue id="NewApi" severity="ignore" />

  <!-- Disable InlinedApi check under Tag app -->
  <issue id="InlinedApi" severity="ignore" />
​
  <!-- Since Tag is a system app, disable this check -->
  <issue id="ProtectedPermissions" severity="ignore" />

  <issue id="MissingPrefix">
      <ignore path="AndroidManifest.xml" />
  </issue>

  <issue id="ContentDescription" severity="ignore" />

  <!-- Disable AllowBackup/FullBackupContent Problems check under Tag app -->
  <issue id="AllowBackup" severity="ignore" />

  <!-- Disable UnusedResources check in the specified file -->
  <issue id="UnusedResources">
      <ignore path="res/values/strings.xml" />
  </issue>

  <!-- Disable Overdraw check in the specified file -->
  <issue id="Overdraw">
      <ignore path="res/layout/tag_divider.xml" />
  </issue>

  <!-- Disable UnusedResources check in the specified file -->
  <issue id="UselessParent">
      <ignore path="res/layout/tag_viewer.xml" />
  </issue>

  <issue id="IconMissingDensityFolder" severity="ignore" />

  <issue id="GoogleAppIndexingWarning" severity="ignore" />
</lint>

当所有的自定义规则都加入到lint.xml,这时候我们再次运行上面的检查命令,就会发现所有的error和warning都不见了,大功告成!


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值