Android 項(xiàng)目開(kāi)發(fā)清單

良好的開(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)上的文章很多镶奉。

參考鏈接

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)源文檔伍茄。

工具使用類文檔

比如項(xiàng)目中一些開(kāi)發(fā)工具使用說(shuō)明栋盹。

常用信息檢索類文檔

比如項(xiàng)目中的全局屬性類介紹。

其他類

參考鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末例获,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子曹仗,更是在濱河造成了極大的恐慌榨汤,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件整葡,死亡現(xiàn)場(chǎng)離奇詭異件余,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)啼器,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)旬渠,“玉大人,你說(shuō)我怎么就攤上這事端壳「娑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵损谦,是天一觀的道長(zhǎng)岖免。 經(jīng)常有香客問(wèn)我,道長(zhǎng)照捡,這世上最難降的妖魔是什么颅湘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮栗精,結(jié)果婚禮上闯参,老公的妹妹穿的比我還像新娘。我一直安慰自己悲立,他們只是感情好鹿寨,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著薪夕,像睡著了一般脚草。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上原献,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天馏慨,我揣著相機(jī)與錄音,去河邊找鬼嚼贡。 笑死熏纯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的粤策。 我是一名探鬼主播樟澜,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼叮盘!你這毒婦竟也來(lái)了秩贰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤柔吼,失蹤者是張志新(化名)和其女友劉穎毒费,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體愈魏,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡觅玻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年想际,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溪厘。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胡本,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出畸悬,到底是詐尸還是另有隱情侧甫,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布蹋宦,位于F島的核電站披粟,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏冷冗。R本人自食惡果不足惜守屉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蒿辙。 院中可真熱鬧胸梆,春花似錦、人聲如沸须板。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)习瑰。三九已至,卻和暖如春秽荤,著一層夾襖步出監(jiān)牢的瞬間甜奄,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工窃款, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留课兄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓晨继,卻偏偏與公主長(zhǎng)得像烟阐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子紊扬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,527評(píng)論 25 707
  • 1 背景 一個(gè)項(xiàng)目開(kāi)發(fā)必然會(huì)涉及團(tuán)隊(duì)協(xié)作蜒茄,而工程質(zhì)量就需要團(tuán)隊(duì)去保證。一般我們期望的代碼:無(wú)潛在風(fēng)險(xiǎn)餐屎、無(wú)重復(fù)邏輯檀葛、...
    zyl06閱讀 3,212評(píng)論 5 16
  • 太長(zhǎng)了,還是轉(zhuǎn)載吧...今天在看博客的時(shí)候腹缩,無(wú)意中發(fā)現(xiàn)了@Trinea在GitHub上的一個(gè)項(xiàng)目Android開(kāi)源...
    龐哈哈哈12138閱讀 20,140評(píng)論 3 283
  • 有那么一群人屿聋,是精分空扎。他們或許封閉,心理添上了陰影润讥。有的一生都處于灰白空間转锈,有的努力為人生添上色彩。在一個(gè)思維空間...
    美意_cb13閱讀 405評(píng)論 0 0
  • 回家嘍象对! 現(xiàn)在的人對(duì)過(guò)年回家的感覺(jué)沒(méi)有老一輩那么的強(qiáng)烈了黑忱,回家…回家… 過(guò)年回家不是為了吃吃喝喝玩玩,是為了不讓愛(ài)...
    cca8065f6f69閱讀 264評(píng)論 0 1