关闭

利用代码扫描工具提升Android代码健壮性

标签: android
900人阅读 评论(3) 收藏 举报
分类:

Android Lint

Android Lint是安卓强烈推荐的代码扫描工具,我会对官方的文档做一些翻译,并结合自己的理解进行一些整理。你也可以直接访问官方文档查看文档。 原文链接: https://developer.android.com/studio/write/lint.html?hl=zh-cn

在保证你的应用功能需求测试通过的同时,保证你的代码没有结构性错误也非常的重要。结构糟糕的代码,将会对你的应用可靠性和效率带来不利的影响,也会让代码难以维护。比如,你的xml中有未被使用的命名空间,既占用了空间,也会招致多余的处理。其他的错误,例如使用过时的api或者目标版本不支持的api,也会让代码运行不正确。

概述

Android Studio提供了一个叫做Lint的代码扫描工具,能够帮助你轻松地找出并修复代码中的质量问题,不需要运行应用和写测试用例。工具把每个问题按照问题描述和严重级别报告给你,你也可以配置错误的严重等级忽略与项目不相关的错误,也可以提升错误的等级。这个工具有命令行结果,你可以很方便的集成进来做自动测试。
下面是Lint工具的工作原理。

这里写图片描述

Lint扫描流程
Application source files
应用资源文件包括代码,xml文件,图标文件,混淆器配置文件。

lint.xml文件
用来配置你想排除或者自定义的问题严重等级。

Lint工具
这个就是静态代码扫描的工具。

扫描结果
可以在控制台或者事件日志等地方看到扫描结果。

在Android Studio中运行

在Android Studio中,当你编译程序的时候,Lint会自动运行。查看修改问题严重等级,你可以打开设置File > Settings > Editor > Inspections 进行修改,这个是windows的设置,mac基本大同小异。在build.gradle中也可以修改配置。

android {
    lintOptions {
       // 设置成true关闭lint的分析进程
       quiet true
       // 设置成true, 当发现问题的时候就会终止gradle build
       abortOnError false
       // 设置成true,只报告错误
       ignoreWarnings true
       }
       ...
    }

也可以手动执行扫描,在Analyze > Inspect Code下,然后制定扫描的范围。

在命令行执行lint

lint [flags] <project directory>

举个例子,你可以用下面的命令去扫描myproject工程目录以及子目录。错误的ID是MissingPrefix,只扫描xml文件没有命名空间前缀的错误。

lint --check MissingPrefix myproject

其他的命令和参数可以通过下面这个方法查看:

lint --help

lint输出示例

下面是Lint扫描Earthquake项目后的结果:

$ lint Earthquake

Scanning Earthquake: ...............................................................................................................................
Scanning Earthquake (Phase 2): .......
AndroidManifest.xml:23: Warning: <uses-sdk> tag appears after <application> tag [ManifestOrder]
  <uses-sdk android:minSdkVersion="7" />
  ^
AndroidManifest.xml:23: Warning: <uses-sdk> tag should specify a target API level (the highest verified version; when running on later versions, compatibility behaviors may be enabled) with android:targetSdkVersion="?" [UsesMinSdkAttributes]
  <uses-sdk android:minSdkVersion="7" />
  ^
res/layout/preferences.xml: Warning: The resource R.layout.preferences appears to be unused [UnusedResources]
res: Warning: Missing density variation folders in res: drawable-xhdpi [IconMissingDensityFolder]
0 errors, 4 warnings

输入了4个警告,0个错误。错误的原因和位置都已经展示出来了,所以很方便找到并修复他们。

在代码和xml中配置lint

如果要忽略部分检查可以这样做:

@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
@SuppressLint("ParserError")
public class FeedProvider extends ContentProvider {

xml中是这样的

namespace xmlns:tools="http://schemas.android.com/tools"
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:ignore="UnusedResources" >

    <TextView
        android:text="@string/auto_update_prompt" />
</LinearLayout>
tools:ignore="NewApi,StringFormatInvalid"

Infer

Infer 是facebook推出的一款静态代码扫描工具,支持Objective-C, Java, 和 C。使用过后觉得还不错,推荐给大家。
我是通过brew安装的,命令如下:

brew install infer

运行检查也非常简单

infer -- gradle xxxx(最后代表你要检查的项目名)

扫描的时间看项目大小,如果项目很大会特别的久,需要耐心等待。

扫描结果:
这里写图片描述

这里写图片描述

统计了不同的错误类型,还有错误代码的位置很详细,可能方便很多快找到问题。主要三种错误,可能的空指针,资源没释放:例如数据库或者输入输出流没有释放,context泄露。

有了这些工具帮助我们,我们项目中crash率和性能都得到了大大的提升,用户体验提升了不止一点点。

0
1

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:16632次
    • 积分:327
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:1篇
    • 译文:1篇
    • 评论:8条
    最新评论