Android lint是一个静态代码分析工具,通过lint工具,你可以不用边运行边调试,或者通过单元测试进行代码检查,可以检测代码中不规范、不和要求的问题,解决一些潜在的bug。lint工具可以在命令行上使用,也可以在Android studio中使用。是sdk自带的一种静态分析工具,在sdk目录的tools目录下面的bin可以找到lint工具。可以直接在Android stuido中调用,也可以通过命令行./gradlew lint 执行,当然也可以集成到jenkins中,每次编译的时候都执行代码。

Jenkins 集成 Android 代码检查_android

Lint 会根据预先配置的检测标准检查我们 Android 项目的源文件,发现潜在的 bug 或者可以优化的地方,主要针对几个方面:

Correctness:不够完美的编码,比如硬编码、使用过时 API 等;

Performance:对性能有影响的编码,比如:静态引用,循环引用等;

Internationalization:国际化,直接使用汉字,没有使用资源引用等

Security:不安全的编码,比如在WebView中允许使用JavaScriptInterface

Lint规则文件lint.xml可以自定义修改检查标准,可以使用默认的规则,也可以自定义一些特定条件的规则

Jenkins 集成 Android 代码检查_自定义_02

上面提到了代码检查可以集成到jenkins中,只需要在构建过程中添加类似如下步骤即

Jenkins 集成 Android 代码检查_自定义_03

在执行构建时,就会自动检查android_sdk_refactor_as工程下所有的Android代码,生成lint-results.xml结果文件。生成结果文件通过Android Lint Plugin 发布出去,这样就可以直观的看到检查报告。

Jenkins 集成 Android 代码检查_测试_04

生成类似结构的报告后可以进行简单的分析了,如下面问题:

Jenkins 集成 Android 代码检查_android_05

第一眼看到High Priority就有37个,不必惊慌去掉重复调用的影响后就会少一半了。再由于静态代码的存在误判行为,结合上下文环境,又会减少一些。如上面这个问题,很明显是由于项目配置的支持最小SDK版本是14,可是工程中却使用了SDK必须大于19才能使用的api,当工程运行在低版本的手机时,就很容易发生各种异常。或者出现类似下面异常

Jenkins 集成 Android 代码检查_android_06

当工程试图调用只有用户同意才可以访问的接口时,程序应该做出当用户拒绝操作权限时的相应处理。

集成过程中坑点

Jenkins 集成 Android 代码检查_自定义_07

开始设想把代码检查放在【构建后操作】来做,这样既不影响打包,也可以做代码检查。但是这样无法发布lint测试报告,因为构建后第一个步骤就是发布lint测试报告。

Jenkins 集成 Android 代码检查_自定义_07

由于现在很多项目都是多个工程一起构建,一定要把gradlew lint命令写在主工程下面。多个工程,代码检查会生成多个结果文件,但是多个文件不能合并。

Jenkins 集成 Android 代码检查_自定义_07

有的工程没有忽略lint警告,当出现警告后就会停止编译,所以需要把每个检查的工程都配置忽略警告。