這篇文章主要為大家分析了提高Android代碼質(zhì)量的工具有什么的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì)易懂,操作細(xì)節(jié)合理,具有一定參考價(jià)值。如果感興趣的話,不妨跟著跟隨小編一起來看看,下面跟著小編一起深入學(xué)習(xí)“提高Android代碼質(zhì)量的工具有什么”的知識(shí)吧。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡(jiǎn)單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名與空間、網(wǎng)頁空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、陸河網(wǎng)站維護(hù)、網(wǎng)站推廣。
在這篇文章中,我將通過不同的自動(dòng)化工具如CheckStyle,F(xiàn)indBugs,PMD以及Android Lint來介紹(如何)提高你的安卓代碼質(zhì)量。通過自動(dòng)化的方式檢查你的代碼非常有用,尤其當(dāng)你在一個(gè)團(tuán)隊(duì)中工作,為了在你的代碼中保持嚴(yán)格的語法格式以及避免很多壞習(xí)慣和錯(cuò)誤。我將仔細(xì)地介紹如何在你空閑的時(shí)候直接運(yùn)用這些工具通過Gradle構(gòu)建腳本以及如何配置它們。
Fork該示例
我強(qiáng)烈建議你拷貝下這個(gè)項(xiàng)目工程,盡管我將介紹的案例都是來自它。與此同時(shí),你將能夠測(cè)試下自己對(duì)這些工具的了解情況。
關(guān)于Gradle任務(wù)
Gradle任務(wù)的概念(在Gradle中的含義)是理解該篇文章(以及如何以一種通用的方式寫Gradle腳本)的基礎(chǔ)。我強(qiáng)烈建議你去看下這兩篇關(guān)于Gradle任務(wù)的文檔(這篇和這篇)。這個(gè)文檔包含了大量的例子,因此它非常容易開始學(xué)習(xí)。現(xiàn)在,我假定你拷貝了我的Repo,你導(dǎo)入這個(gè)工程到你的Android Studio,并且你熟悉Gradle任務(wù)。如果不是,別擔(dān)心,我將盡我***的努力讓我的講解更有意義。
關(guān)于示例項(xiàng)目的層次結(jié)構(gòu)
你可以將gradle腳本文件分割成很多文件,我現(xiàn)在已經(jīng)有3個(gè)gradle文件:
根文件夾中的文件,這些文件或多或少都是關(guān)于這個(gè)項(xiàng)目的配置的(用的哪個(gè)Maven Repos,用的哪個(gè)版本的Gradle)。
App子文件夾中的文件,這些文件是典型的用于創(chuàng)建安卓應(yīng)用的gradle文件。
config子文件夾中的文件,這里的文件才是我們關(guān)系的重點(diǎn),因?yàn)槲矣眠@里的文件保存和配置項(xiàng)目中的所有工具。
Checkstyle
簡(jiǎn)介
“Checkstyle是一個(gè)開發(fā)工具用來幫助程序員編寫符合代碼規(guī)范的Java代碼。它能自動(dòng)檢查Java代碼為空閑的人進(jìn)行這項(xiàng)無聊(但重要)的任務(wù)?!?/p>
正如Checkstyle的開發(fā)者所言,這個(gè)工具能夠幫助你在項(xiàng)目中定義和維持一個(gè)非常精確和靈活的代碼規(guī)范形式。當(dāng)你啟動(dòng)CheckStyle,它會(huì)根據(jù)所提供的配置文件分析你的Java代碼并告訴你發(fā)現(xiàn)的所有錯(cuò)誤。
Gradle的形式
下面的代碼向你展示了在你的項(xiàng)目中使用Checkstyle的最基本的配置(如Gradle任務(wù)):
task checkstyle(type: Checkstyle) { configFile file("${project.rootDir}/config/quality/checkstyle/checkstyle.xml") // Where my checkstyle config is... configProperties.checkstyleSuppressionsPath = file("${project.rootDir}/config/quality/checkstyle/suppressions.xml").absolutePath // Where is my suppressions file for checkstyle is... source '<span id="24_nwp"><a id="24_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=71b135827dd4deba&k=src&k0=src&kdi0=0&luki=5&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=baded47d8235b171&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F6546%2Ehtml&urlid=0" target="_blank">src</a>' include '**/*.<span id="25_nwp"><a id="25_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=71b135827dd4deba&k=java&k0=java&kdi0=0&luki=10&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=baded47d8235b171&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F6546%2Ehtml&urlid=0" target="_blank">java</a>' exclude '**/gen/**' classpath = files() }</span></span>
所以,基本上這個(gè)任務(wù)會(huì)根據(jù)checkstyle.xml和suppressions.xml分析你的代碼。通過Android Studio執(zhí)行它僅僅需要從工具面的CheckStyle來啟動(dòng)它。
啟動(dòng)CheckStyle之后,你講收到一個(gè)報(bào)告用于展示在你項(xiàng)目中發(fā)現(xiàn)的每個(gè)錯(cuò)誤。這是非常直接的方式。
如果你想在checkstyle上做更多的配置,可以參考這篇文檔。
Checkstyle的使用技巧
Checkstyle會(huì)發(fā)現(xiàn)大量的問題,特別是在你運(yùn)用了大量的規(guī)則配置,如同你設(shè)置了一個(gè)非常精確的語法。盡管我通過Gradle使用 checkstyle,例如在我進(jìn)行推送之前,我仍然推薦你為IntellJ/Android Studio使用checkstyle插件(你可以通過Android Studio的工作面板文件/設(shè)置/插件直接安裝插件)。這種方式下,你可以根據(jù)那些為Gradle配置的相同文件在你的工程中使用 checkstyle,但是遠(yuǎn)不止這些,你可以直接在Android Studio中獲取帶有超鏈接結(jié)果,這些結(jié)果通過超鏈接在你的代碼中對(duì)應(yīng),這是非常有用的(Gradle的這種方式仍然很重要的,因?yàn)槟憧梢允褂盟詣?dòng)構(gòu)建系統(tǒng),如Jenkins)。
Findbugs
簡(jiǎn)介
Findbugs是否需要一個(gè)簡(jiǎn)介呢?我想它的名稱已經(jīng)讓人顧名思義了。“FindBugs使用靜態(tài)分析方法為出現(xiàn)bug模式檢查Java字節(jié)碼”。FindBugs基本上只需要一個(gè)程序來做分析的字節(jié)碼,所以這是非常容易使用。它能檢測(cè)到常見的錯(cuò)誤,如錯(cuò)誤的布爾運(yùn)算符。FindBugs也能夠檢測(cè)到由于誤解語言特點(diǎn)的錯(cuò)誤,如Java參數(shù)調(diào)整(這不是真的有可能因?yàn)樗膮?shù)是傳值)。
Gradle的形式
下面的代碼向你展示了在你的項(xiàng)目中使用Findbugs的最基本的配置(以Gradle任務(wù)為例):
task findbugs(type: FindBugs) { ignoreFailures = false effort = "max" reportLevel = "high" excludeFilter = new File("${project.rootDir}/config/quality/findbugs/findbugs-filter.<span id="15_nwp"><a id="15_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=71b135827dd4deba&k=xml&k0=xml&kdi0=0&luki=7&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=baded47d8235b171&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F6546%2Ehtml&urlid=0" target="_blank">xml</a>") classes = files("${project.rootDir}/<span id="16_nwp"><a id="16_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=71b135827dd4deba&k=app&k0=app&kdi0=0&luki=3&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=baded47d8235b171&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F6546%2Ehtml&urlid=0" target="_blank">app</a>/build/classes") source '<span id="17_nwp"><a id="17_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=71b135827dd4deba&k=src&k0=src&kdi0=0&luki=5&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=baded47d8235b171&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F6546%2Ehtml&urlid=0" target="_blank">src</a>' include '**/*.<span id="18_nwp"><a id="18_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=71b135827dd4deba&k=java&k0=java&kdi0=0&luki=10&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=baded47d8235b171&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F6546%2Ehtml&urlid=0" target="_blank">java</a>' exclude '**/gen/**' reports { xml.enabled = false <span id="19_nwp"><a id="19_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=71b135827dd4deba&k=html&k0=html&kdi0=0&luki=2&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=baded47d8235b171&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F6546%2Ehtml&urlid=0" target="_blank">html</a>.enabled = true xml { destination "$project.buildDir/reports/findbugs/findbugs.xml" } html { destination "$project.buildDir/reports/findbugs/findbugs.html" } } classpath = files() }</span></span></span></span></span>
它是如此的像一個(gè)Checkstyle任務(wù)。盡管Findbugs支持HTML和XML兩種報(bào)告形式,我選擇HTML形式,因?yàn)檫@種形式更具有可讀性。而且,你只需要把報(bào)告的位置設(shè)置為書簽就可以快速訪問它的位置。這個(gè)任務(wù)也會(huì)失敗如果發(fā)現(xiàn)Findbgus錯(cuò)誤失敗(同樣生成報(bào)告)。執(zhí)行 FindBugs任務(wù),就像執(zhí)行CheckStyle任務(wù)(除了任務(wù)的名稱是“FindBugs”)。
Findbugs的使用技巧
由于Android項(xiàng)目是從Java項(xiàng)目略有不同,我強(qiáng)烈推薦使用FindBugs過濾器(規(guī)則配置)。你可以在這一個(gè)例子(例如項(xiàng)目之一)。它基本上忽略了R文件和你的Manifest文件。順便說一句,由于(使用)FindBugs分析你的代碼,你至少需要編譯一次你的代碼才能夠測(cè)試它。
PMD
簡(jiǎn)介
這個(gè)工具有個(gè)有趣的事實(shí):PMD不存在一個(gè)準(zhǔn)確的名稱。(所以)在官網(wǎng)上你可以發(fā)現(xiàn)很有有趣的名稱,例如:
Pretty Much Done
Project Meets Deadline
事實(shí)上,PMD是一個(gè)工作有點(diǎn)類似Findbugs的強(qiáng)大工具,但是(PMD)直接檢查源代碼而不是檢查字節(jié)碼(順便說句,PMD適用很多語言)。 (PMD和Findbugs)的核心目標(biāo)是相同的,通過靜態(tài)分析方法找出哪些模式引起的bug。因此為什么同時(shí)使用Findbugs和PMD呢?好吧!盡管Findbugs和PMD擁有相同的目標(biāo),(但是)他們的檢查方法是不同的。所以PMD有時(shí)檢查出的bug但是Findbugs卻檢查不出來,反之亦然。
Gradle的形式
下面的代碼向你展示了在你的項(xiàng)目中使用PMD的最基本的配置(以Gradle任務(wù)為例):
task pmd(type: Pmd) { ruleSetFiles = files("${project.rootDir}/config/quality/pmd/pmd-ruleset.<span id="9_nwp"><a id="9_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=71b135827dd4deba&k=xml&k0=xml&kdi0=0&luki=7&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=baded47d8235b171&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F6546%2Ehtml&urlid=0" target="_blank">xml</a>") ignoreFailures = false ruleSets = [] source '<span id="10_nwp"><a id="10_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=71b135827dd4deba&k=src&k0=src&kdi0=0&luki=5&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=baded47d8235b171&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F6546%2Ehtml&urlid=0" target="_blank">src</a>' include '**/*.<span id="11_nwp"><a id="11_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=71b135827dd4deba&k=java&k0=java&kdi0=0&luki=10&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=baded47d8235b171&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F6546%2Ehtml&urlid=0" target="_blank">java</a>' exclude '**/gen/**' reports { xml.enabled = false <span id="12_nwp"><a id="12_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=71b135827dd4deba&k=html&k0=html&kdi0=0&luki=2&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=baded47d8235b171&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F6546%2Ehtml&urlid=0" target="_blank">html</a>.enabled = true xml { destination "$project.buildDir/reports/pmd/pmd.xml" } html { destination "$project.buildDir/reports/pmd/pmd.html" } } }</span></span></span></span>
就PMD來說,它幾乎與Findbugs相同。PMD支持HTML和XML兩種報(bào)告形式,所以我再次選擇HTML形式。我強(qiáng)烈建議你使用自己的通用配置集文件,正如同我在這個(gè)例子(check this file)中一樣。所以,你當(dāng)然應(yīng)該去看下這些通用配置集文件。我建議你,因?yàn)镻MD可比FindBugs更有爭(zhēng)議的很多,例如:如果你不聲明”if statement”或”if statement”為空,它基本上會(huì)給你警告信息。如果這些規(guī)則是正確的,或這對(duì)于您的項(xiàng)目(來說是正確的),我真的認(rèn)可你和你隊(duì)友的工作。我不希望程序因?yàn)椤眎f statement”崩潰,我認(rèn)為這樣程序的可讀性很差。執(zhí)行PMD任務(wù),就像是(執(zhí)行)CheckStyle任務(wù)(除了任務(wù)的名稱是“PMD”)。
PMD的使用技巧
我建議你不要使用默認(rèn)的規(guī)則配置集,你需要添加這行代碼(已經(jīng)加上):
ruleSets = []
否則,因?yàn)槟J(rèn)值是這些基本的規(guī)則配置集,基本的規(guī)則配置集會(huì)和你定義的規(guī)則集一起執(zhí)行。所以,如果你的自定義規(guī)則集不在那些基本配置集中,他們?nèi)匀粫?huì)執(zhí)行。
Android Lint
簡(jiǎn)介
“Android lint工具是一個(gè)靜態(tài)代碼分析工具,它能檢查安卓項(xiàng)目源文件的潛在缺陷和優(yōu)化改進(jìn)的正確性,安全性,性能,可用性,可訪問性和國(guó)際化?!闭绻俜骄W(wǎng)站所說,Android Lint是另一種靜態(tài)分析工具,專門為Android服務(wù)。它是非常強(qiáng)大的,能給你大量的建議以提高你的代碼質(zhì)量。
Gradle的形式
android { lintOptions { abortOnError true lintConfig file("${project.rootDir}/config/quality/lint/lint.<span id="6_nwp"><a id="6_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=71b135827dd4deba&k=xml&k0=xml&kdi0=0&luki=7&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=baded47d8235b171&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F6546%2Ehtml&urlid=0" target="_blank">xml</a>") // if true, generate an HTML report (with issue explanations, sourcecode, etc) <span id="7_nwp"><a id="7_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=71b135827dd4deba&k=html&k0=html&kdi0=0&luki=2&n=10&p=baidu&q=06011078_cpr&rb=0&rs=1&seller_id=1&sid=baded47d8235b171&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1922429&u=http%3A%2F%2Fwww%2Eadmin10000%2Ecom%2Fdocument%2F6546%2Ehtml&urlid=0" target="_blank">html</a>Report true // optional path to report (default will be lint-results.html in the builddir) htmlOutput file("$project.buildDir/reports/lint/lint.html") }</span></span>
我建議你使用一個(gè)單獨(dú)的文件來定義哪些配置需要使用和不使用。這個(gè)網(wǎng)站根據(jù)***的ADT版本定義了全部的配置。我的演示項(xiàng)目中的lint文件包含所有這些規(guī)則(ADT 21),包含等級(jí)為”ignore”的”severity”:
IconDensities:這個(gè)規(guī)則配置確保你定義每個(gè)圖像資源中的(分辨率)密度(除了ldpi)。
IconDipSize:這個(gè)規(guī)則配置確保你為每個(gè)dip定義合適的資源(換句話來說,如果你沒有為每個(gè)density設(shè)置相同的圖片資源,則不需要重新設(shè)置圖片大小)。
所以你可以重用這個(gè)lint文件并激活你想要的所有規(guī)則。執(zhí)行Android Lint任務(wù),就像執(zhí)行CheckStyle任務(wù)(除了任務(wù)的名稱是”lint”)。
Android Lint的使用技巧
對(duì)于Android Lint沒有什么特別的技巧,只需要牢記Android Lint會(huì)測(cè)試所有配置規(guī)則,除了那些等級(jí)為“ignore”的“severity”的配置。因此如果發(fā)布了新版本ADT下的新配置規(guī)則,他們將被檢查,而不是忽視。
實(shí)例演示
現(xiàn)在,你有所有的方法為您的項(xiàng)目使用這四個(gè)工具。顯然,如果我們能同時(shí)使用這四個(gè)工具會(huì)更好。你可以添加你的gradle任務(wù)之間的依賴,比如當(dāng)你執(zhí)行一個(gè)任務(wù),其他任務(wù)則是第一個(gè)完成后執(zhí)行。當(dāng)執(zhí)行“check” 任務(wù)的時(shí)候,Checkstyle, Findbugs, PMD, and Android Lint將會(huì)同時(shí)執(zhí)行。在你執(zhí)行/ commiting / pushing / ask merge request 之前進(jìn)行質(zhì)量檢查是一個(gè)很棒的方式。
你可以在這個(gè)Gradle文件中找到所有任務(wù)的一個(gè)完整例子。你可以把所有的質(zhì)量配置文件和Gradle文件從你看到的演示實(shí)例中分開,這些演示的實(shí)例把一起都放在“config/quality” 文件夾下。
關(guān)于“提高Android代碼質(zhì)量的工具有什么”就介紹到這了,更多相關(guān)內(nèi)容可以搜索創(chuàng)新互聯(lián)以前的文章,希望能夠幫助大家答疑解惑,請(qǐng)多多支持創(chuàng)新互聯(lián)網(wǎng)站!
網(wǎng)站欄目:提高Android代碼質(zhì)量的工具有什么
本文網(wǎng)址:http://jinyejixie.com/article0/poshoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、品牌網(wǎng)站建設(shè)、定制開發(fā)、品牌網(wǎng)站設(shè)計(jì)、App設(shè)計(jì)、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)