《PC-Lint检测中的常见错误》 android - lint 常见错误

错误编码  错误说明      举例

40    变量未声明 
506    固定的Boolean值     char c=3;
            if(c<300){}
525    缩排格式错误 
527    无法执行到的语句    if(a > B)
            return TRUE;
            else
             return FALSE;
            return FALSE;
529    变量未引用      检查变量未引用的原因
530    使用未初始化的变量 
534    忽略函数返回值 
539    缩排格式错误 
545    对数组变量使用&     char arr[100], *p;
            p=&arr;
603    指针未初始化     void print_str(const char *p);
            …
            char *sz;
            print_str(sz);
605    指针能力增强     void write_str(char *lpsz);
            …
            write_str(“string”);
613    可能使用了空指针 
616    在switch语句中未使用break; 
650    比较数值时,常量的范围超过了 if( ch == 0xFF ) ...
    变量范围 
713    把有符号型数值赋给了无符号型
    数值 
715    变量未引用 
725    Indentation错误 
734    在赋值时发生变量越界   int a, b, c;
            …
            c=a*b;
737    无符号型变/常量和有变量型
    变/常量存在于同一个表达式中。  
744    在switch语句中没有default 
752    本地声明的函数未被使用 
762    函数重复声明 
774    Boolean表达式始终返回真/假  char c;
            if(c < 300)

3.1.  检查级别设置

Android-Lint所要检查的问题以Issue来描述。

Issue9类(Category):

  

Issue以一个文本短语来作为id,对Issue的定制等操作都是基于id

Android lintSeverity来标识该Issue的危害程度:Fatal/ Error / Warning/

Information/IgnoreIssue的忽略操作其实也就是降低它的SeverityIgnore

Eclipse 中可以在菜单windowàpreferenceàlint error checking中设置规则的检级

级别。

3.2  定制Lint检查的规则

对Android-Lint发现的问题,我们需要进一步的处理:是确实存在的我们自己的设计问题,要解决它;对无关紧要或者是我们特别设计的问题,要在Android-Lint中忽略掉

Android-Lint有默认的检查和报错的规则,但是也可以在Eclipse或者命令行下改变这种规则,从而可以定制Lint检查的规则。

 

 

常见的提示及其原因和解决

4.1

1) 错误原因:res中作了支持多种语言的strings.xml,但是里面的内容却没有一一对应(或多或少),如上例: 在中文版的strins.xml里有定义sort_letter等字串,在英文版的string.xml里却没有定义。

android 的建议是: If an application has more than onelocale, then all the strings declared in one language should also be translatedin all other languages.

2) 解决办法: 补全缺少翻译的字串

4.2           

1) 错误地方:

2) 提示:

"main_landscreen_filtration_packagename" is nottranslated in zh-rCN"

3) 错误原因:

         此例实际是上例的补充,当有些字串确实只需要一种语言,而不需要翻译成其它语言的,你也不应该不去理会它,处理方法之一是加上合适的属性translatable="false"。

Android的建议是: If the string should not be translated,you can add the attribute translatable="false" on the <string>element

4) 解决后:

 

4.3

1) 地方:

2)提示:

Replace "..." with ellipsischaracter (…, &#8230;) ?

3)原因:

HTML特殊字符需用编码代替,注意 &#; 这三个符号都不能少。

其它一些常见的特殊字符,“–”需要用“&#8211;”;“—”需要用“&#8212;”

“½”需要用“&#189;”

4)解决后:

 

4.4

1) 错误地方:

2) 提示: Should use"sp" instead of "dp" for text sizes

3) 错误原因:

         为了适应不同的屏幕分辨率,字体大小的单位应该使用 sp 进行计量

Android的建议: When setting text sizes, you should normallyuse sp, or "scale-independent pixels". This is like the dp unit, butit is also scaled by the user's font size preference

4) 解决后:

4.5

1) 出错地方:

2) 提示: Avoid using "px" as units; use"dp" instead

3) 出错原因:

         1.dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。 
    这里要特别注意dip与屏幕密度有关,而屏幕密度又与具体的硬件有关,硬件设置不正确,有可能导致dip不能正常显示。在屏幕密度为160的显示屏上,1dip=1px,有时候可能你的屏幕分辨率很大如480*800,但是屏幕密度没有正确设置比如说还是160,那么这个时候凡是使用dip的都会显示异常,基本都是显示过小。 
     dip的换算: 
           dip(value)=(int) (px(value)/1.5 + 0.5) 
