如何提高安卓代碼的質量和語法

本文講的是如何提高安卓代碼的質量和語法,

在這篇文章中,我會介紹幾種不同的方式,讓你通過自動化工具提高你的Android代碼質量,包括?Checkstyle,?Findbugs,PMD, 當然,還有我們最熟悉的Android Lint。 為了讓你的代碼保持縝密的語法,同時避免一些糟糕的實現和錯誤,使用自動化的方式測試你的代碼十分有用,尤其是當你和隊友一起工作時。我會細心地解釋如何直接通過你的Gradle構建腳本使用這些工具,和怎么方便地配置它們。

Fork這個例子

我強烈建議你fork此項目,因為我將介紹的所有例子均來自于它。同時,你也能自己測試這些質量控制工具。

關于Gradle任務

理解任務在Gradle中的概念是理解這篇文章的基礎(廣義上,也是學會撰寫Gradle腳本的基礎)。我強烈建議你先閱讀一下Gradle文檔中關于任務的部分(這個和這個)。 文檔中包含許多例子,非常容易理解。好了,那現在我就假設你已經fork了我的倉庫,將項目導入了你的Android Studio,同時也已經熟悉了Gradle的任務。如果沒有也不必擔心,我會盡我所能解釋得通俗易懂。

Demo項目的層次結構

你能將gradle腳本分離在很多文件中,目前我分了3個gradle文件:

  • 一個在根目錄,這個文件是關于項目的一些配置(比如使用的maven倉庫和使用的Gradle版本);
  • 一個在子文件夾app中,這是一個典型的構建Android應用的Gradle文件。
  • 一個在子文件夾config中,這個才是我們所關注的,我用它來為我的項目集成并配置所有的質量控制工具。

Checkstyle

簡介

Checkstyle是一個幫助程序員堅持規范化編寫Java代碼的開發工具.它自動檢查Java代碼,將程序員從這項乏味(但重要)的工作中解放出來.

正如Checkstyle的開發者所說,這個工具幫助你在一個項目中,精確并靈活地定義和保持編碼規范。當你運行Checkstyle時,它會分析你的Java代碼,根據你的配置找出所有錯誤并提示你。

通過Gradle配置

以下代碼展示了在你項目中使用Checkstyle的基本配置(作為一個Gradle任務):

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 'src'include '**/*.java'exclude '**/gen/**'classpath = files()
}

配置完后,這個任務就會根據checkstyle.xmlsuppressions.xml兩個文件來分析你的代碼。只需要在Gradle面板中啟動這個任務,Android Studio就會自動執行此任務。

checkstyle

運行Checkstyle后,你會得到一份報告,上面紀錄了在你項目中找到的所有問題。而且它非常易于理解。

如果你想更個性化地配置Checkstyle,請參考這篇文檔。

Checkstyle使用技巧

Checkstyle會探測到大量問題,尤其當你使用了很多規則--比如你想要一個精確的語法。雖然我通過Gradle腳本來使用Checkstyle(比如在我push代碼之前),但我建議你同時使用Checkstyle的IntellJ/Android Studio插件(你能直接通過工具欄File/Settings/Plugins安裝它們。譯者注:mac版是Android Studio/Preferences/Plugins)。這種方式也是根據你之前為Gradle指定的那兩個配置文件在你的項目中應用Checkstyle。這樣的好處是能直接在Android Studio中查看結果。更實用的是,結果可以直接鏈接到錯誤所在代碼(Gradle的那種方式仍然很重要,因為你能通過Jenkins這樣的自動化構建系統來使用它)。

FindBugs

簡介

Findbugs?需要簡介嗎?它的名字已經說明了一切。

Findbugs 通過靜態分析來檢查Java字節碼中的錯誤模式。

Findbugs?基本上只需要項目的字節碼文件來做分析,因此它十分易用。它會檢測出諸如錯誤使用布爾運算符這樣常見的錯誤。同時,它還能檢測出一些由于誤解語言特性所導致的錯誤,比如Java中方法參數的重新賦值(實際上是無效的,因為Java中方法的參數是值傳遞)。

通過Gradle配置

以下代碼展示了在你項目中使用Findbugs的基本配置(作為一個Gradle任務):

task findbugs(type: FindBugs) {ignoreFailures = falseeffort = "max"reportLevel = "high"excludeFilter = new File("${project.rootDir}/config/quality/findbugs/findbugs-filter.xml")classes = files("${project.rootDir}/app/build/classes")source 'src'include '**/*.java'exclude '**/gen/**'reports {xml.enabled = falsehtml.enabled = truexml {destination "$project.buildDir/reports/findbugs/findbugs.xml"}html {destination "$project.buildDir/reports/findbugs/findbugs.html"}}classpath = files()
}

