美文网首页Android 优化相关
代码优化--Android Lint(二)

代码优化--Android Lint(二)

作者: 蓝璃penn | 来源:发表于2019-10-23 17:28 被阅读0次

    Android lint是在ADT16(Android SDK Tools 16 )提供的新工具,它是一个代码扫描工具,用于检测 Android 的代码质量。developers介绍

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

    • Correctness: 不够完美的编码,比如硬编码、使用过时 API 等 ;
    • Performanc: 对性能有影响的编码,比如:静态引用,循环引用等 ;
    • Internationalization: 国际化,直接使用汉字,没有使用资源引用等 ;
    • Security: 不安全的编码,比如在 WebView 中允许使用 JavaScript Interface 等 ;
    • Usability: 可用的,有更好的替换的,比如排版、图标格式建议.png格式 等 ;
    • Accessibility: 辅助选项,比如 ImageView 的 contentDescription 往往建议在属性中定义等;

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

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

    Android Studio直接使用Lint检查项目

    Android Studio 2.0 以后,谷歌将 Lint 检查整合到了 IDE 之中,提供了方便的图形界面操作,检测结果也会在底部 Inspection Results 中展现。

    Lint规则配置
    在开始之前,可以通过对 lint.xm / lintOptions 的配置去实现符合自己项目的 Lint 检测规则。

    lintOptions: 定义在 gradle(build.gradl) 文件中,下面列举 lintOptions 可定义的选项。

    android {
        lintOptions {
            // true--关闭lint报告的分析进度
            quiet true
            // true--错误发生后停止gradle构建
            abortOnError false
            // true--只报告error
            ignoreWarnings true
            // true--忽略有错误的文件的全/绝对路径(默认是true)
            //absolutePaths true
            // true--检查所有问题点,包含其他默认关闭项
            checkAllWarnings true
            // true--所有warning当做error
            warningsAsErrors true
            // 关闭指定问题检查
            disable 'TypographyFractions', 'TypographyQuotes'
            // 打开指定问题检查
            enable 'RtlHardcoded', 'RtlCompat', 'RtlEnabled'
            // 仅检查指定问题
            check 'NewApi', 'InlinedApi'
            // true--error输出文件不包含源码行号
            noLines true
            // true--显示错误的所有发生位置,不截取
            showAll true
            // 回退lint设置(默认规则)
            lintConfig file("default-lint.xml")
            // true--生成txt格式报告(默认false)
            textReport true
            // 重定向输出;可以是文件或'stdout'
            textOutput 'stdout'
            // true--生成XML格式报告
            xmlReport false
            // 指定xml报告文档(默认lint-results.xml)
            xmlOutput file("lint-report.xml")
            // true--生成HTML报告(带问题解释,源码位置,等)
            htmlReport true
            // html报告可选路径(构建器默认是lint-results.html )
            htmlOutput file("lint-report.html")
            //  true--所有正式版构建执行规则生成崩溃的lint检查,如果有崩溃问题将停止构建
            checkReleaseBuilds true
            // 在发布版本编译时检查(即使不包含lint目标),指定问题的规则生成崩溃
            fatal 'NewApi', 'InlineApi'
            // 指定问题的规则生成错误
            error 'Wakelock', 'TextViewEdits'
            // 指定问题的规则生成警告
            warning 'ResourceAsColor'
            // 忽略指定问题的规则(同关闭检查)
            ignore 'TypographyQuotes'
        }
    }
    

    lint.xml:用来指定你想禁用哪些lint检查功能,以及自定义问题严重度 (problem severity levels),此时可以通过 lintOptions 中的 lintConfig file("lint.xml") 来指定配置文件的所在目录。

    Lint.xml 中关键是对 issue(用id指定)的 severity 进行指定,lint.xml文件由一个封闭的父标签组成,它包含了一个或者多个子标签。Lint为每一个定义了唯一的id属性值,通过设置标识的安全属性,你可以改变一个问题的安全级别,或者这个问题的 lint检查,并且可以指定该 issue作用于指定的文件还是当前项目。
    把 lint.xml放在项目的根目录中,命令行执行 lint时候,lint就会用lint.xml中的规则。另外,执行 lint时还可以用参数 –config 指定一个全局的配置用于所有的项目。当项目中已有 lint.xml,则对于某个 issue而言,在lint.xml中没有对该 issue特别定制的情况下,–config指定的文件中的该 issue的定制才起作用。 整体结构如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <lint>
        <!-- 需要配置的 issues 列表 -->
        <!-- 关闭对应的检测-->
        <issue id="IconMissingDensityFolder" severity="ignore" />
    
        <!-- 在一些特定的文件中关闭对应的检测 -->
        <issue id="ObsoleteLayoutParam">
            <ignore path="res/layout/activation.xml" />
            <ignore path="res/layout-xlarge/activation.xml" />
        </issue>
    
        <!-- 将对应的检测级别修改 -->
        <issue id="HardcodedText" severity="error" />
    </lint>
    

    id 的获取我们可以通过命令行 lint --list 获取。如果无法直接执行 lint 命令,我们可以在 /.bash_profile 中添加 PATH="~/Library/Android/sdk/tools/bin:${PATH}" 即可。

    使用方式

    1. 选择要分析的项目或者文件、文件夹,从菜单栏,选择工具栏 - > Analyze -> Inspect Code;

    2. 选择检查的范围(整个工程/指定Module/指定文件/文件夹)

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

    3. 结果展示
    左侧会提示你需要修改的地方,点击某一条,右侧则会出现关于该问题的详细描述。

    部分检测结果的分析:

    4. 结果分析
    得到检查的结果后,就得开始对代码进行优化了,但是 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 警告
    只需两步:

    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">
    

    5. 检测无用资源文件
    随着不断地进行代码版本迭代,非常容易遗留一些无用的代码/源文件,这时可以通过直接指定检测无用资源,实现 Lint 清除。
    方法:工具栏 -> Analyze -> Run Inspection By Name..,输入要检测的内容(此时是unused resources,当然也可以删选其他内容),然后再选择检测范围开始检测。

    检测内容

    当检测出的无用资源过多时,你会发现一个一个处理时多么的繁琐,这时可以注意到,下图右边有解决方法:Remove All Unused Resources,点击后,就没有了。
    注:使用该方法后可能会造成某些资源误删的情况,因此删除之后不要忘记编译运行,利用 git 对其中误删资源进行 reset。

    检测结果

    对于无用资源的处理方式有:

    • "Remove All Unused Resources ":移出无用资源;
    • "Remove Declaration for XXX ":移出对XXX的声明;
    • "Add a tools:keep attribute to mark as implicitly used ":添加 tools:keep 属性来标记隐式使用,在XML 文件的根元素 resources 里自动添加了 tools 命名空间,再加上"tools:keep" 。
    tools:keep
    适用于 <resources> 资源标签。当开启了资源压缩(shrinking resource)功能时,这个属性允许你指定哪些资源需要被保留。
    因为开启了资源压缩功能后,未被引用的资源文件会在构建过程中被移除,而部分使用 Resources.getIdentifier() 进行引用的资源文件可能被误删。
    此时我们可以使用该属性 指定哪些资源需要保留,不能被移除。
    
    <?xml version="1.0" encoding="utf-8"?>
    <resources xmlns:tools="http://schemas.android.com/tools"    
    tools:keep="@layout/used_1,@layout/used_2,@layout/*_3" />
    

    可参考:Android开发技巧之xml tools属性详解

    参考文章:
    阿里的代码规范检测插件
    Android 性能优化:使用 Lint 优化代码、去除多余资源
    Android Studio使用Lint进行代码检查
    如何在android studio 中使用 link工具
    Android Studio 的代码检查功能,使用 Lint 工具优化代码(笔记)
    Android性能优化之工具篇 — — Android Lint
    Inspect Code功能
    Lint工具使用实录及整理

    相关文章

      网友评论

        本文标题:代码优化--Android Lint(二)

        本文链接:https://www.haomeiwen.com/subject/jswrmctx.html