9

Android 性能优化:使用 Lint 优化代码、去除多余资源

 2 years ago
source link: http://www.androidchina.net/6257.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

读完本文你将了解到:

在保证代码没有功能问题,完成业务开发之余,有追求的程序员还要追求代码的规范、可维护性。

今天,以“成为优秀的程序员”为目标的拭心将和大家一起精益求精,学习使用 Lint 优化我们的代码。

什么是 Lint

Lint 是Android Studio 提供的 代码扫描分析工具,它可以帮助我们发现代码结构/质量问题,同时提供一些解决方案,而且这个过程不需要我们手写测试用例。

Lint 发现的每个问题都有描述信息和等级(和测试发现 bug 很相似),我们可以很方便地定位问题,同时按照严重程度进行解决。

当然这个“严重程度”我们可以手动调节,有些原则问题不容侵犯,必须提升到 error,而有的个别问题也可以无视,毕竟人非圣贤孰能无过嘛。

Lint 工作方式简单介绍

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

  • Correctness:不够完美的编码,比如硬编码、使用过时 API 等
  • Performance:对性能有影响的编码,比如:静态引用,循环引用等
  • Internationalization:国际化,直接使用汉字,没有使用资源引用等
  • Security:不安全的编码,比如在 WebView 中允许使用 JavaScriptInterface 等

Lint 检测代码的过程如下图所示:

shixinzhang

  • App 源文件:包括 Java 代码,XML 代码,图标,以及 ProGuard 配置文件等
  • lint.xml:Lint 检测的执行标准配置文件,我们可以修改它来允许或者禁止报告一些问题

从命令行运行 Lint

Lint 的命令很简单:

lint [flags] <project directory>

Lint 也可以使用 Gradle 运行:

Windows:

gradlew lint
./gradlew lint

具体命令行相关的操作这里就不介绍了,因为这个过程实在太痛苦,上一张命令行运行 Lint 后得到的 XML 文件截图让你体验一下:

shixinzhang

看着浑身不舒服,想了解如何从命令行使用 Lint 的同学可以点击这里前往官方学习。

我们还是直接进入 Lint 的 GUI 操作吧。

Android Studio 中使用 Lint

Android Studio 中内置了 Lint,我们小手一点就可以直接使用。

Lint 的使用路径:
工具栏 -> Analyze -> Inspect Code…

点击 Inspect Code 后会弹出检查范围的对话框:

shixinzhang

默认是检查整个项目,我们可以点击 Custom scope 自定义检查范围。

点击右边的下拉框,会出现以下选择:

shixinzhang

  • Project Files:所有项目文件
  • Project Production Files:项目的代码文件
  • Project Test Files:项目的测试文件
  • OpenFiles:当前打开的文件
  • Module ‘app’:主要的 app 模块
  • Current File:当前文件

除了内置的选项我们还可以自己选择特定的类进行检查,点击下图中的红色框部分:

shixinzhang

会弹出自定义范围选择框,默认是空的,我们可以点击左上角的“+”号新增一个检查范围:

这里写图片描述
Local:只能当前项目使用
Shared:其他 Android Studio 项目也可以使用

我们选择 Shared,然后起个帅气的名字 “ShixinCuteLint”,默认按项目显示,这时检查的文件数为 0 :

这里写图片描述

上图中右边的四个按钮表示要操作的类型:

  • Include:包括当前文件夹内的文件,但不包括他的子文件夹
  • Include Recursively:包括当前文件夹以及它的子文件夹内所有的文件夹,递归添加
  • Exclude:移除当前文件夹,不包括子文件夹
  • Exclude Recursively:移除当前文件夹及所有子文件夹

我们点击左边的 app 文件夹后,点击右边的 Include Recursively 按钮,把 app 下的所有文件添加到检查列表:

这里写图片描述

可以看到,这时 app 下的文件都变绿了,总共有 689 个文件夹要扫描。

点击 OK 进行检测,稍等一会儿,会弹出 Inspection 对话框,显示检查结果,没想到我的代码居然有 1769 个警告!这数字触目惊心啊:

这里写图片描述

我们主要关注红框内的警告,先来看看我的代码 Performance 有什么问题:

这里写图片描述

哈哈,没想到我还有这么多进步空间!

上图可以看到,Lint 真是神器,可以帮我们发现自己忽略或者没有意识到的问题,尤其是性能方面,如果你觉得自己代码想优化又不知道从何做起,不妨让 Lint 给你指指路。

团队中建立代码规范利器:提升、降低问题的等级

虽然 Lint 可以帮我们检查代码的问题,但多人合作时,我们更期望可以在写代码时就发现问题、解决问题。

