logo头像

我有一个梦想

lint方案调研

本文于 326 天之前发表,文中内容可能已经过时。

目标

针对不同方向,如开发阶段,编译阶段,修复阶段等都进行提效,降低错误数量,便捷修复错误问题等。

android studio本身存在系统的lint检查工具,但功能有限,并不能囊括所有的问题,参考美团外卖Android Lint代码检查实践,我们可以自研一套lint工具体系,以此更好的治理移动端错误

目前在知乎的android组件中并没有成型的可用自定义lint方案,所以我们可以构建一个

方案调研

Android Studio 提供了一个名为 lint 的代码扫描工具,可帮助开发者发现并改正代码结构质量方面的问题。系统会报告该工具检测到的每个问题并提供问题的描述信息和严重级别。

lint可针对android的源文件,通过lint.xml进行配置后,通过lint工具进行在正确性、安全性、性能、易用性、无障碍性和国际化方面入手,优化改进。

img

检测时机

其可在开发阶段通过idea识别并提示开发者,亦可在编译时提示。

  1. 在开发阶段
    idea会识别lint工具,并根据级别展示不同提示
    image2022-8-24_13-48-3
    开发者可在弹窗中获取更多关于提示的信息,并根据提示修复问题

  2. 在编译阶段
    image2022-8-24_13-53-3
    会存在提示,如是error级别日志会阻断编译过程,必须修复后方可运行

  3. 除此之外,我们亦可手动调用 ./gradlew lint 进行代码检查,之后会生成xml文件和html文件可供分析
    image2022-8-24_14-0-44
    image2022-8-24_14-8-36

  4. commit增量检测
    lint的原理是进行全盘扫描,如果项目较为庞大,那么可定耗时很长,所以可以通过分析每次commit生成的diff文件,进行增量lint检测

  1. CI检测
    可通过配置打包服务器Jenkins,在提交mr的时候进行检测

检测配置

  1. 配置可检测规则

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    android {
    lintOptions {
    //设置只检查的类型
    def checkList = [
    'SerializableClassCheck',
    'HandleExceptionCheck',
    'AvoidUsageApiCheck',
    'DependencyApiCheck',
    'ResourceNameCheck'
    ] as String[]
    check checkList
    ...
    }
    }
  1. 针对当前项目进行配置
    右键点击项目Analyze→InspectCode 进行相关的lint有效范围配置
    image2022-8-24_15-54-10

  2. 忽略历史问题
    通过创建一个baseline.xml文件,将该时间点之前的所有项目产生的lint问题忽略

    1
    2
    3
    4
    5
    6
    android{  
    lintOptions {
    //创建警告基准
    baseline file("lint-baseline.xml")
    }
    }

方案优势

采用lint方案,存在什么优势呢?

  1. 功能强大,Lint支持Java和Kt源文件、class文件、资源文件、Gradle等文件的检查。
  2. 扩展性强,支持开发自定义Lint规则。
  3. 配套工具完善,Android Studio、Android Gradle插件原生支持Lint工具。
  4. Lint专为Android设计,原生提供了几百个实用的Android相关检查规则。
  5. 有Google官方的支持,会和Android开发工具一起升级完善。

结论

可以采用lint工具,其推进的最大阻力在于lint的规则编写。

根据目前线上出现的高频问题,进行评估后列入表格中,按表格依次开发规则迭代lint工具。

拓展

  1. lint规则可配置处理,无需手写规则
  2. 增量lint判断处理