Android Studio 代碼檢查工具介紹

前言

利用好相關代碼檢查工具,是一種自我的CodeReview榆鼠,可以有效降低Bug率妆够,提升自我的代碼優(yōu)化意識。常用的代碼檢查工具有AndroidStudio 自帶的Lint工具家妆、 Alibaba Java Coding Guidelines

什么是 Lint

Android LintSDK Tools 16(ADT 16)開始引入的一個代碼掃描工具冕茅,通過對代碼進行靜態(tài)分析伤极,可以幫助開發(fā)者發(fā)現(xiàn)代碼質(zhì)量問題和提出一些改進建議。除了檢查 Android 項目源碼中潛在的錯誤嵌赠,對于代碼的正確性塑荒、安全性、性能姜挺、易用性齿税、便利性和國際化方面也會作出檢查。Android Lint 作為項目的代碼檢測工具炊豪,是因為它具有以下幾個特性:

  • 已經(jīng)被集成到 Android Studio凌箕,使用方便;
  • 能在編寫代碼時實時反饋出潛在的問題;
  • 可以自定義規(guī)則牵舱。Android Lint 本身包含大量已經(jīng)封裝好的接口慧妄,能提供豐富的代碼信息罪裹,開發(fā)者可以基于這些信息進行自定義規(guī)則的編寫。

1鬓椭、開始使用

Android Lint 的工作過程比較簡單,一個基礎的Lint過程由Lint Tool(檢測工具),Source Files(項目源文件) 和 lint.xml(配置文件) 三個部分組成,Lint Tool讀取 Source Files,根據(jù)lint.xml配置的規(guī)則(issue)輸出結(jié)果(如下圖)。

2馋劈、操作步驟

Android Studio 中,Android Lint 已經(jīng)被集成,只需要點擊 Analyze-----Inspect Code 即可運行 Android Lint

操作步驟

在彈出的對話框中可以設置執(zhí)行 Lint的范圍苦丁,可以選擇整個項目,也可以只選擇當前的子模塊或者其他自定義的范圍:

選擇操作范圍

檢查完畢后會彈出 Inspection 的控制臺谢鹊,并在其中列出詳細的檢查結(jié)果:

image.png

如上圖所展示的,Android Lint 對檢查的結(jié)果進行了分類,同一個規(guī)則(issue)下的問題會聚合梧躺,其中針對 Android 的規(guī)則類別會在分類前說明是Android 相關的塞琼,主要是六類:

  • Accessibility 無障礙派近,例如 ImageView 缺少contentDescription 描述戒幔,String 編碼字符串等問題错沃。
  • Correctness 正確性
  • Internationalization 國際化,如字符缺少翻譯等問題。
  • Performance 性能捆愁,例如在 onMeasureonDraw 中執(zhí)行 new,內(nèi)存泄露他匪,產(chǎn)生了冗余的資源絮供,xml 結(jié)構(gòu)冗余等向拆。
  • Security 安全性吆鹤,例如沒有使用 HTTPS 連接 Gradle温鸽,AndroidManifest 中的權(quán)限問題等。
  • Usability 易用性迷守,例如缺少某些倍數(shù)的切圖圣絮,重復圖標等。
    其他的結(jié)果條目則是針對 Java 語法的問題埃叭,另外每一個問題都有區(qū)分嚴重程度(severity),從高到底依次是:Fatal屏富、ErrorWarning栅屏、InformationIgnore
    其中 FatalError 都是指錯誤松靡,但是 Fatal 類型的錯誤會直接中斷 ADT 導出 APK,更為嚴重啦逆。
    在結(jié)果列表中點擊一個條目瘦材,可以看到詳細的源文件名和位置,以及命中的錯誤規(guī)則(issue)屋休、解決方案或者屏蔽提示
    除了直接在菜單中運行 Lint 外,大部分問題代碼在編寫時 Android Studio 就會給出提醒附较。

3吃粒、自定義配置

對于執(zhí)行 Lint 操作的相關配置,是定義在 gradle 文件的 lintOptions 中拒课,可定義的選項及其默認值