這和Checkstyle的任務很像。Findbugs支持HTMLXML格式的報告,我選擇了HTML,因為其可讀性更強。除此以外,你只需要標記一下報告的路徑來快速讀取它。如果Findbugs中的錯誤被檢測到,任務會失敗(仍然產生報告)。執行Findbugs的方式和Checkstyle完全一樣(只是名字變成了"Findbugs")。

Findbugs使用技巧

由于Android項目與Java項目有輕微不同,我強烈建議大家使用findbugs-filter。例子點這里(示例項目的其中之一)。它一般會忽略掉R文件和清單文件。另外,由于Findbugs是分析你的字節碼,你至少需要編譯一次項目來測試它。

PMD

簡介

這個工具十分有趣:PMD并沒有一個真正的名字。在官方網站上你會發現一些有趣的命名建議:

  • Pretty Much Done
  • Project Meets Deadline

實際上,PMD是一個非常強大的工具。它的工作方式有點像Findbugs,但它直接檢查源碼而非字節碼(另外,PMD支持大量語言)。目標也和Findbugs高度相似--通過靜態分析找出能導致bug的模式。那么為什么我們還要同時使用FindbugsPMD呢?好吧,盡管FindbugsPMD的目標一致,但它們的檢查方法并不同。因此PMD有時可以找到Findbugs找不到的bug,反過來也一樣。

通過Gradle配置

以下代碼展示了在你項目中使用PMD的基本配置(作為一個Gradle任務):

task pmd(type: Pmd) {ruleSetFiles = files("${project.rootDir}/config/quality/pmd/pmd-ruleset.xml")ignoreFailures = falseruleSets = []source 'src'include '**/*.java'exclude '**/gen/**'reports {xml.enabled = falsehtml.enabled = truexml {destination "$project.buildDir/reports/pmd/pmd.xml"}html {destination "$project.buildDir/reports/pmd/pmd.html"}}
}

PMD的結果同樣與Findbugs有許多相同之處。PMD的報告同樣支持HTMLXML,因此我再次選擇了HTML的格式。我強烈建議使用你自己的自定義規則集文件,就像我在例子中做的這樣(參照這個文件)。當然,你還需要看一下自定義規則集的文檔。我這么建議是因為PMD相比Findbugs而言更具爭議。比如,如果你沒有折疊if條件語句或寫了一個空的if條件語句,它一般就會警告你。我認為應該由你或你的同事為你們的項目來定義這些規則是否正確。像我自己就喜歡不折疊if條件語句,因為這樣更具可讀性。執行PMD的方式和Checkstyle完全一樣(只是名字變成了"PMD")。

PMD使用技巧

由于我推薦你不要使用默認的規則集,你需要加上這行代碼(上面已經加上了)

ruleSets = []

不加的話,由于默認值是基本的規則集,那些默認的規則集會始終伴隨你自定義的規則集一起執行。這樣即使你在自定義的規則集中指明不使用基礎規則集中的規則,它們仍然會被考慮在內。

Android Lint

簡介

Android lint 工具是一個靜態代碼分析工具。它通過你Android項目的源碼檢測出潛在的錯誤,并為項目在正確性,安全性,性能,可用性, 易用性和國際化等方面提供最佳的改進方案。

正如其官網所說,Android Lint是一款專注于Android的靜態分析工具。它非常強大,能給出大量建議來提高你代碼的質量。

通過Gradle配置

