Android 性能优化:使用 Lint 优化代码、去除多余资源
前言
在保证代码没有功能问题,完成业务开发之余,有追求的程序员还要追求代码的规范、可维护性。
今天,以“成为优秀的程序员”为目标的拭心将和大家一起精益求精,学习使用 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 报的某些警告的确是没必要,这时我们可以选择忽略这些警告。忽略警告可以分两种:
- 在 Java 代码中
- 在 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 警告:
只需两步:
- xml 中声明 tools 命名空间
- 使用 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,放个大图显眼一点:

点击后,将删除所有的无用资源。
总结
Lint 是优秀程序员之友。
Android 性能优化:使用 Lint 优化代码、去除多余资源的更多相关文章
- Android 性能优化的方面方面都在这儿
又到周六了,鸿洋的不定期的周六放送又来了~~这次来谈谈性能优化吧.大家在工作中或多或少都会拿自家的应用和竞品app做比对,不可避免的需要做一些app性能优化的活.很多时候可能是策略上的调整,不过还是有 ...
- Android 性能优化(1)性能工具之「 lint 」 :Improving Your Code with lint:优化代码
Improving Your Code with lint 1.See Also lint (reference) Using Android Annotations In addition to t ...
- Android性能优化之TraceView和Lint使用详解
Android lint工具是Android studio中集成的一个代码提示工具,它主要负责对你的代码进行优化提示,包括xml和java文件,很强大.编写完代码及时进行lint测试,会让我们的代码变 ...
- Android 性能优化之使用Lint
代码静态检查推荐: (1)Android自定义Lint实践 (2)美团外卖Android Lint代码检查实践 (3)Android自定义Lint实践2——改进原生Detector Lint 是 An ...
- Android性能优化之布局优化
最新最准确内容建议直接访问原文:Android性能优化之布局优化 本文为Android性能优化的第二篇——布局优化,主要介绍使用抽象布局标签(include, viewstub, merge).去除不 ...
- 【转】Android性能优化之布局优化篇
转自:http://blog.csdn.net/feiduclear_up/article/details/46670433 Android性能优化之布局优化篇 分类: andorid 开发2015 ...
- 【Java/Android性能优化1】Android性能调优
本文参考:http://www.trinea.cn/android/android-performance-demo/ 本文主要分享自己在appstore项目中的性能调优点,包括同步改异步.缓存.La ...
- Android性能优化之中的一个 布局优化
本文为Android性能优化--布局优化,主要介绍使用抽象布局标签(include, viewstub, merge).去除不必要的嵌套和View节点.降低不必要的infalte及其它Layout方面 ...
- [原] Android性能优化方法
GPU过度绘制 打开开发者选型,"调试GPU过度绘制",蓝.绿.粉红.红,过度绘制依次加深 粉红色尽量优化,界面尽量保持蓝绿颜色 红色肯定是有问题的,不能忍受 使用Hierarch ...
随机推荐
- 【从零开始搭建自己的.NET Core Api框架】(二)搭建项目的整体架构
系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...
- [Swift]LeetCode24. 两两交换链表中的节点 | Swap Nodes in Pairs
Given a linked list, swap every two adjacent nodes and return its head. Example: Given 1->2->3 ...
- [Swift]LeetCode119. 杨辉三角 II | Pascal's Triangle II
Given a non-negative index k where k ≤ 33, return the kth index row of the Pascal's triangle. Note t ...
- 利用Zabbix来监控Windows Performance Counter
Windows的性能计数器提供了很多系统的性能指标度量,通过Windows的性能计数器,我们可以对Windows的服务器的当前运行状态有个即时的情况了解. Zabbix Agent支持(Win) pe ...
- Python档案袋(异常与异常捕获 )
无异常捕获 程序遇到异常会中断 print( xxx ) print("---- 完 -----") 得到结果为: 有异常捕获 程序遇到异常会进入异常处理,并继续执行下面程序 tr ...
- 心路历程(一)-自学java两个月心得
这是我的第一条博文,在敲这些文字的时候我已经是一名大四的"老者".说自己"老者"确实如此,因为以前每当这个时候大一新学妹有上架了,哈哈,每当这个时候我们就想了很 ...
- 死磕 java集合之TreeMap源码分析(二)- 内含红黑树分析全过程
欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 插入元素 插入元素,如果元素在树中存在,则替换value:如果元素不存在,则插入到对应的位置, ...
- 【转】关于 python ImportError: No module named 的问题
今天在 centos 下安装 python setup.py install 时报错:ImportError: No module named sysconfig, 当时急着用,就顺手直接源码编译了一 ...
- .NET跨平台开发之Xamarin.Android介绍与生命周期【2】
前言 不同于IOS,Xamarin在Visual Studio中针对Android,可以很直接的去设计使用者界面,在本系列中,子浩会针对Android目录结构以及基本控制项进行介绍,包括TextVie ...
- TP3.2框架中的字母函数解析
C的使用方法以及注意事项 使用方法: 1.读取配置 C('参数名称') 配置参数不区分大小写,存在则设置,否则返回NULL; 因为配置参数是全局有效的,因此C方法可以在任何地方读取任何配置,即使某个 ...