android {
    lintOptions {
        // 設置為 true徐勃,則當 Lint 發(fā)現(xiàn)錯誤時停止 Gradle 構(gòu)建
        abortOnError false
        // 設置為 true事示,則當有錯誤時會顯示文件的全路徑或絕對路徑 (默認情況下為true)
        absolutePaths true
        // 僅檢查指定的問題(根據(jù) id 指定)
        check 'NewApi', 'InlinedApi'
        // 設置為 true 則檢查所有的問題,包括默認不檢查問題
        checkAllWarnings true
        // 設置為 true 后僻肖,release 構(gòu)建都會以 Fatal 的設置來運行 Lint肖爵。
        // 如果構(gòu)建時發(fā)現(xiàn)了致命(Fatal)的問題,會中止構(gòu)建(具體由 abortOnError 控制)
        checkReleaseBuilds true
        // 不檢查指定的問題(根據(jù)問題 id 指定)
        disable 'TypographyFractions','TypographyQuotes'
        // 檢查指定的問題(根據(jù) id 指定)
        enable 'RtlHardcoded','RtlCompat', 'RtlEnabled'
        // 在報告中是否返回對應的 Lint 說明
        explainIssues true
        // 寫入報告的路徑臀脏,默認為構(gòu)建目錄下的 lint-results.html
        htmlOutput file("lint-report.html")
        // 設置為 true 則會生成一個 HTML 格式的報告
        htmlReport true
        // 設置為 true 則只報告錯誤
        ignoreWarnings true
        // 重新指定 Lint 規(guī)則配置文件
        lintConfig file("default-lint.xml")
        // 設置為 true 則錯誤報告中不包括源代碼的行號
        noLines true
        // 設置為 true 時 Lint 將不報告分析的進度
        quiet true
        // 覆蓋 Lint 規(guī)則的嚴重程度遏匆,例如:
        severityOverrides ["MissingTranslation": LintOptions.SEVERITY_WARNING]
        // 設置為 true 則顯示一個問題所在的所有地方,而不會截短列表
        showAll true
        // 配置寫入輸出結(jié)果的位置谁榜,格式可以是文件或 stdout
        textOutput 'stdout'
        // 設置為 true,則生成純文本報告(默認為 false)
        textReport false
        // 設置為 true凡纳,則會把所有警告視為錯誤處理
        warningsAsErrors true
        // 寫入檢查報告的文件(不指定默認為 lint-results.xml)
        xmlOutput file("lint-report.xml")
        // 設置為 true 則會生成一個 XML 報告
        xmlReport false
        // 將指定問題(根據(jù) id 指定)的嚴重級別(severity)設置為 Fatal
        fatal 'NewApi', 'InlineApi'
        // 將指定問題(根據(jù) id 指定)的嚴重級別(severity)設置為 Error
        error 'Wakelock', 'TextViewEdits'
        // 將指定問題(根據(jù) id 指定)的嚴重級別(severity)設置為 Warning
        warning 'ResourceAsColor'
        // 將指定問題(根據(jù) id 指定)的嚴重級別(severity)設置為 ignore
        ignore 'TypographyQuotes'
    }
}

lint.xml 這個文件則是配置 Lint 需要禁用哪些規(guī)則(issue)窃植,以及自定義規(guī)則的嚴重程度(severity),lint.xml文件是通過 issue 標簽指定對一個規(guī)則的控制荐糜,在項目根目錄中建立一個 lint.xml 文件后 Android Lint 會自動識別該文件巷怜,在執(zhí)行檢查時按照 lint.xml 的內(nèi)容進行檢查。如上面提到的那樣暴氏,開發(fā)者也可以通過 lintOptions 中的 lintConfig 選項來指定配置文件延塑。lint.xml 示例如下:

<?xml version="1.0" encoding="utf-8" ?>
<lint>
    <issue id="HardcodedText" severity="ignore" />
    <issue id="SmallSp" severity="ignore" />
    <issue id="AddJavascriptInterface" severity="ignore" />
    <issue id="AdapterViewChildren" severity="warning" />
    <issue id="AllowBackup" severity="ignore" />
    <issue id="Deprecated" severity="warning">
        <ignore regexp="singleLine" />
    </issue>
