(八)上篇 Android 性能优化 Lint 工具使用

小酌鸡汤

青春须早为,岂能长少年。

本文来源《Android 性能优化 全家桶》

为什么通过 lint 检查改进代码?

 除了通过构建测试来确保您的应用符合其功能要求之外,您务必还要通过 lint 运行您的代码来确保代码不存在结构问题。结构不合理的代码会影响 Android 应用的可靠性和效率,并使您的代码更难以维护,而 lint 工具有助于找到这些代码。
 例如,如果 XML 资源文件包含未使用的命名空间,则不仅占用空间,还会导致不必要的处理。其他结构问题(如使用目标 API 版本不支持的已弃用的元素或 API 调用)可能会导致代码无法正常运行。 lint 可帮助您解决这些问题。

lint 工具如何处理应用源文件?

Lint工作原理
  • 应用源文件:源文件包含组成 Android 项目的文件,包括 Java、Kotlin 和 XML 文件、图标以及 ProGuard 配置文件。
  • lint.xml 文件:一个配置文件,可用于指定要排除的任何 lint 检查以及自定义问题严重级别。
  • lint 工具:一个静态代码扫描工具,您可以从命令行或在 Android Studio 中对 Android 项目运行该工具
  • lint 检查结果:您可以在控制台或 Android Studio 的 Inspection Results 窗口中查看 lint 检查结果。

现在,就一起实操体验 Lint ~

(1)lint实操环境(可选项,用自己的环境和代码也一样)
  • SamplePop环境如下:
     Android Studio 4.0
     Gradle version 6.1.1
     Android API version 30
(2)从命令行运行 lint
//windows 
gradlew lint

//Linux 或 Mac
./gradlew lint

//如果您只想对某个特定的构建变体运行 lint 任务,则在大写变体名称并在其前面加上 lint 前缀
 gradlew lintDebug

//会有如下输出:
> Task :lint:lint
Ran lint on variant debug: 9 issues found
Ran lint on variant release: 9 issues found
Wrote HTML report to file:///F:/Git/Blog/SamplePop/lint/build/reports/lint-results.html
Wrote XML report to file:///F:/Git/Blog/SamplePop/lint/build/reports/lint-results.xml

 进入文件夹,找到lint-results.html,双击这个文件


Lint命令行生成分析结果文件
Lint命令行生成分析结果展示

常见问题可以分为如下几个大类:

(1)Accessibility 辅助选项,比如ImageView的contentDescription往往建议在属性中定义等。
(2)Compliance 合规性,违反了Google Play的要求,比如使用了过期的库版本,性能、安全性、API等级等没有遵循新系统的要求等。
(3)Correctness 不够完美的编码,比如硬编码、使用过时API等。
(4)Internationalization 国际化,直接使用汉字,没有使用资源引用等
(5)Interoperability 互操作性,比如和Kotln的交互等。
(6)Performanc 对性能有影响的编码,比如:静态引用,循环引用等
(7)Security 不安全的编码,比如在 WebView 中允许使用 JavaScriptInterface等
(8)Usability 可用的,有更好的替换的 比如排版、图标格式建议.png格式等

(3)使用独立工具运行 lint(不实用,忽略即可)
//工具路径:android_sdk/tools/

//要对项目目录中的文件列表运行 lint
lint [flags] <project directory>

//例如:
lint --check MissingPrefix myproject 

//查看帮助
lint --help
(4)Lint配置

您可以配置不同级别的 Lint 检查:

  • 全局(整个项目)
  • 项目模块
  • 生产模块
  • 测试模块
  • 打开的文件
  • 类层次结构
  • 版本控制系统 (VCS) 范围
(4.1)Android Studio 中配置 Lint(内置的 Lint)
  • 在AS代码编辑器中的弹出文本查看。lint 发现问题后,会用黄色突出显示有问题的代码,而对于更严重的问题,则会在代码下面添加红色下划线。
  • 依次点击 Analyze > Inspect Code 后,在 lint Inspection Results 窗口中查看。
(4.2)配置 lint.xml 文件
//lint.xml文件建议放置在 Android 项目的根目录下,build.gradle配置如下:
android {
    lintOptions {
        lintConfig file("lint.xml")
    }
}

//lint.xml示例
 <?xml version="1.0" encoding="UTF-8"?>
    <lint>
        <!-- Disable the given check in this project -->
        <issue id="IconMissingDensityFolder" severity="ignore" />

        <!-- Ignore the UselessLeaf issue in the specified file -->
        <issue id="UselessLeaf">
            <ignore path="res/layout/main.xml" />
        </issue>

        <!-- Change the severity of hardcoded strings to "error" -->
        <issue id="HardcodedText" severity="error" />
    </lint>

(4.3)配置 Java、Kotlin 和 XML 源文件的 lint 检查
//1 配置 Java 或 Kotlin 的 lint 检查
//1.1 停用 lint 检查,请向该代码添加 @SuppressLint 注释
@SuppressLint("NewApi")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main)

//1.2 对 FeedProvider 类中的 ParserError 问题关闭 lint 检查
@SuppressLint("ParserError")
    class FeedProvider : ContentProvider() {

//1.3 禁止 lint 检查文件中的所有问题
 @SuppressLint("all")

//2 配置 XML 的 lint 检查
//2.1  tools:ignore 属性对 XML 文件的特定部分停用 lint 检查
//布局文件的 <LinearLayout> 元素中的 UnusedResources 问题关闭 lint 检查
<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>

//2.2 禁止检查多个问题,请使用以逗号分隔的字符串列出要禁止检查的问题
tools:ignore="NewApi,StringFormatInvalid"

//2.3 要禁止 lint 检查 XML 元素中的所有问题,请使用 all 关键字
tools:ignore="all"

(4.4)通过 Gradle 配置 lint 选项
//build.gradle配置如下:
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
    }
}  
(5)创建警告基准

 您可以为项目的当前警告集创建快照,然后将该快照用作将来运行检查的基准,以便只报告新问题。 有了基准快照,您便可开始使用 lint 让构建失败,而不必先返回并解决所有现有问题。
 个人感觉尤其是对多人的项目协同时,此基准特别有用。

//要创建基准快照,请修改项目的 build.gradle 文件,如下所示:
 android {
      lintOptions {
        baseline file("lint-baseline.xml")
      }
    }

//自定义基准:如果要将某些问题类型(而不是全部)添加到基准
android {
      lintOptions {
        check 'NewApi', 'HandlerLeak'
        baseline file("lint-baseline.xml")
       }
    }

 首次添加此代码行时,系统会创建 lint-baseline.xml 文件以建立基准。此后,lint 工具仅读取该文件以确定基准。如果要创建新基准,请手动删除该文件并再次运行 lint 以重新创建它。

Lint生成警告基准

 实行基准时,您会收到一条信息性警告,告知您一个或多个问题已被过滤掉,因为它们已在基准中列出。之所以发出这条警告,是为了帮您记住您已配置基准,因为理想情况下,您希望在某一时刻解决所有问题。

Lint警告基准的已过滤警告提示
(6)手动运行检查

 您可以通过依次选择 Analyze > Inspect Code,手动运行配置的 lint 及其他 IDE 检查。检查结果将显示在 Inspection Results 窗口中。
 追求细节请查阅文章末尾的谷歌官网(最全最详细)。

Lint设置检查范围和配置文件
Lint手动运行检查结果展示
赶紧对自己的项目代码实操开始吧~ 会有惊喜~

小编的扩展链接

参考链接

姿容清丽厌奢华,淡淡平平不自夸

举手之劳,赞有余香! ❤ 比心 ❤

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352