android {lintOptions {abortOnError truelintConfig file("${project.rootDir}/config/quality/lint/lint.xml")// if true, generate an HTML report (with issue explanations, sourcecode, etc)htmlReport true// optional path to report (default will be lint-results.html in the builddir)htmlOutput file("$project.buildDir/reports/lint/lint.html")
}

我推薦你使用一個單獨的文件來定義哪些規則應該使用。這個網站定義了所有來自最新ADT版本的規則。除了"ignore"中"severity"級別的規則外,我的demo中的Lint文件包含了所有規則:

  • IconDensities:這個規則確保你為每一種分辨率都設置了對應的圖片資源(除ldpi外)。
  • IconDipSize:這個規則確保你正確地定義了資源的每種尺寸。(換句話說,檢查你是否為不同分辨率定義了完全相同的圖片,而沒有重新設置圖片大小)。

所以你能直接復用這份lint文件并激活所有你想要的規則。執行Android Lint任務的方式和Checkstyle完全一樣(只是名字變成了"lint")。

Android Lint使用技巧

Android Lint沒有什么特殊的使用技巧,你只需要記住,Android Lint總是會測試除"ignore"中"severity"級別的規則外的所有規則。所以如果隨著ADT的新版本出現了新的規則,它們會被檢查,而不會被忽略。

通過一個任務管理以上所有工具

現在你已經掌握了為你項目使用4個質量控制工具的關鍵。但如果你能同時使用4個工具就更好了。你能在你的Gradle任務之間添加依賴,比如當你執行一個任務時,另外一個會在第一個任務完成后執行。一般在Gradle中,你通過"check"任務為你的質量工具添加依賴:

check.dependsOn 'checkstyle', 'findbugs', 'pmd', 'lint'

現在,當你執行"check"任務,Checkstyle,?Findbugs,?PMD, 和Android Lint?都會被執行。這是一個非常好的方式來在你commit/push/請求合并之前檢查代碼質量。

你能在這個Gradle文件中獲得所有這些任務的示例。你能在demo源碼的config/quality文件夾中找到所有關于質量控制的配置和gradle文件。

總結

正如這篇文章介紹的,Android的質量控制工具配合Gradle使用非常簡單。質量控制工具不僅僅能檢查你電腦中的本地項目,還能檢查一些自動化構建平臺上的代碼,比如Jenkins/Hudson等。這使你能將質量控制的工作依附于自動構建系統,實現自動化。執行所有測試的命令與執行Jenkins和Hudson相同,最簡單的命令是:

gradle check

請自由評論這篇文章,或者咨詢任何與Android代碼質量相關的問題!:wink:

快去實踐吧!





原文發布時間為:2016年01月07日

本文來自云棲社區合作伙伴掘金,了解相關信息可以關注掘金網站。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454784.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454784.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454784.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

洛谷 U3357 C2-走樓梯

https://www.luogu.org/problem/show?pidU3357 題目背景 在你成功地解決了上一個問題之后,方方方不禁有些氣惱,于是他在樓梯上跳來跳去,想要你求出他跳的方案數。.. 題目描述 方方方站在一個n階樓梯下面,他每次可以往上跳一步或兩…

Liunx 系統調優

Sysctl命令用來配置與顯示在/proc/sys目錄中的內核參數.如果想使參數長期保存,可以通過編輯/etc/sysctl.conf文件來實現。 命令格式:sysctl [-n] [-e]-w # 臨時改變某個指定參數的值,如sysctl -w net.ipv4.ip_forward1-a # 顯示…

php多文件上傳存儲到表,PHP 實現一種多文件上傳的方法

搜索熱詞之前在實現表單中file類型input選擇多圖片的時候找到一種方式 也許不是最好的但親測可行且支持ie7以上以及chrome瀏覽器在表單中使用正常多文件選擇multiple屬性PHP;">然后使用AjaxFileUpload或其他方式提交將對應命名的file文件 $file[‘image] 轉化為 json打…

CentOS7設置自定義開機啟動,添加自定義系統服務

Centos 系統服務腳本目錄: /usr/lib/systemd/ 有系統(system)和用戶(user)之分,如需要開機沒有登陸情況下就能運行的程序,存在系統服務(system)里,即&#xf…

成功應聘Intel的真實經歷

編者按:INTEL(英特爾)公司創建于1968年,是全球最大的芯片制造商,Intel研究中心更是匯聚了全球無數的精英,一批年輕人抱著夢想走入了這里,過去我們談到了太多關于Intel技術與市場方面&#xff0c…

Kotlin學習記錄1

參考我的博客:http://www.isedwardtang.com/2017/09/02/kotlin-primer-1/轉載于:https://www.cnblogs.com/EdwardTang/p/7476787.html

Keepalived配置文件詳解

keepalivedkeepalived是集群管理中保證集群高可用的一個服務軟件,其功能類似于heartbeat,用來防止單點故障。keepalived工作原理keepalived是以VRRP(Virtual Router Redundancy Protocol,即虛擬路由冗余協議)協議為實現…

php高等數學,中國大學《高等數學(四)》期末答案高校邦《PHP語言程序設計》見面課答案...

參考答案如下Conversation 2Pretco-A12.9-10.mp3:9、中國 A) Some shoes are missing. B) Itsdelivery is delayed.C) The order is cancelled. D) Some packages are damaged.10、中國 A) Giving an additional discount. B) Renewing the contract.C) Sending the goods by a…

深入剖析ThreadLocal實現原理以及內存泄漏問題

關于ThreadLocalMap<ThreadLocal, Object>弱引用問題&#xff1a; 當線程沒有結束&#xff0c;但是ThreadLocal已經被回收&#xff0c;則可能導致線程中存在ThreadLocalMap<null, Object>的鍵值對&#xff0c;造成內存泄露。&#xff08;ThreadLocal被回收&#xf…