2. dp: 很简单,和dip是一样的。 
3. px: pixels(像素),不同的设备不同的显示屏显示效果是相同的,这是绝对像素,是多少就永远是多少不会改变。 
4.  sp: scaled pixels(放大像素). 主要用于字体显示bestfor textsize。 

备注: 根据google的推荐,像素统一使用dip,字体统一使用sp  

 

         Android的建议: Avoid using"px" as units; use "dp" instead

4) 解决后:

     4.6

1) 出错地方:

         <stringname="page_num">第1/5页</string>

         R.drawable.menu_tab_on

2) 提示:

The resource R.drawable.menu_tab_on appears to be unused

          The resourceR.string.page_num appears to be unused

The following unrelated icon fileshave identical contents: bar_selecd.png,local_music_progressbar_indicator.9.png

3) 错误原因

         资源里有图片或者字串,在代码里没有用到,应该删掉以节省空间和编译时间

Android建议: Unused resources make applications largerand slow down builds.

 

4.7

1) 出错地方:

        

2) 提示:

         Missing contentDescription attribute on image

3) 错误原因:

      这是ADT 16.0的新特性,在一些没有文本显示的控件里,如imageView和imageButton等,ADT会提示你定义一个android:contentDescription属性,用来描述这个控件的作用,设置View的备注说明。
           在界面上不会有效果,自己在程序中控制,可临时放一点字符串数据。

       Android建议: Non-textual widgets like ImageViews andImageButtons should use the contentDescription attribute to specify a textualdescription of the widget such that screen readers and other accessibilitytools can adequately describe the user interface.

4) 解决后:

 

4.8

1) 出错地方:

2) 出错提示:

         <uses-permission> tag appears after <application>tag

3) 出错原因:

         androidManifest.xml中,uses-permission、uses-sdk等界定应用需要的标签应该置于<application>标签之前,否则有可能会出现一些小的bug(如一些主题得不到正确应用等)。

    Andriod建议: The <application> tag should appearafter the elements which declare which version you need, which features youneed, which libraries you need, and so on.

4) 解决后:

4.9

1) 警告地方: 

2) 警告提示: 

         <uses-sdk> tag should specify a target API level

3) 警告原因: 

         Uses-sdk应该同时具备minSdkVersion和targetSdkVersion属性

Android建议:The manifest should contain a<uses-sdk> element which defines the minimum minimum API Level requiredfor the application to run, as well as the target version (the highest APIlevel you have tested the version for.)

4) 解决后:

 

4.10

1) 警告地方:

2) 警告提示:

         Permission is only granted to system apps

3) 警告原因:

         该类权限仅有系统级别的应用才可以使用,其它的一般应用在Manifest.xml里面申明是没有效果的

Android建议: Permissions with the protection levelsignature or signatureOrSystem are only granted to system apps. If an app is aregular non-system app, it will never be able to use these permissions.

 

4.11

1) 出错地方:

        

2) 提示:

         Should explicitly set android:allowBackup to true or false

3) 错误原因:

     adbbackup -apk com.imangi.templerun -f D:\test.ab,该命令不需要解锁 刷ROOT 

所以对应用来说是具有一定安全隐患的,

          从应用数据的安全角度出发,android建议在application标签内明确加上android:allowBackup的属性,来明确你是否允许用户自行备份数据。只有当android:allowBackup="true"后,用户才可以通过adb backup 和 adb restore命令来对设备上应用的数据进行备份和恢复,备份后,应用的所有数据可以被用户查看。

虽然android默认了该属性为true值,但还是提倡在Manifest上明确指定你是否希望自己的应用数据被用户备份、访问和恢复。

4) 解决后:

 

4.12

1) 警告地方:

 2) 警告提示:

Exported service does not require permission

3) 原因:

         为了安全起见,Exportedservice,应该设置用户权限来让相应的应用才可以绑定和使用该服务,如果不设置,就是任何应用都可以随意绑定和使用该服务。当然,如果你的服务确实

仅供自己用,谢绝他人的话,也可以指定exported=false属性

