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)大的工具,它的作用類(lèi)似 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)代碼分析工具,專(zhuān)門(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ò),是在線形式的,類(lèi)似 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)的模塊類(lèi)代碼都可以使用自定義模板,這里的想想空間比較大,結(jié)合項(xiàng)目中的一些成熟的開(kāi)發(fā)框架,你可以使用模板去把一些重復(fù)性的工作用模板完成。

至于如何自定義模板,網(wǎng)上的文章很多。

參考鏈接

AndroidStudio 插件

下面列舉一些自己常用的 AS 插件。

GsonFormat

首推 GsonFormat, 這個(gè)插件我在 2015 年開(kāi)始使用,簡(jiǎn)直是神器。尤其是自己已經(jīng)手工寫(xiě)了很久的實(shí)體類(lèi)后,當(dāng)時(shí)發(fā)現(xiàn)這個(gè)插件后,欣喜若狂,具體它是干什么的,簡(jiǎn)單說(shuō),就是幫助開(kāi)發(fā)者快速將服務(wù)端返回的一個(gè) JSON 實(shí)體字符串轉(zhuǎn)化為 Java 實(shí)體類(lèi)的 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è)專(zhuān)門(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ā)消息給你,詢(xún)問(wèn)相關(guān) API 的使用,然后你的工作遭到打斷,馬上指點(diǎn)如何使用自己設(shè)計(jì)的 API。

然后這樣的事情,一遍遍的發(fā)生在開(kāi)發(fā)過(guò)程中,不同的同事遇到同樣的問(wèn)題,每次都是直接去詢(xú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ā)中的文檔有很多類(lèi)型,下面列舉一些文檔。

技術(shù)說(shuō)明文檔

如上所述,就是典型的技術(shù)模塊說(shuō)明文檔,應(yīng)該包括簡(jiǎn)單明了使用說(shuō)明以及一些特殊情況處理。

規(guī)范說(shuō)明類(lèi)文檔

比如代碼中的命名規(guī)范,提交規(guī)范等。下面是 GitHub 上自己的一些開(kāi)源文檔。

工具使用類(lèi)文檔

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

常用信息檢索類(lèi)文檔

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

其他類(lèi)

參考鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,229評(píng)論 25 708
  • 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,293評(píng)論 5 16
  • 太長(zhǎng)了,還是轉(zhuǎn)載吧...今天在看博客的時(shí)候,無(wú)意中發(fā)現(xiàn)了@Trinea在GitHub上的一個(gè)項(xiàng)目Android開(kāi)源...
    龐哈哈哈12138閱讀 20,394評(píng)論 3 283
  • 有那么一群人,是精分。他們或許封閉,心理添上了陰影。有的一生都處于灰白空間,有的努力為人生添上色彩。在一個(gè)思維空間...
    美意_cb13閱讀 500評(píng)論 0 0
  • 回家嘍! 現(xiàn)在的人對(duì)過(guò)年回家的感覺(jué)沒(méi)有老一輩那么的強(qiáng)烈了,回家…回家… 過(guò)年回家不是為了吃吃喝喝玩玩,是為了不讓愛(ài)...
    cca8065f6f69閱讀 282評(píng)論 0 1

友情鏈接更多精彩內(nèi)容