關於Android lint


原文:http://tools.android.com/tips/lint

Android-Lint是SDK Tools 16 (ADT 16)之後才引入的工具,通過代碼檢查,可發現潛在的問題,並能對Android程序進行優化處理。Android-Lint提供了命令行方式執行,還可與IDE(如Eclipse)集成,並提供了html形式的輸出報告。Android-Lint可以方便的與項目中的其他自動系統(配置/ Build / 測試等)集成。

如果沒有要求,那就在運行的時候不要使用lint,規避了很多問題,但也有可能隱藏了一些隱患。

如果不使用lint,可以右擊項目,選擇——>properties——>Android Lint Preference,在右邊點擊Configure Workspace Settings...—— >右邊Run full error check...前面的勾取消,這樣就好了。


簡單說明下幾個類型

以下內容轉自http://androiddeveloper.diandian.com/post/2013-06-14/40050380131

常見類型:
一, Correctness:Messeges
(1)字符串國際化不完全
(2)國際化的字符串,在默認位置(default locale),沒有定義 

二,Correctness
(1)Xml中view的id重名
(2)代碼中使用的某些API高於Manifest中的Min SDK
(3)字符串國際化中,同一名字的的String-Array對應的item值不相同 (4)Activity沒有註冊到Manifest
(5)使用已經廢棄的api
(6)避免使用px,使用dp
(7)添加不需要的權限

三,Performance
(1) 避免在繪製或者解析佈局(draw/layout)時,分配對象。eg,Ondraw()中實例化Paint().
(2)Layout中無用的參數。
(3)可優化的佈局:如一個線性佈局(一個Imageview和一個TextView),可被TextView和一個Compound Drawable代替。
(4)可優化的代碼:如SparseArray可代替一個Interger2Object的Hashmap
(5)優化layout,比如如果子view都是wrap_content,則設置android:baselineAligned爲false,則When set to false, prevents the layout from aligning its children's baselines.
(6)使用FloatMath代替Math,執行sin()和ceil(),以避免float的兩次轉換。
(7)Nested weight (內外均有weight)將拖累執行效果
(8)未被使用的資源
(9)Overdraw 即指定theme的activity會自己繪製背景,但是佈局中會再一次設置背景
(10)View或view的父親沒有用

四,Security
(1)設置setJavascriptEnable將導致腳本攻擊漏洞(XSS vulnerabilities)

五,Usability:Icons
(1) 圖片尺寸在轉換成不同dpi時,存在不能整除的問題,比如2*24px
(2)顯示有些base 和browser的資源名不同,但圖片內容完全相同。

六,Usability
(1)自定義view缺少默認的構造方法

七,Usability:Typography
(1)特殊字符需用編碼代替,如“_”需要用“–”

八,Accessibility
(1)ImageView缺少src內容


關於解決lint檢查出來的問題

轉載自:http://blog.csdn.net/thl789/article/details/8036066

一、忽略XML文件中的問題

 

1.1 MissingPrefix問題

Android-Lint Issue MissingPrefix

1.2 解決XML中的問題

 

可以在Lint Warnings View中解決(圖中圖標從左至右順序)

 

 Android-Lint ignore this Suppress this error with an annotation/attribute

點擊該圖標之後,直接更改了device_admin_sample.xml文件:

XML文件中直接增加了tools:ignore="MissingPrefix"

 

 Android-Lint ignore file Ignore in this file

在本文件中忽略,而在別的文件中仍然出現。

 

 Android-Lint ignore project Ignore in this project

當前項目中都忽略該Issue。

執行之後,在本項目根目錄下創建了lint.xml的文件,內容爲:

[html] view plaincopy
  1. <?xml version="1.0"encoding="UTF-8"?>  
  2. <lint>  
  3.     <issue id="MissingPrefix"severity="ignore" />  
  4. </lint>  

 

 Android-Lint ignore all Always ignore

所有項目中都忽略。


二、解決Java代碼中的問題

 

2.1 NewAPI問題  

APIDemo中指明瞭支持最低API-1,但是代碼裏卻用了API-3的接口,執行Lint會報錯:

Android-Lint Issue NewAPI

2.2 解決問題

 

把光標放在報錯代碼處,會自動提示如何快速fix。

1. 前面紅色圓角框內是用Javaannotation方式解決(API-16之後纔有):@SuppressLint‘<IssueId>’或@TargetAPI(<api>)

@SuppressLint ‘<IssueId>’用來忽略<IssueId>。適用範圍在所調用的方法處或整個類中。

@TargetAPI(<api>)用來指示API用給定的<api>,而不是項目中指定的。適用範圍在所調用的方法處或整個類中。

2. 後面粉紅色圓角框內同XML中解決方式——在Android-Lint ignore file本文件/ Android-Lint ignore project本項目/ Android-Lint ignore all全局範圍內忽略檢查。

 

三、命令行下解決問題

 

從上面Eclipse環境下的解決問題的方式知道,可以指定文件來定製Lint檢查Issue的處理方式。

下面是一個lint.xml的例子:


<?xml version="1.0" encoding="UTF-8"?>
<lint>
    <!-- Disable the given check in thisproject -->
    <issue id="IconMissingDensityFolder" severity="ignore" />
 
    <!-- Ignore the ObsoleteLayoutParamissue in the given files -->
    <issue id="ObsoleteLayoutParam">
        <ignore path="res/layout/activation.xml" />
        <ignore path="res/layout-xlarge/activation.xml" />
    </issue>
 
    <!-- Ignore the UselessLeaf issue inthe given file -->
    <issue id="UselessLeaf">
        <ignore path="res/layout/main.xml" />
    </issue>
 
    <!-- Change the severity of hardcodedstrings to "error" -->
    <issue id="HardcodedText" severity="error" />
</lint>

Lint.xml中關鍵是對issue(用id指定)的severity進行指定,並且可以指定該issue作用於指定的文件還是當前項目。

 

把lint.xml放在項目的根目錄中,命令行執行lint時候,lint就會用lint.xml中的規則。

另外,執行lint時還可以用參數--config<fileName>指定一個全局的配置用於所有的項目。當項目中已有lint.xml,則對於某個issue而言,在lint.xml中沒有對該issue特別定製的情況下,--config指定的文件<fileName>中的該issue的定製才起作用。


四、定製Lint檢查的規則

 

Android-Lint有默認的檢查和報錯的規則,但通過上面的分析知道,可以在Eclipse或者命令行下改變這種規則,從而可以定製Lint檢查的規則。

推薦定製的路線

  •  在Eclipse中基於現有的問題,逐個分析並解決,然後我們就能得到一個Eclipse自動生成的lint.xml這個定製文件;
  •  然後這個lint.xml用於Eclipse和/或命令行下進行後續的檢查;
  •  後續發現的問題再進一步處理,逐步完善lint.xml這個定製文件。

當然,如果有足夠的時間,完全也可以Review一遍Android-Lint已經支持的所有的Issue,對他們逐個進行定製。對這些Issue的 Review,也能加深我們對Android設計中問題解決和性能優化方法的理解。

 

注意:這裏教你如何忽略Lint發現的問題,但你千萬不要上來就忽略,關鍵還是要解決這些發現的問題。即便是要忽略,也要確保你已經明白他們的含義,以及自己在做的操作(有時候,隱患恰恰被你給忽略過去了)!

特別地,一旦項目組決定採用Android-Lint,定製Lint規則要有對項目和團隊負責的專人來定製執行。Lint的目的是儘量多的暴露問題,解決問題,而個人會有刻意隱藏/規避錯誤的傾向。所以,驗收的時候,用大家討論認可的Lint規則做統一的執行檢查。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章