Android建议: Exportedservices (services which either set exported=true or contain an intent-filterand do not specify exported=false) should define a permission that an entitymust have in order to launch the service or bind to it. Without this, any application can use this service.

4) 解决后:

 

4.13

1) 出错地方:

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

   android:layout_width="155dp"

   android:layout_height="189dp"

   android:orientation="vertical" >

    <ImageView

       …....

                 />

    <TextView

        ……

/>

</LinearLayout>

2) 提示:This tag and its childrencan be replaced by one <TextView/> and a compound drawable

3) 出错原因:

         当一个Layout里面,只包含简单的ImageView,TextView时,应该换成一个TextView加

图片的方式,这样更有效率

如android建议:ALinearLayout which contains an ImageView and a TextView can be more efficientlyhandled as a compound drawable

4) 解决后:

Xml里

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

   android:layout_width="155dp"

    android:layout_height="189dp"  />

<TextView

         android:id="@+id/recentAppName"

        ……

/>

</LinearLayout>

代码里

TextView appName= (TextView) v.findViewById(R.id.recentAppName);

appName.setText(appUnit.getAppName());

         Drawable appIcon =appUnit.getAppIcon();

         appIcon.setBounds(0,0, 120, 120);

appName.setCompoundDrawables(null,appIcon, null, null);

 

4.13

1) 出错地方:

2) 错误提示:

Do not hardcode "/sdcard/"; use Environment.getExternalStorageDirectory().getPath()instead

3) 错误原因:

         Hardcode问题

andriod建议: Your code should not reference the /sdcardpath directly; instead use Environment.getExternalStorageDirectory().getPath()

4) 解决后:

 

4.14

1) 警告地方:

2) 警告提示:

         Use Integer.valueOf(nValue) instead

3) 原因:

    New Integer(): 每次都会创建一个新的对象,即在内存中开辟新的空间

         Integer.valueof(): 当传入的整数是-128~127之外时,才会去调用一个new Integer()方法去创建一个新的对象,否则会使用静态类IntegerCache中的cache里的对象。基本上平时的程序中,这个范围的整数是最常用的。所以采用valueof方式,会更有效率和节省内存。Long等其它类型也同理。

Andriod的建议:You shouldnot call the constructor for wrapper classes directly, such as`newInteger(42)`. Instead, call the valueOf factory method,such as Integer.valueOf(42). This will typically use less memory because commonintegers such as 0 and 1 will share a single instance.

4) 解救后:

 

4.17

1) 警告地方:

        

2)提示:

Implicitly using the defaultlocale is a common source of bugs: Use toLowerCase(Locale) instead

3) 原因:

         使用字串的大小写转换方法时,应该明确地指定语言环境,而不应该简单地调用toLowerCase()了事(系统默认的语言环境)。

         一个很明显的例子就是: 土耳其语言里,字母 “i”的大写形式是 ”İ”,而不是” I” .如果系统的默认语言是英语的话,直接调用toLowerCase()自然就会转换出错。

4)解决后:

      

 

4.8

1) 错误地方:

2) 提示:

This Handler class should bestatic or leaks might occur (com.tcl.simpletv.myapps.StartActivity.MainHandler)

3) 错误原因:

     在Android中,Handler特别是当它作为内部类,且里面有访问到外部类的成员时,此Handler类应该申明为static类型,否则有可能造成泄露。在程序消息队列中排队的消息保持了对目标Handler类的应用。如果Handler是个内部类,那么它也会保持它所在的外部类的引用。为了避免泄露这个外部类,应该将Handler声明为static嵌套类,访问外部类时时,使用对外部类的弱应用。

         private HandlermMainHandler;

         mMainHandler= new MainHandler(this);

static class MainHandler extends Handler {

                  WeakReference<StartActivity>mActivity;

                   publicMainHandler(StartActivity activity) {

                            mActivity = newWeakReference<StartActivity>(activity);

                            //TODO Auto-generated constructor stub

                   }

                   @Override

                   public voidhandleMessage(Message msg) {

                            StartActivitytheActivity = mActivity.get();

                            switch(msg.what) {

                            caseGET_APP_LIST:

                                     theActivity.getInstalledAppsData();

                                     break;

                            default:

                                     break;

                            }

                   }

         }

4.16

1) 警告地方:

2) 警告提示:

