詳解Android Lint的原理及其使用
Android Lint 原理及使用詳解
Android Lint 是 ADT 16中引入的新工具,用于掃描 Android 項目源中的潛在錯誤。
Lint 是 Android 提供的一個強大的,用于靜態(tài)掃描應(yīng)用源碼并找出其中的潛在問題的實用工具。lint 工具可以檢查你的 Android 項目源文件是否有潛在的錯誤,以及在正確性、安全性、性能、易用性、無障礙性和國際化方面是否需要優(yōu)化改進。
Lint 既可以用作命令行工具,也可以與 Eclipse 和 IntelliJ 集成在一起。它被設(shè)計成獨立于 IDE 的工具,我們可以在 Android Studio 中非常方便的使用它。
Lint 的工作過程
lint 工具的代碼掃描工作流:
- 應(yīng)用源文件:源文件包含組成 Android 項目的文件,包括 Java、Kotlin 和 XML 文件、圖標以及 ProGuard 配置文件。
- lint.xml 文件:一個配置文件,可用于指定要排除的任何 lint 檢查以及自定義問題嚴重級別。lint 工具:一個靜態(tài)代碼掃描工具,你可以從命令行或在 Android Studio 中對 Android 項目運行該工具。
- lint 工具檢查可能會影響 Android 應(yīng)用的質(zhì)量和性能的代碼結(jié)構(gòu)問題。強烈建議你先更正 lint 檢測到的所有錯誤,然后再發(fā)布你的應(yīng)用。
- lint 檢查結(jié)果:我們可以在控制臺或 Android Studio 的 Inspection Results 窗口中查看 lint 檢查結(jié)果。
Lint 的工作過程由 Lint Tool(檢測工具),Source Files(項目源文件) 和 lint.xml(配置文件) 三個部分組成,Lint Tool 讀取 Source Files,根據(jù) lint.xml 配置的規(guī)則(issue)輸出最終的結(jié)果。
Lint 的功能
Lint 可以檢查并發(fā)現(xiàn)以下幾類問題:
- 缺少翻譯(和未使用的翻譯)
- 布局性能問題(所有以前實用 layoutopt 工具用來查找的問題,等等)
- 數(shù)組大小不一致
- 可訪問性和國際化問題(硬編碼字符串,缺少 contentDescription 等)
- 圖標問題(例如缺少密度,重復的圖標,錯誤的尺寸等)
- 可用性問題(如未在文本字段中指定輸入類型)
- Manifest 錯誤
問題等級
Lint 發(fā)現(xiàn)的每個問題都有描述信息和等級,我們可以很方便地定位問題,同時按照嚴重程度進行解決。當然,我們也可以手動配置每個問題的嚴重級別。Lint 本身包含大量已經(jīng)封裝好的接口,能提供豐富的代碼信息,開發(fā)者可以基于這些信息進行自定義規(guī)則的編寫。
Lint 會按照問題的嚴重程度分為幾個等級:
- Fatal
- Error
- Warning
- Information
- Ignore
問題嚴重程序由高到低依次降低。
從命令行運行 lint
如果你使用的是 Android Studio 或 Gradle,你可以在項目的根目錄下輸入以下某個命令,使用 Gradle 封裝容器對項目調(diào)用 lint 任務(wù):
在 Windows 上:
gradlew lint
在 Linux 或 Mac 上:
./gradlew lint
lint 工具完成其檢查后,會提供 XML 和 HTML 版 lint 報告的路徑。然后,我們可以轉(zhuǎn)到 HTML 報告并在瀏覽器中將其打開
Android Studio 中使用 Lint
Lint 已經(jīng)被集成到 Android Studio,所以可以直接使用,使用非常方便。lint 的代碼掃描工具,可幫助你發(fā)現(xiàn)并更正代碼結(jié)構(gòu)質(zhì)量的問題,而無需您實際執(zhí)行應(yīng)用,也不必編寫測試用例。系統(tǒng)會報告該工具檢測到的每個問題并提供問題的描述消息和嚴重級別,以便你可以快速確定需要優(yōu)先進行的關(guān)鍵改進。此外,你還可以降低問題的嚴重級別以忽略與項目無關(guān)的問題,或者提高嚴重級別以突出特定問題。
從菜單欄,選擇Analyze > Inspect Code
選擇檢查范圍
選擇后,點擊"OK",稍等一會就會生成掃描結(jié)果:
左側(cè)是問題分類,選中一個問題條目,則右側(cè)會展示具體的問題代碼,這樣就可以很方便的進行問題排查、定位和更改了。
Android 的規(guī)則類別:
- Accessibility 輔助選項,例如 ImageView 缺少 contentDescription 描述,String 編碼字符串等問題。
- Compliance 合規(guī)性,違反了Google Play的要求,比如使用了過期的庫版本,性能、安全性、API等級等沒有遵循新系統(tǒng)的要求等。
- Correctness 不夠完美的編碼,比如硬編碼、使用過時API等。
- Internationalization 國際化,如直接使用漢字,沒有使用資源引用等。
- Interoperability 互操作性,比如和Kotln的交互等。
- Performance 性能,例如:靜態(tài)引用,循環(huán)引用等。
- Security 安全性,例如沒有使用 HTTPS 連接 Gradle,AndroidManifest 中的權(quán)限問題等。
- Usability 易用性,有更好的替換的,例如缺少某些倍數(shù)的切圖,排版、圖標格式建議.png格式等等。
lint 配置
配置 lint 文件
我們可以在 lint.xml 文件中進行 lint 配置。我們可以手動創(chuàng)建該文件,并放置在 Android 項目的根目錄下。
lint.xml 文件由封閉的 父標記組成,此標記包含一個或多個 子元素。lint 會為每個 定義唯一的 id 屬性值。
<?xml version="1.0" encoding="UTF-8"?> <lint> <!-- list of issues to configure --> </lint>
我們可以通過在 標記中設(shè)置嚴重性級別屬性來更改某個問題的嚴重性級別或?qū)υ搯栴}停用 lint 檢查。
下面來看一個示例:
<?xml version="1.0" encoding="UTF-8"?> <lint> <!-- Disable the given check in this project --> <issue id="IconMissingDensityFolder" severity="ignore" /> <!-- Ignore the ObsoleteLayoutParam issue in the specified files --> <issue id="ObsoleteLayoutParam"> <ignore path="res/layout/activation.xml" /> <ignore path="res/layout-xlarge/activation.xml" /> </issue> <!-- 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>
禁用某個文件或方法進行 lint 檢查
如果我們在 Android 項目中想對某個類或方法禁用 lint 檢查,可以請向該代碼添加 @SuppressLint 注解。
以下示例展示了如何對 onCreate 方法中的 NewApi 問題停用 lint 檢查。lint 工具會繼續(xù)檢查該類的其他方法中的 NewApi 問題。
@SuppressLint("NewApi") @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);
以下示例展示了如何對 FeedProvider 類中的 ParserError 問題停用 lint 檢查:
@SuppressLint("ParserError") public class FeedProvider extends ContentProvider {
要禁止 lint 檢查文件中的所有問題,請使用 all 關(guān)鍵字,如下所示:
@SuppressLint("all")
xml 文件的 lint 檢測配置
我們可以使用 tools:ignore 屬性對 XML 文件的特定部分停用 lint 檢查。在 lint.xml 文件中添加以下命名空間值,以便 lint 工具能夠識別該屬性:
namespace xmlns:tools="http://schemas.android.com/tools"
以下示例展示了如何對 XML 布局文件的 元素中的 UnusedResources 問題停用 lint 檢查。如果某個父元素聲明了 ignore 屬性,則該元素的子元素會繼承此屬性。在本示例中,也會對 子元素停用 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>
要禁止檢查多個問題,請使用以英文逗號分隔的字符串列出要禁止檢查的問題。例如:
tools:ignore="NewApi,StringFormatInvalid"
要禁止 lint 檢查 XML 元素中的所有問題,請使用 all 關(guān)鍵字,如下所示:
tools:ignore="all"
通過 Gradle 配置 lint 選項
通過 Android Plugin for Gradle,我們可以使用模塊級 build.gradle 文件中的 lintOptions {} 代碼塊配置某些 lint 選項,例如要運行或忽略哪些檢查。
例如:
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 } } ...
在 Android Studio 中修改 lint 配置文件
我們可以很方便的在 Android Studio 中修改 lint 檢查時的配置。
Android Studio 附帶了許多 lint 及其他檢查配置文件,這些配置文件可通過 Android 更新進行更新。我們可以原封不動地使用這些配置文件,也可以修改它們的名稱、說明、嚴重級別和范圍。當然,還可以激活和禁用整組的配置文件或一組配置文件中的個別配置文件。
依次選擇 Analyze > Inspect Code,在 Specify Scope 對話框的 Inspection Profile 下,點擊 More。
此時將顯示 Inspections 對話框,其中列出了支持的檢查及其說明:
- 選擇 Profile 下拉列表,以在 Default (Android Studio) 與 Project Default(活動項目)檢查之間切換。
- 在左側(cè)窗格的 Inspections 對話框中,選擇一個頂級配置文件類別,或展開一個組并選擇特定的配置文件。選擇一個配置文件類別后,我們可以將該類別中的所有檢查項目當作一個檢查項目進行修改。
- 選擇 Manage 下拉列表,以復制檢查項目、對檢查項目進行重命名、向檢查項目添加說明以及導出/導入檢查項目。
- 操作完成后,點擊 OK。
以上就是詳解Android Lint的原理及其使用的詳細內(nèi)容,更多關(guān)于Android Lint的原理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android編程錄音工具類RecorderUtil定義與用法示例
這篇文章主要介紹了Android編程錄音工具類RecorderUtil定義與用法,結(jié)合實例形式分析了Android錄音工具類實現(xiàn)開始錄音、停止錄音、取消錄音、獲取錄音信息等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01Android通知欄增加快捷開關(guān)的功能實現(xiàn)教程
對于Android來說其中一項很方便的操作便是下拉菜單,下拉菜單欄可以快捷打開某項設(shè)置,這篇文章主要給大家介紹了關(guān)于Android通知欄增加快捷開關(guān)的功能實現(xiàn),需要的朋友可以參考下2023-01-01BroadcastReceiver靜態(tài)注冊案例詳解
這篇文章主要為大家詳細介紹了BroadcastReceiver靜態(tài)注冊案例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08Android中使用socket通信實現(xiàn)消息推送的方法詳解
這篇文章主要介紹了Android中使用socket通信實現(xiàn)消息推送的方法,文中舉了一個消息發(fā)送端和一個消息接收端以及服務(wù)器端的例子來說明原理并且展示了客戶端的實現(xiàn),需要的朋友可以參考下2016-04-04Android 使用 DowanloadManager 實現(xiàn)下載并獲取下載進度實例代碼
這篇文章主要介紹了Android 使用 DowanloadManager 實現(xiàn)下載并獲取下載進度實例代碼的相關(guān)資料,需要的朋友可以參考下2017-06-06