【朝花夕拾】Lint使用篇
工作中Lint工具使用实录及整理
转载请声明,转自【https://www.cnblogs.com/andy-songwei/p/7090934.html】,谢谢!
AndroidStudio内置的Lint工具,对app中的代码规范带来了极大的方便。对内存泄漏、代码冗余、代码安全、国际化、代码规范等很多方面都能检测,是一款非常强大的工具。本篇文章是自己使用过程中的过程记录,包括问题检测,问题分析,问题解决等做了一些总结。希望能对读者有一定的帮助。
对该工具的扫盲,不再本篇范畴内,读者可以参考:
(1)Android lint 简介:http://blog.csdn.net/hudashi/article/details/8333349;
(2)如何在android studio 中使用 link工具:http://www.cnblogs.com/cheerego/p/5175764.html
1.Inspection Result for Inspection Profile 'Project Default'
2 该项给了两类提示
(1) Image without contentDescription:
问题概要:[Accessibility] Missing contentDescription attribute on image
解决办法:所有的imageview都添加属性 android:contentDescription="@string/desc" 此处字符串不能为“”
说明:其实这个属性是方便一些生理功能有缺陷的人使用应用程序的。比如我们有一个ImageView里面放置一张颜色复杂的图片,可能一些色弱色盲的人,分不清这张图片中画的是什么东西。如果用户安装了辅助浏览工具比如TalkBack,TalkBack就会大声朗读出用户目前正在浏览的内容。TextView控件TalkBack可以直接读出里面的内容,但是ImageView TalkBack就只能去 读contentDescription的值,告诉用户这个图片到底是什么。
参考:https://stackoverflow.com/questions/8500544/android-lint-contentdescription-warning
(2) Missing labelFor attribute
问题概要:No label views point to this text field with an android:labelFor="@+id/@+id/editableHeight" attribute
解决办法:EditText添加labelFor属性,其值为对应的id
参考:http://blog.csdn.net/kx_nullpointer/article/details/18499509
3 Android>Lint>Correctness>Message
(1)Potential Plurals
问题概要:在字符串的国际化工程中,有一个英文字符串为:<string name="details_title">%1$d of %2$d items:</string>
lint提示warning:Formatting %d followed by words ("items"): This should probably be a plural rather than a string
解决办法:在该项使用plurals的形式定义该字符串
<plurals name="number_of_albumset_video">
<item quantity="one">%1$d video</item>
<item quantity="other">%1$d videos</item>
</plurals >
主要是针对不同语言对单复数等形式的数据进行处理
(2)Unused quantity translations
问题概要: 在中文字string.xml中定义了如下的字符串:
<plurals name="number_of_albumset_photo">
<item quantity="one">%1$d 张照片</item>
<item quantity="other">%1$d 张照片</item>
</plurals >
lint提示For language "zh" (Chinese) the following quantities are not relevant: one
解决办法:中文中没有单复数的区分,所以,将"<item quantity="one">%1$d 张照片</item>" 删除即可
4.Android>Lint>Usability
(1) Button should be borderless
问题概要:在Button控件设置如下属性android:layout_width="0dp" android:layout_weight="1" 时,提示warning
解决办法:添加 style="?android:attr/buttonStyle" 属性
参考:http://blog.csdn.net/lyalei/article/details/48025417
(2) Missing inputType or hint
问题概要:使用EditText时,需要添加一些必备的属性,如hint,inputType等,否则会提示warning
解决办法:添加hint属性 android:hint="";
参考:http://blog.csdn.net/aeolus1019/article/details/8112716
(3)Missing support for Google App Indexing
不知道修改了哪里,改warning消失了 -_-
(4)Text size is too small
问题概要:从用户角度出发,官方建议开发者Avoid using sizes smaller than 12sp.
根据UI设计师的设计,该处没有修改
5. Android>Lint>Usability>Icons
该项中可以检测重复命名的图片,规范要求必须有的密度文件夹,不同文件夹下应该有针对不同密度的图片等
6.Android>Lint>Security
(1) AllowBackup/FullBackupContent Problems
问题概要:该项显示了清单文件中属性allowBackup=true使得backup/restore会导致数据不安全
解决办法:将allowBackup设置为false
参考:http://blog.csdn.net/qq_17338093/article/details/55506543
https://wenku.baidu.com/view/c43af666f342336c1eb91a37f111f18583d00c79.html(如何使用adb backup 和 adb restore 进行备份)
https://developer.android.com/preview/backup/index.html(一般打不开)
(2) Using setJavaScriptEnabled
问题概要:Using setJavaScriptEnabled can introduce XSS vulnerabilities into you application, review carefully.
解决办法:Your code should not invoke setJavaScriptEnabled if you are not sure that your app really requires JavaScript support.
添加该行:@SuppressLint("SetJavaScriptEnabled")
参考:http://blog.csdn.net/huanongjingchao/article/details/18261611
(3) ConentProvider 安全问题(没有及时现场截图)
问题概要:Exported content providers can provide access to potentially sensitive
解决办法:如果确定要给其他应用调用 设置export = "true" 时,加上tools:ignore="ExportedContentProvider",并在manifest文件开头添加tools命名空间;如果只在应用内使用,设置export = "false"
参考: https://stackoverflow.com/questions/13448480/exported-content-providers-can-provide-access-to-potentially-sensitive-data
(4) Service安全问题(没有及时现场截图)
问题概要:Exported service does not require permission
解决办法:由于我使用的Service不需要给其他app使用,设置android:exported="false"
参考:http://www.cnblogs.com/myorange/p/5425835.html
7 Android > Lint > Internationalization
(1)Hardcoded text:该项主要针对xml布局文件中的硬编码问题,[I18N] Hardcoded string "title", should use @string resource;[I18N] Hardcoded string "这是PreviewLayout", should use @string resource
(2)Overlapping items in RelativeLayout:该项主要针对RelativeLayout中部分空间相互重叠了,只要调整大小和位置即可。
(3)TextView Internationalization:该项主要针对代码中直接使用字符串的问题,尽量提取取来作为资源文件存储在xml中
8.Android > Lint > Performance(性能)
(1)FrameLayout can be replaced with <merge> tag
问题描述:xml布局文件中,FrameLayout作为根布局时,会给出该warning(自己通过观察和对比总结的,不敢保证是否准确)
解决办法:使用merge来代替FrameLayout ;
参考:https://stackoverflow.com/questions/21488027/warning-this-framelayout-can-be-replaced-with-a-merge-tag/21490723
http://blog.csdn.net/time_hunter/article/details/8664665
(2)Handler reference leaks
问题概要:Handler的使用不当引起内存泄漏
解决办法:如果按照下面参考网站的建议,handler被定义为static,那么其中引用的很多变量和方法都必须定义为static,会比较麻烦。笔者在按照提其给定的方法 private final MyHandler mHandler = new MyHandler(this); 实例化静态handler的时候甚至连编译都无法通过,this处报错。自己通过尝试,使用了如下的方法进行了处理,最终解决了hanler内存泄漏的问题
private Handler mHandler = new Handler(getMainLooper());
参考:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1106/1922.html (引用了权威开发者的建议,对handler做了一定深度的剖析)
(3) HashMap can be replaced with SparseArray
问题描述:For maps where the keys are of type integer, it's typically more efficient to use the Android SparseArray API. This check identifies scenarios where you might want to consider using SparseArray instead of HashMap for better performance.
解决办法:如果HashMap中key值为Integer或Long,使用SparseArray来取代
参考:https://stackoverflow.com/questions/25560629/sparsearray-vs-hashmap
(4) Inefficient layout weight
当在一个LinearLayout布局中仅包含一个定义weight属性的view控件时,直接指定0dp到其width或height属性更高效,因为在初始化时不再需要测量这个view控件的尺寸,反正到最后它都会霸占所有剩余空间的了。
(5) Layout has too many views
问题概要:检测某个布局文件,出现warning:activity_share_template_detail.xml has more than 80 views, bad for performance
解决办法:减少单个页面的view个数,少于80个
(6) Missing baselineAligned attribute
问题概要:When a LinearLayout is used to distribute the space proportionally between nested layouts, the baseline alignment property should be turned off to make the layout computation faster.(as中的提示)
解决办法:Set android:baselineAligned="false" on this element for better performance(as中的提示)
参考:http://markjoker.iteye.com/blog/2243398
(7) Missing recycle() calls
问题概要:Many resources, such as TypedArrays, VelocityTrackers, etc., should be recycled (with a recycle() call) after use. This lint check looks for missing recycle() calls.
解决办法:使用完后,回收即可
(8) Nested layout weights
问题概要:在布局进行嵌套使用时,父布局与子布局都使用了android:layout_weight,但不是必须使用时,会报这个warning
解决办法:根据实际情况,去掉部分weight属性
(9) Node can be replaced by a TextView with compound drawables
问题概要:A LinearLayout which contains an ImageView and a TextView can be more efficiently handled as a compound drawable (a single TextView, using the drawableTop, drawableLeft,drawableRight and/or drawableBottom attributes to draw one or more images adjacent to the text). If the two widgets are offset from each other with margins, this can be replaced with a drawablePadding attribute.
解决方法:使用一个Textview + compound drawables 可以替代掉 一个LinearLayout 嵌套 textview和imageview的布局,效率和代码量明显极大地优化了
(10) Obsolete layout params
问题概述:The given layout_param is not defined for the given layout, meaning it has no effect. This usually happens when you change the parent layout or move view code around without updating the layout params.This will cause useless attribute processing at runtime, and is misleading for others reading the layout so the parameter should be removed.
解决办法:把无效的属性删除即可。比如LinearLayout子布局中使用layout_toRightOf属性,属于无效属性
(11)Overdraw: Painting regions more than once
问题概述:如果在布局文件xml中的根布局中使用background属性,会和主题中的background产生重复绘制,导致了“overdraw”
If you set a background drawable on a root view, then you should use a custom theme where the theme background is null. Otherwise, the theme background will be painted first, only to have your custom background completely cover it; this is called "overdraw". NOTE: This detector relies on figuring out which layouts are associated with which activities based on scanning the Java code, and it's currently doing that using an inexact pattern matching algorithm. Therefore, it can incorrectly conclude which activity the layout is associated with and then wrongly complain that a background-theme is hidden. If you want your custom background on multiple pages, then you should consider making a custom theme with your custom background and just using that theme instead of a root element background. Of course it's possible that your custom drawable is translucent and you want it to be mixed with the background. However, you will get better performance if you pre-mix the background with your drawable and use that resulting image or color as a custom theme background instead.
解决办法:在自定义主题中将background设置为null。因为不是每个界面的根布局都使用同一个背景 ,需要自己定义,所以最好在主题中处理(根据自己的项目中的情况来的)
(12)Unused resources
该处列出了app中的没有使用过的各种资源,包括图片,anim文件,颜色,字符串等
9. Android > Lint > Usability > Typography
该项主要检验一些排版错误
(1) 问题概要:在字符串中用三个"."表示省略号"…" ,导致提示warning:Replace "..." with ellipsis character (…, …) ? (at line 551)
解决办法:使用标准的省略号"…"
(2)问题概要:在字符串中使用了非标准的连字符,导致提示warning:Replace "-" with an "en dash" character (–, –)
解决办法:用“–”(有;没有"")代替“–”;(没有找到此处应该用的标注符号)
参考:部分符号对应的编码 http://www.w3school.com.cn/tags/html_ref_symbols.html
更新中...
【朝花夕拾】Lint使用篇的更多相关文章
- 【朝花夕拾】Handler篇(二)
前言 一年前写过一篇文章[朝花夕拾]Handler篇,随着这一年来对Handler更多的认识和理解,本文对Handler知识点做的一些补充. 一.为什么要引入Handler Handler的主要作用是 ...
- 【朝花夕拾】Handler篇
如果您的app中没有使用过Handler,那您一定是写了个假app:如果您笔试题中没有遇到Handler相关的题目,那您可能做了份假笔试题:如果您面试中没被技术官问到Handler的问题,那您也许碰到 ...
- Android多线程之(一)——View.post()篇
前言 提起View.post(),相信不少童鞋一点都不陌生,它用得最多的有两个功能,使用简便而且实用: 1)在子线程中更新UI.从子线程中切换到主线程更新UI,不需要额外new一个Handler实例来 ...
- Android多线程之(一)View.post()源码分析——在子线程中更新UI
提起View.post(),相信不少童鞋一点都不陌生,它用得最多的有两个功能,使用简便而且实用: 1)在子线程中更新UI.从子线程中切换到主线程更新UI,不需要额外new一个Handler实例来实现. ...
- Android内存溢出、内存泄漏常见案例及最佳实践总结
内存溢出是Android开发中一个老大难的问题,相关的知识点比较繁杂,绝大部分的开发者都零零星星知道一些,但难以全面.本篇文档会尽量从广度和深度两个方面进行整理,帮助大家梳理这方面的知识点(基于Jav ...
- TGL站长关于常见问题的回复
问题地址: http://www.thegrouplet.com/thread-112923-1-1.html 问题: 网站配有太多的模板是否影响网站加载速度 月光答复: wp不需要删除其他的模板,不 ...
- 【朝花夕拾】四大组件之(二)Service篇
一.Service是什么 对于这个问题,想必大家都能说出一二,如“它是四大组件之一”.“在后台处理一些操作”等.咱们这里看看官方文档中的描述,官方语言一般都是准确且言简意赅的,这里可以体验一下其风格. ...
- 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇
前言 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一.Android系统的运行由大量相互独立的进程相互协助来完成的,所以Android进程间通信问题,是做好Andro ...
- 【朝花夕拾】Android性能篇之(六)Android进程管理机制
前言 Android系统与其他操作系统有个很不一样的地方,就是其他操作系统尽可能移除不再活动的进程,从而尽可能保证多的内存空间,而Android系统却是反其道而行之,尽可能保留进程.An ...
随机推荐
- Linux文件名匹配和输出重定向--2019-4-24
1.文件名匹配 例:rm *.bak; 删除结尾是.bak的文件 rm *4*.bak; 删除名称中有“4”的.bak文件 ls *.????; 查找结尾是“.”后有四个字母的文件 2.管道 先进 ...
- Mysql学习笔记03
Mysql 的视图 1 view 在查询中,我们经常把查询结果当成临时表来看, view 是什么? View 可以看成一张虚拟的表,是表通过某种运算得到的有一个投影. 2 如何创建视图? 创建视图 ...
- 七、OpenStack—dashboard组件安装
1.安装包# yum install openstack-dashboard2.编辑 /etc/openstack-dashboard/local_settings 文件 需要更改的几处内容如下: ) ...
- [CF1093E]Intersection of Permutations
[CF1093E]Intersection of Permutations 题目大意: 给定两个长度为\(n(n\le2\times10^5)\)的排列\(A,B\).\(m(m\le2\times1 ...
- Python数据科学手册
Python数据科学手册(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1KurSdjNWiwMac3o3iLrzBg 提取码:qogy 复制这段内容后打开百度网盘手 ...
- centos7系统下 docker 环境搭建
运行环境: VMware Workstation Pro 在虚拟机中安装centos7系统, 选择最小安装, 网络连接方式选择的桥接(与宿主机在同一IP段)centos7一定要安装64位, docke ...
- PHP调用微信wx_JSSDK录音并播放,
<?php require_once "jssdk.php"; $jssdk = new JSSDK("wx7a862ec806328ca2", &quo ...
- ajax(2)
AJAX全称: Asynchronous JavaScript and XML ( 异步的JavaScript 和 XML) Ajax的本质就是:XMLHttpRequest 对象: 案例: v ...
- Android中ListView的简单使用
动态添加单行列表: 首先前提是你的布局文件里有一个ListView 单行列表的添加只需要一个list集合即可,使用ArrayAdapter数组适配器绑定更新就行了 首先声明一个ArrayAdapter ...
- vue创建状态管理(vuex的store机制)
1:为什么说要是永远状态管理 在使用 Vue 框架做单页面应用时,我们时常会遇到传值,组件公用状态的问题.(子父间传值文章传送门) ,如果是简单的应用,兄弟组件之间通信还能使用 eventBus 来作 ...