解讀《普通大學應屆畢業生如何成功應聘微軟》

《普通大學應屆畢業生如何成功應聘微軟》這篇文章很有實踐性&#xff0c;我所要提的&#xff0c;是最后一道面試&#xff0c;也就是唐駿本人對作者的面試&#xff0c;這一輪看似平常的面試大有門道。仔細想想&#xff0c;為什么這些問題由唐駿本人來問&#xff0c;他為什么要這…

grep 命令的 12 個實例

2019獨角獸企業重金招聘Python工程師標準>>> 你是否遇到過需要在文件中查找一個特定的字符串或者樣式&#xff0c;但是不知道從哪兒開始&#xff1f;那么,就請grep來幫你吧。 grep是每個Linux發行版都預裝的一個強有力的文件模式搜索工具。無論何種原因&#xff0c;…

php 怎么從memcache緩存數據中統計某一字段總數,php和memcache統計在線人數的方法...

$mc new Memcache ();// 連接memcache$mc->connect("127.0.0.1", 11211);// 獲取 在線用戶 IP 和 在線時間數據$online_members $mc->get(online_members);// 如果為空&#xff0c;初始化數據if (!$online_members) {$online_members array();}// 獲取用戶i…

ubuntu之ufw防火墻

UFW是Ubuntu下的一個主機端的iptables類防火墻配置工具(底層調用iptables來處理)。這個工具的目的是提供給用戶一個可以輕松駕馭的界面&#xff0c;就像包集成和動態檢測開放的端口一樣。雖然功能較簡單&#xff0c;但對桌面型應用來說比較實用&#xff0c;基本常用功能都有&am…

background-size在IE8不兼容問題

background-size在IE8及以下瀏覽器不兼容&#xff1b;要解決的話要用濾鏡&#xff1a; filter: progid: DXImageTransform.Microsoft.AlphaImageLoader( src, sizingMethodscale); 注意&#xff1a;此處src的路徑必須是絕對路徑&#xff0c;相對路徑不可以&#xff01; 當寫完…

程序員 大牛 面試

水 滴 石 穿 -- 找工作記 -- yurking&#xff08;yurkinggmail.com&#xff09; 一日一錢&#xff0c;千日千錢&#xff0c;繩鋸木斷&#xff0c;水滴石穿! 這個東西寫出來有一段時間了&#xff0c;但是一直沒發&#xff0c;想著等有時間了再好好的看一看&#xff0c;改一…

Linux : shell基礎(慕課網Linux達人養成計劃課程筆記)

Shell概述 shell是Linux中的命令行解釋器&#xff0c;為用戶提供了一個向Linux內核發送請求一邊運行程序的界面系統級程序&#xff0c;用戶可以用shell來啟動、掛起、停止甚至編寫一些程序。shell還是一個功能相當強大的編程語言&#xff0c;易編寫&#xff0c;易調試&#xff…

基于matlab的大米,大米顆數計算MATLAB軟件

應用背景大米是人類的主食之一&#xff0c;是稻谷經清理、礱谷、碾米、成品整理等工序后制成的成品。人們購買米大多采用直接稱量的方法&#xff0c;市面上也有許多儀器采用光電傳感器等方式用于生產加工時米粒的計數。然而這樣的方法都比較依賴于設備&#xff0c;不方便人們日…

ubuntu17.04之apt-get源

不要問我這么簡單的也要寫&#xff0c;我只想說在網上百度了一堆源&#xff0c;在筆者這里只有一個能用&#xff0c;悲傷的表情&#xff0c;還是記錄一下吧 這個是清華的apt-get源&#xff0c;適用于ubuntu17.04apt-get源文件目錄 /etc/apt/sources.list &#xff0c;記得先備份…

HttpClient通過Post方式發送Json數據

服務器用的是Springmvc&#xff0c;接口內容&#xff1a; [java] view plaincopy print?ResponseBody RequestMapping(value"/order",methodRequestMethod.POST) public boolean order(HttpServletRequest request,RequestBody List<Order> orders) throws …

openssl、ssh

PKI&#xff1a;公鑰基礎設施&#xff0c;保證服務器向客戶端發送的證書的可靠性&#xff1b;簽證機構&#xff1a;CA注冊機構&#xff1a;RA證書吊銷列表&#xff1a;CRL證書存取庫&#xff1a;CAB威瑞信——verisignGlobalSign賽門鐵克AsiaCOM國際標準化組織定義了證書的標準…