Use newSparseIntArray(...) instead for better performance

3) 原因:

         SparseArray是android里为<Interger,Object>这样的Hashmap而专门写的类,目的是提高效率,其核心是折半查找函数(binarySearch)

         在Android中,当我们需要定义HashMap<Integer,E>hashmap = new HashMap<Integer,E>

时,可以使用如下的方式来取得更好的性能

         SparseArray<E>sparseArray = new SpaseArray<E>()

4) 解决后:

 

 

 

 

当然,并不是Android Lint发现的所有错误在任何时候都是合理的,你可以根据你的实际情况选择采纳或者忽略。但我强烈建议大家把每个错误里的详细描述都看一下,这是非常好的学习资料,因为这些错误(或者说是建议)可以说是长久以来android开发经验的一个汇总,非常有价值,其价值甚至超过了发现的问题本身。

…………………….


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
不多说了 直接上目录: 1. C 语言的指针和内存泄漏 5 2. C语言难点分析整理 10 3. C语言难点 18 4. C/C++实现冒泡排序算法 32 5. C++指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C可变参数函数实现 38 8. C程序内存组成部分 41 9. C编程拾粹 42 10. C语言实现数组的动态增长 44 11. C语言的位运算 46 12. 浮点数的存储格式: 50 13. 位域 58 14. C语言函数二维数组传递方法 64 15. C语言复杂表达式的执行步骤 66 16. C语言字符串函数大全 68 17. C语言宏定义技巧 89 18. C语言实现动态数组 100 19. C语言笔试-运算符和表达式 104 20. C语言编程准则之稳定篇 107 21. C语言编程常见问题分析 108 22. C语言编程易犯毛病集合 112 23. C语言缺陷与陷阱(笔记) 119 24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与return的差别 141 30. extern与static存储空间矛盾 145 31. PC-Lint与C\C++代码质量 147 32. spirntf函数使用大全 158 33. 二叉树的数据结构 167 34. 位运算应用口诀和实例 170 35. 内存对齐与ANSI Cstruct内存布局 173 36. 冒泡和选择排序实现 180 37. 函数指针数组与返回数组指针的函数 186 38. 右左法则- 复杂指针解析 189 39. 回车和换行的区别 192 40. 堆和堆栈的区别 194 41. 堆和堆栈的区别 198 42. 如何写出专业的C头文件 202 43. 打造最快的Hash表 207 44. 指针与数组学习笔记 222 45. 数组不是指针 224 46. 标准C字符串分割的方法 228 47. 汉诺塔源码 231 48. 洗牌算法 234 49. 深入理解C语言指针的奥秘 236 50. 游戏外挂的编写原理 254 51. 程序实例分析-为什么会陷入死循环 258 52. 空指针究竟指向了内存的哪个地方 260 53. 算术表达式的计算 265 54. 结构体对齐的具体含义 269 55. 连连看AI算法 274 56. 连连看寻路算法的思路 283 57. 重新认识:指向函数的指针 288 58. 链表的源码 291 59. 高质量的子程序 295 60. 高级C语言程序员测试必过的十六道最佳题目+答案详解 297 61. C语言常见错误 320 62. 超强的指针学习笔记 325 63. 程序员之路──关于代码风格 343 64. 指针、结构体、联合体的安全规范 346 65. C指针讲解 352 66. 关于指向指针的指针 368 67. C/C++ 误区一:void main() 373 68. C/C++ 误区二:fflush(stdin) 376 69. C/C++ 误区三:强制转换 malloc() 的返回值 380 70. C/C++ 误区四:char c = getchar(); 381 71. C/C++ 误区五:检查 new 的返回值 383 72. C 是 C++ 的子集吗? 384 73. C和C++的区别是什么? 387 74. 无条件循环 388 75. 产生随机数的方法 389 76. 顺序表及其操作 390 77. 单链表的实现及其操作 391 78. 双向链表 395 79. 程序员数据结构笔记 399 80. Hashtable和HashMap的区别 408 81. hash 表学习笔记 410 82. C程序设计常用算法源代码 412 83. C语言有头结点链表的经典实现 419 84. C语言惠通面试题 428 85. C语言常用宏定义 450 有需要的朋友可以根据需求下载,内容为WORD格式的,绝对清晰

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值