良好的開(kāi)始是成功的一半,對(duì)于一個(gè) Android 項(xiàng)目更是,一個(gè)好的項(xiàng)目基礎(chǔ)架構(gòu)可以對(duì)項(xiàng)目的后續(xù)發(fā)展有至關(guān)重要的作用赠堵。所以我們?cè)陧?xiàng)目開(kāi)發(fā)之初,應(yīng)該花費(fèi)一些時(shí)間去調(diào)研法褥、設(shè)計(jì)符合自己項(xiàng)目的基礎(chǔ)架構(gòu)茫叭。而且從項(xiàng)目長(zhǎng)遠(yuǎn)的發(fā)展來(lái)看,這些時(shí)間花的非常值得半等。
下面就從項(xiàng)目的方方面面出發(fā)揍愁,介紹一下自己搭建項(xiàng)目時(shí)的一些經(jīng)驗(yàn)。當(dāng)然個(gè)人水平經(jīng)歷有限杀饵,自己的分享可能有片面性和不足性莽囤,歡迎指正補(bǔ)足。
代碼質(zhì)量保證
項(xiàng)目開(kāi)發(fā)是一個(gè)團(tuán)體活動(dòng)切距,每個(gè)人都有自己不同的技術(shù)風(fēng)格以及代碼風(fēng)格朽缎,但是為了項(xiàng)目后續(xù)的可維護(hù)性、健壯性谜悟,我們需要項(xiàng)目開(kāi)發(fā)過(guò)程中话肖,盡早采用統(tǒng)一的編碼風(fēng)格和代碼質(zhì)量檢測(cè)跟進(jìn),防止后續(xù)的代碼管理變得混亂不堪葡幸。下面介紹幾個(gè)已經(jīng)被大家廣泛采用的代碼質(zhì)量保證工具最筒。
CheckStyle
CheckStyle 是一個(gè)幫助開(kāi)發(fā)者嚴(yán)格按照指定的編碼規(guī)范標(biāo)準(zhǔn)編寫(xiě)代碼的一個(gè)工具,它能結(jié)合 Android Studio 與相應(yīng)的插件在開(kāi)發(fā)過(guò)程中自動(dòng)檢測(cè) Java 編寫(xiě)規(guī)范蔚叨,以減少人工檢測(cè)代碼的成本床蜘。也可以使用 Gradle 通過(guò) task 去檢測(cè)代碼是不是符合指定的規(guī)范。
具體如何在 AndroidStudio 中使用蔑水,可以參考之前的一篇文章使用 CheckStyle 檢查代碼
FindBugs
FindBugs 這個(gè)名字本身已經(jīng)揭示了它的作用
“FindBugs uses static analysis to inspect Java bytecode for occurrences of bug patterns.”
FindBugs 是一個(gè)工具悄泥,它能通過(guò)靜態(tài)分析方式掃描 Java 字節(jié)碼
,發(fā)現(xiàn)其中的可能出現(xiàn) bug 的代碼肤粱,它能發(fā)現(xiàn)一些常規(guī)的低級(jí)的錯(cuò)誤,例如一些錯(cuò)誤的邏輯操作厨相,也能發(fā)現(xiàn)一些比較隱晦的錯(cuò)誤领曼。
PMD
PMD 是一個(gè)非常強(qiáng)大的工具鸥鹉,它的作用類似 Findbugs,但是它的檢測(cè)掃描是基于源碼
的庶骄,而且 PMD 不僅僅能檢測(cè) Java 語(yǔ)言毁渗,還能檢測(cè)其他語(yǔ)言。PMD 的目標(biāo)和 Findbugsd 非常的相似单刁,都是通過(guò)定義的規(guī)則靜態(tài)分析代碼中可能出現(xiàn)的錯(cuò)誤灸异,為什么要同時(shí)使用 PMD 和 Findbugs呢?由于 Findbugs 和 PMD 的掃描方式不一樣羔飞,PMD 能發(fā)現(xiàn)的一些 Findbugs 發(fā)現(xiàn)不了的問(wèn)題肺樟,反之亦然。
PMD 可以發(fā)現(xiàn)程序中的無(wú)用變量逻淌、空的catch塊么伯、不必要的對(duì)象創(chuàng)建等。
Android Lint
“The Android lint tool is a static code analysis tool that checks your Android project source files for potential bugs and optimization improvements for correctness, security, performance, usability, accessibility, and internationalization.”
正如官網(wǎng)所說(shuō)卡儒,Android Lint 是另一個(gè)靜態(tài)代碼分析工具,專門(mén)針對(duì) Android 工程田柔。Android Lint 除了對(duì)代碼掃描,分析潛在問(wèn)題之外骨望,還能對(duì)Android的資源進(jìn)行檢測(cè)硬爆,無(wú)用的資源,錯(cuò)位的dip資源等擎鸠。同時(shí)缀磕, AndroidStudio 以及集成了 lint ,你可以很方便的使用糠亩。步驟如下虐骑。
AndroidStudio -> 菜單 -> Analyze -> Inspect Code
另外,你可以通過(guò) gradle 腳步指定自己的 lint 規(guī)則赎线,以及報(bào)告生成路徑
android {
lintOptions {
abortOnError true
lintConfig 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")
}
}
代碼質(zhì)量保證工具終究只是一些輔助手段廷没,如何在項(xiàng)目開(kāi)發(fā)過(guò)程中,保持持續(xù)高質(zhì)量代碼的輸出更多的要依靠開(kāi)發(fā)者自身對(duì)自己的要求垂寥,以及團(tuán)隊(duì)長(zhǎng)期的技術(shù)文化建設(shè)上颠黎。
持續(xù)集成
如果是開(kāi)源項(xiàng)目可以使用 travis 進(jìn)行持續(xù)集成,travis 跟 github 結(jié)合的特別好滞项。使用起來(lái)也比較簡(jiǎn)單狭归,如果你的開(kāi)源項(xiàng)目已經(jīng)跟 travis 結(jié)合成功,你可以使用下面的 bubble 代碼為自己的項(xiàng)目加一個(gè) bubble文判,方便在項(xiàng)目主頁(yè)查看項(xiàng)目最新的編譯狀態(tài)过椎。
![Build Status](https://travis-ci.org/maoruibin/TranslateApp.svg?branch=master)
效果如下
如果是企業(yè)項(xiàng)目,還是自己搭建個(gè)持續(xù)集成工具比較好玩戏仓,嗯疚宇,就是 Jenkins亡鼠。你可以按照 Jenkins 的安裝文檔在自己公司的內(nèi)網(wǎng)環(huán)境下安裝 Jenkins,然后就可以隨意配置各種 task 敷待。
另外间涵,前段時(shí)間發(fā)現(xiàn)另一個(gè)國(guó)內(nèi)的持續(xù)集成工具也不錯(cuò),是在線形式的榜揖,類似 Travis勾哩, 叫做 flow.ci ,比較有意思的是他有一個(gè)工作流的東西,比較好玩举哟,而且跟 fir 天然支持思劳。
生產(chǎn)力 / 效率
真實(shí)的團(tuán)隊(duì)項(xiàng)目開(kāi)發(fā)是一個(gè)持續(xù)的過(guò)程,一個(gè)項(xiàng)目的生命周期有長(zhǎng)有短炎滞,參與的人數(shù)有多有少敢艰,但即使比較短也可能要持續(xù)數(shù)月之久,所以一般的項(xiàng)目都需要花費(fèi)不少時(shí)間精力册赛。對(duì)于研發(fā)來(lái)講钠导,我們可以不關(guān)注效率方面的信息,使用最原始的工具森瘪、API 通過(guò)刀耕火種的方式完成開(kāi)發(fā)牡属,其實(shí) Android 剛流行的時(shí)候,我們的開(kāi)發(fā)確實(shí)是這樣過(guò)來(lái)的扼睬,各方面的工具逮栅,開(kāi)源方案較少。
但是經(jīng)過(guò) 10 年的發(fā)展窗宇,Android 開(kāi)發(fā)生態(tài)已經(jīng)有了長(zhǎng)足的進(jìn)步和完善措伐,包括開(kāi)發(fā)工具、開(kāi)源方案都已經(jīng)非常完善军俊,所以有必要在開(kāi)發(fā)中留意并使用一些已經(jīng)被其他團(tuán)隊(duì)證明可行的方案技術(shù)以及一些生產(chǎn)力工具侥加。
下面列舉一些對(duì) Android 開(kāi)發(fā)效率有提升的工具以及相關(guān)的東東。
AndroidStudio Templete
項(xiàng)目開(kāi)發(fā)過(guò)程中粪躬,隨著開(kāi)發(fā)框架的成熟担败,總會(huì)有一些代碼經(jīng)常重復(fù)性的編寫(xiě),這時(shí)镰官,你可以通過(guò)使用 AndroidStudio 的 templete 來(lái)快速生成代碼提前。如新建 Activity, 現(xiàn)在大項(xiàng)目都會(huì)有一個(gè) BaseActivity, 盡管 AS 也提供了 Activity 的模板,但是跟我們項(xiàng)目需要差別很大泳唠,所以狈网,這時(shí)可以自定義自己項(xiàng)目的模板。
其實(shí)模板的適用范圍特別大,不僅僅是 Activity 所有一些重復(fù)性比較強(qiáng)的模塊類代碼都可以使用自定義模板孙援,這里的想想空間比較大害淤,結(jié)合項(xiàng)目中的一些成熟的開(kāi)發(fā)框架,你可以使用模板去把一些重復(fù)性的工作用模板完成拓售。
至于如何自定義模板,網(wǎng)上的文章很多镶奉。
參考鏈接
- android-guidelines/project_and_code_guidelines.md at master · ribot/android-guidelines
- Android-Studio-MVP-template
AndroidStudio 插件
下面列舉一些自己常用的 AS 插件础淤。
GsonFormat
首推 GsonFormat
, 這個(gè)插件我在 2015 年開(kāi)始使用哨苛,簡(jiǎn)直是神器鸽凶。尤其是自己已經(jīng)手工寫(xiě)了很久的實(shí)體類后,當(dāng)時(shí)發(fā)現(xiàn)這個(gè)插件后建峭,欣喜若狂玻侥,具體它是干什么的,簡(jiǎn)單說(shuō)亿蒸,就是幫助開(kāi)發(fā)者快速將服務(wù)端返回的一個(gè) JSON 實(shí)體字符串轉(zhuǎn)化為 Java 實(shí)體類的 AS 插件凑兰。具體可以查看項(xiàng)目主頁(yè)。
zzz40500/GsonFormat: 根據(jù)Gson庫(kù)使用的要求,將JSONObject格式的String 解析成實(shí)體
ButterKnife
butterknife 是 JW 主導(dǎo)開(kāi)發(fā)的一個(gè) View 注入工具边锁。它使用注解簡(jiǎn)單明了的替換傳統(tǒng)的 findViewById
姑食,還可以簡(jiǎn)化事件點(diǎn)擊的監(jiān)聽(tīng)等等,更多使用介紹可以看官網(wǎng)或者之前的一篇關(guān)于 ButterKnife 的介紹文章茅坛。
上面提到的這些用法只是讓你提速音半,但真正意義的效率飛躍是使用它提供的 AS 插件 - ButterKnifer Zelezny,使用他后可以讓你的 View 實(shí)例化從此自動(dòng)化贡蓖,工具化曹鸠,無(wú)需手動(dòng)碼代碼。
生產(chǎn)力/效率總結(jié)
在開(kāi)發(fā)中斥铺,個(gè)人非常注重生產(chǎn)力效率彻桃。因?yàn)槟愕男侍嵘馕吨阍谕瑯拥臅r(shí)間里產(chǎn)出就比別人多,側(cè)面體現(xiàn)了你的價(jià)值比別人大仅父,而這僅僅是因?yàn)槟惚葎e人會(huì)使用一個(gè)工具叛薯,多么神奇的結(jié)論。
使用工具后笙纤,在節(jié)省你工作時(shí)間的同時(shí)耗溜,從另一方面講也是節(jié)省公司的人力成本,所以如果有工具可以提升自己的工作效率省容,那么我會(huì)非常樂(lè)意的分享使用它抖拴。
另外,對(duì)于效率的追求沒(méi)有終點(diǎn),你應(yīng)該花點(diǎn)時(shí)間和心思去收集和整理一些效率工具阿宅,從而使自己的工作生活更加輕松候衍。其實(shí),如果你關(guān)注過(guò)一些大公司的話洒放,在大公司里甚至?xí)幸粋€(gè)專門(mén)的部門(mén)用于研究生成企業(yè)內(nèi)部的生產(chǎn)力效率工具蛉鹿。可想而知往湿,生產(chǎn)力/效率是一個(gè)多么重要的話題妖异。
開(kāi)源框架
網(wǎng)絡(luò)
- OkHttp
- Retrofit
數(shù)據(jù)庫(kù)
事件總線
- EventBus
- Otto
圖片
- Glide
- Picasso
- Freso
網(wǎng)絡(luò)解析
Log
調(diào)試
SharePreference
路由框架
技術(shù)文檔
在項(xiàng)目開(kāi)發(fā)過(guò)程中,必然會(huì)涉及到團(tuán)隊(duì)成員的溝通领追,如何更好的溝通他膳?QQ ?微信 绒窑?棕孙? 對(duì)于一般的非技術(shù)性的事務(wù),這些桌面溝通工具確實(shí)可以很便捷的完成我們的需求些膨,但是對(duì)于我們開(kāi)發(fā)者蟀俊,大多時(shí)候需要溝通一些技術(shù)上的問(wèn)題,對(duì)于技術(shù)上這種非常嚴(yán)肅的問(wèn)題傀蓉,如果只是在群里討論欧漱,粘代碼會(huì)很容易把答案淹沒(méi),無(wú)法形成一個(gè)長(zhǎng)久的記錄葬燎。
所以误甚,文檔就顯得特別重要。在實(shí)際開(kāi)發(fā)中谱净,不同的人負(fù)責(zé)的模塊不一樣窑邦,但是不論你負(fù)責(zé)那個(gè)模塊,只要你的模塊有可能為其他成員提供支持壕探,那么你都應(yīng)該寫(xiě)一份簡(jiǎn)單的使用文檔冈钦,方便其他人在使用時(shí),直接看你的文檔就可以解決問(wèn)題李请。
不至于其他人在用到你寫(xiě)的模塊時(shí)瞧筛,緬甸的同事在項(xiàng)目中搜索你在什么地方使用了相關(guān)的 API ,然后大海撈針般的搜到相關(guān)的代碼后导盅,一邊閱讀你的代碼一遍思考怎么在自己的業(yè)務(wù)場(chǎng)景中使用较幌。直率點(diǎn)的同事可能不顧你現(xiàn)在是不是忙工作,直接會(huì)發(fā)消息給你白翻,詢問(wèn)相關(guān) API 的使用乍炉,然后你的工作遭到打斷绢片,馬上指點(diǎn)如何使用自己設(shè)計(jì)的 API。
然后這樣的事情岛琼,一遍遍的發(fā)生在開(kāi)發(fā)過(guò)程中底循,不同的同事遇到同樣的問(wèn)題,每次都是直接去詢問(wèn)當(dāng)事人槐瑞。
這是一種非常低效的開(kāi)發(fā)模式熙涤。尤其是那種大項(xiàng)目,模塊可能很多困檩,這種問(wèn)題也會(huì)很多灭袁。
所以,如果大家在開(kāi)發(fā)自己的模塊時(shí)窗看,使用文檔把一些技術(shù)要點(diǎn)簡(jiǎn)單羅列出來(lái),然后把文檔放在一個(gè)統(tǒng)一的地方倦炒,大家以后有問(wèn)題显沈,直接找文檔,如果文檔還沒(méi)解決問(wèn)題逢唤,再去找負(fù)責(zé)人拉讯,是不是會(huì)節(jié)省很多溝通成本。
關(guān)于文檔鳖藕,這里不僅僅是技術(shù)文檔魔慷,開(kāi)發(fā)中的文檔有很多類型,下面列舉一些文檔著恩。
技術(shù)說(shuō)明文檔
如上所述院尔,就是典型的技術(shù)模塊說(shuō)明文檔,應(yīng)該包括簡(jiǎn)單明了使用說(shuō)明以及一些特殊情況處理喉誊。
規(guī)范說(shuō)明類文檔
比如代碼中的命名規(guī)范邀摆,提交規(guī)范等。下面是 GitHub 上自己的一些開(kāi)源文檔伍茄。
- ribot 公司的代碼規(guī)范
- LoranWong/Android-Code-Style: A common Android coding style. 可在組內(nèi)推行的Android代碼規(guī)范
- Blankj/AndroidStandardDevelop: 安卓開(kāi)發(fā)規(guī)范(updating)
工具使用類文檔
比如項(xiàng)目中一些開(kāi)發(fā)工具使用說(shuō)明栋盹。
常用信息檢索類文檔
比如項(xiàng)目中的全局屬性類介紹。
其他類
- Commit message 和 Change log 編寫(xiě)指南 - 阮一峰的網(wǎng)絡(luò)日志
- ruanyf/document-style-guide: 中文技術(shù)文檔的寫(xiě)作規(guī)范