</lint>

issue 標簽中使用 id 指定一個規(guī)則,severity="ignore" 則表明禁用這個規(guī)則答渔。需要注意的是关带,某些規(guī)則可以通過 ignore 標簽指定僅對某些屬性禁用,例如上面的 Deprecated沼撕,表示檢查是否有使用不推薦的屬性和方法宋雏,而在issue 標簽中包裹一個 ignore 標簽,在ignore 標簽的 regexp 屬性中使用正則表達式指定了 singleLine务豺,則表明對 singleLine 這個屬性屏蔽檢查磨总。
另外開發(fā)者也可以使用 @SuppressLint(issue id) 標注針對某些代碼忽略某些 Lint 檢查,這個標注既可以加到成員變量之前笼沥,也可以加到方法聲明和類聲明之前蚪燕,分別針對不同范圍進行屏蔽。

Alibaba Java Guidelines的使用

這是一款阿里巴巴基于Java規(guī)范開發(fā)的AndroidStudio插件奔浅,需要單獨安裝在AndroidStudio中馆纳,它可以規(guī)范我們的代碼編寫,進行實時代碼規(guī)范提示汹桦。

1厕诡、如何安裝插件

Android Studio --> File --> Settings... --> Plugins --> 搜索Alibaba Java Guidelines --> 安裝并重啟Android Studio

阿里巴巴Java規(guī)范插件

2、使用

在日常編寫代碼時营勤,插件會實時對代碼進行檢測給出相應的提示信息灵嫌,并給出對應的代碼優(yōu)化方案壹罚。示例如下:
下面switch語句塊,按照Java規(guī)范寿羞,是缺少default語句的猖凛,插件會提示加上。

image.png

Apk 體積分析

當我們打包apk之后绪穆,有時候apk有點大辨泳,想要針對apk進行“瘦身”,此時我們需要知道哪些哪些東西占用較多玖院,才有針對性的進行apk體積優(yōu)化菠红,可以使用AndroidStudio自帶功能檢測apk
AndroidStudio中雙擊打包的apk文件之后右側(cè)會彈出對應的apk分析窗口难菌,如下所示:
可以清楚看到哪些文件占用apk大小的比重信息试溯,同時也可以將兩個apk進行比對。

apk分析.png

依賴占用過大郊酒,可以選擇將一些沒有使用到的依賴進行剔除遇绞,資源圖片沒有使用到的也可以剔除掉,資源圖片占用過大燎窘,可使用TinyPng將圖片進行無損壓縮處理摹闽。

TinyPng官網(wǎng)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市褐健,隨后出現(xiàn)的幾起案子付鹿,更是在濱河造成了極大的恐慌,老刑警劉巖蚜迅,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倘屹,死亡現(xiàn)場離奇詭異,居然都是意外死亡慢叨,警方通過查閱死者的電腦和手機纽匙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拍谐,“玉大人烛缔,你說我怎么就攤上這事⌒Γ” “怎么了践瓷?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長亡蓉。 經(jīng)常有香客問我晕翠,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任淋肾,我火速辦了婚禮硫麻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘樊卓。我一直安慰自己拿愧,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布碌尔。 她就那樣靜靜地躺著浇辜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪唾戚。 梳的紋絲不亂的頭發(fā)上柳洋,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音叹坦,去河邊找鬼熊镣。 笑死,一個胖子當著我的面吹牛立由,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播序厉,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼锐膜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了弛房?” 一聲冷哼從身側(cè)響起道盏,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎文捶,沒想到半個月后荷逞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡粹排,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年种远,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顽耳。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡坠敷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出射富,到底是詐尸還是另有隱情膝迎,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布胰耗,位于F島的核電站限次,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏柴灯。R本人自食惡果不足惜卖漫,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一费尽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧懊亡,春花似錦依啰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鸯两,卻和暖如春闷旧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钧唐。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工忙灼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钝侠。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓该园,卻偏偏與公主長得像,于是被迫代替她去往敵國和親帅韧。 傳聞我的和親對象是個殘疾皇子里初,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容