鉴于团队成员中水平良莠不齐,靠个人意识有时候很难保证质量,这时可以修改 Lint 对于特定问题的警告等级,以最直观的 IDE 提示来警醒成员。

Lint 的警告严重程度有以下几种:

这里写图片描述

  • Unused Entry:没有使用的属性,灰色,很不起眼
  • Typo:拼写错误,绿色波浪下划线,也不太起眼
  • Server Problem:服务器错误?好像不是
  • Info:注释文档,绿色,比较显眼
  • Weak Warning:比较弱的警告,提示比较弱
  • Warning:警告,略微显眼一点
  • Error:错误,最显眼的一个

日常开发中,好一点的程序员会关注 Warning 的警告,根据警告优化代码,但那也只是很少一部分。但是红色的 Error 就不一样了,基本上看到就想要消灭掉。

我们拿命名拼写错误举个例子。

类、对象、遍历拼写错误看起来不是什么问题,但是如果你见过大量的无意义或者错误命名,你一定会赞同我的接下来做法。

默认的拼写错误是 Typo ,提示很弱,所以常被人忽略:

这里写图片描述

上面的 String 类型变量 login 写成了 logn,Lint 默认对拼写错误是个下滑波浪线,很不起眼。我们修改一下。

打开 Preferences/Settings,搜索 Inspections,会出现 Lint 的检测配置页面:

这里写图片描述

要修改拼写的警告等级,搜索“spelling”:

这里写图片描述

然后选择出现的 Typo,再点击右边的 Severity 就是严重程度,改成 Error,OK。

这里写图片描述

可以看到,现在拼写错误就会出现红色的错误警告了,让你不好好写变量名!

Lint 虽好,也不能贪杯。

Lint 就像是一个洁癖患者,虽然可以让我们代码干净许多,但是如果真要把它提示的全解决,恐怕老板要发怒了:给你发工资天天玩电脑,怎么不出活呢?!

Lint 报的某些警告的确是没必要,这时我们可以选择忽略这些警告。忽略警告可以分两种:

  1. 在 Java 代码中
  2. 在 XML 文件夹中

在 Java 代码中忽略 Lint 警告

忽略 Lint 警告的注解跟 @SuppressWarnings 很类似,@SuppressLint(“忽略的警告名称”)。

下面的代码演示了如何忽略 Lint 对使用新 API 的警告:

@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

要是你不清楚要忽略的警告具体是什么名字,那就直接忽略 all,当然是当前类/方法/对象:

@SuppressLint("all")

在 XML代码中忽略 Lint 警告

只需两步:

  1. xml 中声明 tools 命名空间
  2. 使用 tools:ignore=”忽略的警告名”
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              tools:ignore="all"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical"
              android:background="@color/white">

Gradle 中配置 Lint

Gradle 中也可以配置 Lint 的关键操作,比如是否开启 Lint 警告,或者关闭指定的警告。

在 module 下的 build.gradle 中添加 lintOptions{…}, 样例代码如下:

android {
  ...
  lintOptions {
    // Turns off checks for the issue IDs you specify.
    disable 'TypographyFractions','TypographyQuotes'
    // Turns on checks for the issue IDs you specify. These checks are in
    // addition to the default lint checks.
    enable 'RtlHardcoded','RtlCompat', 'RtlEnabled'
    // To enable checks for only a subset of issue IDs and ignore all others,
    // list the issue IDs with the 'check' property instead. This property overrides
    // any issue IDs you enable or disable using the properties above.
    check 'NewApi', 'InlinedApi'
    // If set to true, turns off analysis progress reporting by lint.
    quiet true
    // if set to true (default), stops the build if errors are found.
    abortOnError false
    // if true, only report errors.
    ignoreWarnings true
  }
}
...

自动删除查找出来的无用资源文件

代码迭代版本一多,很容易会遗留一些无用的代码、资源文件,我们可以使用 Lint 进行清除。

点击 Android Studio 工具栏 -> Analyze -> Run Inspection By Name..,输入要检测的内容,这里是无用资源:

这里写图片描述

然后选择 Unused resources,再选择范围后就开始检测。

检测出这么多无用文件:

这里写图片描述

注意,右边有解决方法:Remove All Unused Resources,放个大图显眼一点:

这里写图片描述

点击后,boom ,从此世界清静了。

Lint 是优秀程序员之友,吾日三省吾身,今日 Lint 了没?!

欢迎扫描关注我的微信公众号 安卓进化论,第一时间阅读文章~

这里写图片描述

Thanks

https://developer.android.com/studio/write/lint.html
http://blog.csdn.net/u010687392/article/details/47835743
http://www.jianshu.com/p/991155725a68

转载请注明:Android开发中文站 » Android 性能优化:使用 Lint 优化代码、去除多余资源


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK