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

*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布

前言

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

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

什么是 Lint

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

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

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

Lint 工作方式简单介绍

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

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

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

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

从命令行运行 Lint

Lint 的命令很简单:

lint [flags] <project directory>

Lint 也可以使用 Gradle 运行:

Windows:

gradlew lint

Mac:

./gradlew lint

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

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

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

Android Studio 中使用 Lint

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

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

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

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

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

分别有:

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

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

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

- 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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Web项目聚集地

我珍藏的神兵利器(开发篇)

用了有些年头了,高效、顺滑。也是因为从IDEA开始,让我意识到工具的重要性,在折腾工具的这条路上越走越远。

592
来自专栏一个爱瞎折腾的程序猿

dotnet使用Selenium执行自动化任务

源码地址:https://coding.net/u/yimocoding/p/WeDemo/git/tree/SeleniumDemo/SeleniumDemo

701
来自专栏编程

【依葫芦画瓢】SSM-CRUD-3

继续上一篇的讲解【依葫芦画瓢】SSM-CRUD --- 2 概要: 服务端返回json数据,构建员工列表 完成员工新增功能 增加表单前后端校验(jQuery+J...

2415
来自专栏陈满iOS

iOS·采用第三方(百度地图SDK)实现定位等功能开发

首先,申请一个baidu账号,接着进入新建密钥入口申请成为baidu地图开发者,填写相关开发者信息和短信验证码。接下来点击创建应用,如官方文档新建密钥文档指南里...

1503
来自专栏Porschev[钟慰]的专栏

Asp.Net无刷新上传并裁剪头像

开发网站几乎都做过上传图片并截图,做个无刷新Asp.Net上传并截图示例 实现功能: 1.选择文件,自动上传并生成缩放图(上传带进度条),形成预览图 2.在预览...

2597
来自专栏coding...

基于55-go的二次开发GUI版本Mac&Win&Linux写在前面项目简介代码Tips&工具最后

一直想搞win版本的,毕竟win的用户量是大头。 由于没有win的电脑,加上C#版本的55实在看不懂,只能去考虑跨平台了。 于是,golang来了~也是因为...

1416
来自专栏Django Scrapy

Linux 桌面环境和快捷键

实际上linux桌面是一套软件,linux本人不喜欢图像化界面,这是后来使用的人太对做的改进。 类似 Windows95 之前的 Windows 的图形界面实则...

3568
来自专栏青枫的专栏

Dash:程序员的的好帮手

  作为一名死coder,每天最常见的动作就是查看各种API文档,你一定也有过同时打开N个窗口(HTML、PDF、CHM),不停的在编辑器与文档之间切换的感受吧...

902
来自专栏Java后端技术

WIN7 64位系统下,右下角的声音和电源图标不见的解决办法

  近日,电脑突然出现任务栏右下角的声音和电源图标消失不见的问题,重启仍旧没有修复,后来找到了解决办法

641
来自专栏happyJared

IDEA快捷键拆解系列(二):File篇

  以下是关于File导航项及其每一子项的拆解,其中,加粗部分的选项是博主认为比较重要的。

561

扫码关注云+社区