国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

【騰訊TMQ】管中窺豹:結(jié)合NewApi實踐來了解Lint代碼掃描

2019-11-09 16:48:21
字體:
供稿:網(wǎng)友

導(dǎo)讀

lint是著名的C/C++語言靜態(tài)代碼分析工具之一,Android Lint顧名思義,針對Android的靜態(tài)代碼分析工具,能夠?qū)ndroid項目中潛在的bug、可優(yōu)化的代碼、安全性、性能、可用性、可訪問性、國際化等進行檢查。

在Android SDK Tools 16及更高的版本中,Lint工具會自動安裝。通過對Android工程源代碼等進行掃描檢查,可發(fā)現(xiàn)潛在的問題,更好的提升代碼質(zhì)量。Android Lint提供了命令行方式執(zhí)行,也與IDE(如Eclipse、Android Studio)集成提供了IDE圖形界面,單獨輸出的xml和html結(jié)果報告可以提供更豐富的信息。

lint掃描規(guī)則初覽

1. NewApi規(guī)則說明

初步掃描手管代碼得到一份html的報告,結(jié)果分類比較清晰,但有2000+error,12000+warning,,嚇的手一抖直接關(guān)掉了。。

為了降低大家的心理門檻,我們從手管已經(jīng)接入Daily的NewApi規(guī)則來看看lint是怎么工作的

最簡單的,先來看看NewApi規(guī)則說明:

可以對NewApi規(guī)則有個大致的了解,掃描App中的Android Api,對起始版本大于AndroidManifest.xml中聲明的minSdkVersion,即未加判斷調(diào)用的高版本Api進行提示。沒有判斷調(diào)用不支持的Api會怎么樣呢?低版本機器在執(zhí)行到該代碼段時就會拋出NoSuchMethodException異常crash。

2. NewApi掃描結(jié)果

再來看看NewApi的掃描結(jié)果:

可以看到檢查結(jié)果中的issueid、summary、PRiority、severity、category、explanation和說明中是一致的,message中有更詳細的代碼段接口版本說明,location字段中給出了對應(yīng)的代碼位置。

Issueid:規(guī)則名,唯一;

Summary:規(guī)則的簡單概述;

Priority:優(yōu)先級,1~10,10為最嚴重

Severity:嚴重性,F(xiàn)atal,Error,Warning,Information,Ignore

Category:類別,Correctness 正確性Security 安全性Performance 性能Usability 可用性accessibility 可達性i18n 國際化

Explanation:規(guī)則詳細描述及問題解決建議

lint規(guī)則實現(xiàn)原理篇

1.lint規(guī)則主要模塊

從NewApi在手管的落地實踐來看NewApi確實是解決Api版本兼容性的一大利器,lint是怎么實現(xiàn)這一規(guī)則的呢?lint支持的280+規(guī)則都是怎么實現(xiàn)的呢?

我們來看看lint規(guī)則的主要模塊:

Issue:lint規(guī)則定義,比如NewApi,lint已有規(guī)則列表維護在BuiltinIssueRegistry類中,目前l(fā)int官網(wǎng)提供有280+個規(guī)則,可以按需打開也可以修改各個規(guī)則的嚴重級別,已有規(guī)則配置可以見實踐篇;

Detetor:檢索項目中檢測項對應(yīng)的問題,一個檢測器可以檢索多個獨立但相關(guān)的問題,比如通過一個檢測器查找多種Manifest相關(guān)的問題;

Implematation:連接檢查項和檢測器,也聲明規(guī)則的查找范圍,常用的scope包括CLASS_FILE,java_FILE,RESOURCE_FILE等;

Registry:注冊模塊,lint維護了一張所有規(guī)則的列表,檢查規(guī)則通過注冊添加到規(guī)則列表中;

2.NewApi規(guī)則注冊類

從NewApi檢查項的注冊定義可以看到,issueid、summary等均在issue注冊時傳入以便在結(jié)果報告中展示,Implematations中scope聲明了規(guī)則查找范圍,Scope.CLASS_FILE標(biāo)明了NewApi檢查項針對編譯后的class字節(jié)碼進行掃描:

3.NewApi掃描核心類

再來看看NewApi掃描核心的ApiDetector:

ApiDetector檢測器繼承自ResourceXmlDetector并實現(xiàn)Detector.ClassScanner和Detector.JavaScanner接口,Detector類中提供了7種XXXScanner接口

Scanner也并不是直接進行代碼行查找,scanner中通過lombok.ast(Abstract Syntax Tree抽象語法樹) API來進行代碼節(jié)點的查找,有興趣的童鞋可以參照Eclipse AST介紹。

掃描規(guī)則實際上就是實現(xiàn)detector的過程,每個detector可以定義1個或多個不同類型的issue,像ApiDetector中會處理多個Api調(diào)用相關(guān)的規(guī)則:NewApi,InlinedApi,Override,UnusedAttribute;

繼續(xù)查看ApiDetector最主要的checkClass()可以更深入了解NewApi的掃描過程:

Api版本庫中維護了一份Android每個版本Class的類關(guān)系和成員變量,是Api兼容性檢測的前提條件

首先進行類掃描處理,如果沒有TargetApi定義的局部miniSDK則獲取AndroidManifest.xml中minSdkVersion定義,首先進行繼承類和接口類的掃描判斷,發(fā)現(xiàn)的問題通過report()函數(shù)輸出:

掃描結(jié)果-類兼容問題

然后開始對類節(jié)點的掃描處理,同樣判斷方法前是否有TargetApi標(biāo)注定義了局部miniSdk,依次檢查類中method、field、LDC引用值,源碼中可以看到在method、field的調(diào)用判斷中,也對android常用的版本判斷格式if(Build.VERSION.SDK_INT >= XX)的分支進行判斷檢查

對應(yīng)的掃描結(jié)果中message字段返回了兼容性調(diào)用問題的類型及起始版本,并將發(fā)現(xiàn)的問題通過report()函數(shù)輸出。

掃描結(jié)果-Field調(diào)用兼容問題:

掃描結(jié)果-method調(diào)用兼容問題:

自定義掃描規(guī)則篇

通過走讀lintNewApi的實現(xiàn)過程,我們也清楚了lint中的規(guī)則是如何定義并實現(xiàn)的,我們自己是否也可以參照這個結(jié)構(gòu)來自定義規(guī)則呢?答案是肯定的,lint也支持自定義規(guī)則擴展,自定義規(guī)則通過IssueRegistry加入到規(guī)則表中和其他規(guī)則一起使用。什么場景適合自定義規(guī)則呢?比如手管UI庫的編寫規(guī)范,典型問題的修復(fù)情況,某些封裝了不建議直接使用的Api的調(diào)用等都可以通過自定義規(guī)則來規(guī)范和提醒。

自定義lint規(guī)則是以jar形式存在的,通過繼承l(wèi)int的兩個類來實現(xiàn)規(guī)則擴展:

①繼承IssueRegistry:自定義Lint規(guī)則的主類,有且只有一個,注冊這個自定義Lint項目中有哪些自定義的issue:

②繼承Detector并實現(xiàn)Detector中合適的XXXScanner接口:可以根據(jù)需求實現(xiàn)多個自定義Detector類,在每個Detector類中實現(xiàn)自定義的一個或多個issue;

在eclipse中新建java工程并引用sdk/tools/lib/lint-api.jar包,手動添加導(dǎo)出配置MANIFEST.MF文件

export導(dǎo)出jar包,生成的jar包放到~/.android/lint/路徑下,此時調(diào)用命令行工具就可以看到我們自定義的規(guī)則了

總結(jié)篇

管中窺豹,走讀已有規(guī)則的實現(xiàn)可以讓我們對工具有更全面的了解,更好的應(yīng)用到項目中,網(wǎng)上關(guān)于自定義規(guī)則的示例也不多,源碼中的規(guī)則實現(xiàn)也是一個很好的參照途徑,也需要我們更進一步分析代碼問題挖掘個中需求,才能發(fā)揮工具的更大作用。

本文簡單結(jié)合手機管家NewApi的實踐來了解Lint代碼掃描過程,期待大家一起來探討代碼掃描工具有哪些更有價值的應(yīng)用場景呢?

參考資料:

[1] http://tools.android.com/tips/lint/writing-a-lint-check

[2]https://android.googlesource.com/platform/tools/base/+/master/lint/

[3]https://www.bignerdranch.com/blog/building-custom-lint-checks-in-android/

[4] Android Lint: 靜態(tài)檢查Android版本兼容性問題[5]Android Lint工作原理剖析

【TMQ新書專欄】https://weidian.com/?userid=984448577

原文鏈接:http://tmq.QQ.com/2017/02/newapi_lint/

關(guān)注我們的微信公眾號查看完整內(nèi)容哦~~~~

想知道更多測試相關(guān)干貨 請關(guān)注我們的微信公眾號:騰訊移動品質(zhì)中心TMQ 二維碼: 這里寫圖片描述

版權(quán)聲明:騰訊TMQ擁有內(nèi)容的全部版權(quán),任何人或單位對本貼內(nèi)容進行復(fù)制、轉(zhuǎn)載時請申明原創(chuàng)騰訊tmq,否則將追究法律責(zé)任。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 余姚市| 佛教| 兰溪市| 肥乡县| 江油市| 芦山县| 垫江县| 天门市| 抚远县| 汤阴县| 台东市| 凤阳县| 江陵县| 龙里县| 黄冈市| 六枝特区| 宁蒗| 页游| 永寿县| 石棉县| 延吉市| 漾濞| 耒阳市| 杨浦区| 吴忠市| 连云港市| 永顺县| 泰宁县| 灵川县| 中卫市| 类乌齐县| 满城县| 南投县| 吴堡县| 英山县| 石屏县| 阿克陶县| 四会市| 吉安市| 临桂县| 姚安县|