一個2年安卓開發者的一些忠告

釋懷發表於2016-11-03

我仍記得2014年我決定做安卓開發的那天,這是我一生中做出的最好決定之一。到現在已經有2年半了,最初的時候,並沒有人告訴我如何做才是正確的。我犯了很多錯誤,浪費了很多時間。

一年半之後,我有機會和一個真正有才而且經驗豐富的安卓開發者一起工作,他指導我,教我正確的做事方式。這期間我學到了很多東西,學會了該做什麼不該做什麼。

我直接或者間接幫助其它開發者也有很長一段時間了。這裡是我的StackOverflowGithub的簡介。

本文我將分享這幾年所收集的精華。也許可以幫助某人更快上手,避免重複我犯的錯誤。

1. 不要重複造輪子

最初,我有一種不願使用開源庫的思想。不管需要什麼,我總想自己去實現。這是一種非常可怕的思想。

如果在開發app的時候遇到一個問題,而這個問題已經被別人很好的解決了,為什麼不使用它呢?你可以節省大量時間啊。

把更多的精力花在app的業務邏輯上吧。如果你想在app中發起一個網路呼叫,是不需要自己去造一個Retrofit來的。

Bonus:Android Arsenalmaintains a database of almost all Android libraries ever made. Go check it out.

2. 別盲目的選擇library

在Github上有許多免費使用的開源庫,但是別因太激動而盲目的使用

檢查library的star數目,越多越好。看看作者是否還建立了其它的一些受歡迎的庫。檢視issues(開啟和關閉的都看),這可以讓你對這個library的健壯性和穩定性有更好的瞭解。

如果你時間充足,你應該深入這個庫的程式碼看看它到底是都真的值得使用。

你只需要確保它的程式碼是可靠的,bug不多的,高質量的。

小貼士:使用Dryrun的命令列嘗試任何library。


3. 坐下來,喝杯咖啡,閱讀更多的程式碼

我們在閱讀別人程式碼上花的時間比自己寫程式碼的時間多得多,如果你不是的話,從今天就開始做吧。

不管你現在能寫出什麼樣的程式碼,總是因為在某年某月你閱讀和學習到了什麼東西。它只是你已有知識的反映。

安卓的偉大之處就在於它是一個完全開源的平臺。可以去深入研究這些程式碼看看他們是如何實現framework的。Github中有成千上萬的開源庫,只需選擇一個看看人家是如何實現的,福利:這裡是一些最佳library的列表,這裡是幾乎所有開源安卓app的列表。

4. 看在上帝的份上,維護一個恰當的程式設計規範吧

如果把編碼比作寫作,那麼程式設計規範就是你的書法水平。

就跟你閱讀別人的程式碼一樣,別人也會閱讀你的程式碼,我想你也不想把別人嚇到是吧?如果你在一個公司,需要和同事協同工作,那麼務必重視這個問題。

編寫簡短,乾淨,可讀性強的程式碼可以讓你和別人讀程式碼的時候很享受。程式碼應該讀起來像是讀故事一樣。
程式碼是詩。

如果你寫了一段程式碼結果你的同事幾天都不跟你說話,怨不得別人。

福利:你應該從通讀這個這個開始。

5. 你需要ProGuard,是的,你真的需要!

絕對不要犯還沒有使用ProGuard的情況下就在Play Store上釋出app的錯誤。ProGuard不僅僅減小了你的程式碼,還混淆了程式碼,讓逆向工程師更難理解和複製。

它是Android SDK附帶的,完全免費,因此沒有理由不用。

我曾見過幾個開發者沒有使用ProGuard就把app釋出了。對於一個技術很普通的黑客來說破解你的app也就是幾個小時的事情。

小貼士:但是如果你需要頂尖的安全性,ProGuard就力不從心了,你需要DexGuard

6. 使用一個恰當的架構

你永遠都會慶幸自己從一開始就選擇了一個恰當的架構。

你可以使用MVP (Model-View-Presenter)架構,它可以把你的程式碼解耦成不同的層便於管理,從而提高程式碼的靈活性並極大的減小維護的時間成本。

可以參考一個demo專案。如果覺得很難掌握,可以看看這篇針對初學者的指南

福利:務必看看這裡,這裡尤其是這裡。它們將為你實現MVP提供極大的幫助。


7.使用者介面就像笑話,如果還需要解釋那就糟糕了

如果你是在公司,做的是純安卓開發,你很可能不需要關心這個問題,因為有UI/UX設計師管這個問題。

但是如果你是一個獨立開發者,你就需要考慮它了。我曾經見過一些把app功能做的很好,但是使用者體驗很恐怖的開發者。

要設計一個乾淨,簡單直觀的介面,你不要站在開發者的角度思考問題,而要挖掘自己內心中埋藏的設計師的潛力。

儘量嘗試設計一個漂亮的介面,讓你的使用者持續保持印象,這樣使用者回到你的app的次數就比別人多,從而產生更多的收穫(也許是購買高階版本)。

你應該樂於去減少元素,而不是增加。保持簡潔和小巧。

福利:你可以從Dribble或者MaterialUp的熱門設計師那裡獲得靈感。如果你對設計感興趣,你很可能會喜歡這本書

8. 分析是你最好的朋友

如果你想建立一個真正令人驚歎的app,你需要重度依賴分析工具去分析app不同部分的效能和用例。

對於分析,我藉助於crash reporting和app usage tracking。

不管你怎麼做,永遠無法做到完美。當真實的使用者開始在各種各樣的裝置以及版本上使用你的app的時候,你會發現即時寫的最好的程式碼也難以保證不出岔子。

一旦發生崩潰,Crash reporting工具可以幫助你跟蹤與修復它們。

你必須學會像銷售那樣思考問題並分析app不同模組的使用。這樣可以幫助你減小產品和使用者實際需求之間的落差。

小貼士:使用FirebaseCrash Reporting以及Analytics tools。

9. 做一個營銷專家

如果你是一個個人開發者,你必須超出作為開發者的思維,去理解市場。

我見過一些很好的產品因為缺乏正確的市場營銷而失敗,同時也見過並不怎麼樣的產品因為牛逼的市場營銷而取得極大成功。

如果你對你的工作是認真的希望它能獲得可觀的使用者,你必須把在市場營銷上花費必要的時間和金錢。但是在營銷活動開始之前,確保app已經完全穩定,功能已經完善。

花時間研究誰是你的競爭對手以及如何打敗他們。確定一個可以立即打敗的以及一個將來會打敗的。

小貼士:這裡是一個價錢合理的市場分析工具,我比較喜歡用。

10. 是時候優化你的app了

這是一個大多數人都不會去做的事情,但是你應該做。

寫程式碼與寫高效能的程式碼之間有很大的區別。高效能的程式碼是指執行速度快,記憶體和儲存消耗更少的程式碼。

一個未經優化的的app也許在普通情況下執行良好,但是當放在各種壓力情景中,它就原形畢露了。檢查你app的記憶體使用情況看看有沒有記憶體洩漏存在。記住小漏不補沉大船。花時間弄懂Java的記憶體回收機制是怎麼回事,建立並分析你的活物件。

小貼士:可以使用Leak Canary檢測你的記憶體洩漏。它可以節省你不少時間。

11. 每週在Gradle編譯上最少節省5小時

你極有可能正在使用Android Studio開發app,編譯系統使用的是Gradle。Gradle很棒但是也很慢,當專案顯著增大的時候慢得根蝸牛樣。

有時候工作忙的時候我還需要在Gradle編譯上浪費差不多一個小時。

但是,總有加速的辦法。

你可以照著這篇以及這篇文章的做法顯著提高編譯速度。經過優化之後我的編譯時間從4分鐘降到了30秒鐘。

12.測試,測試,再測試!

沒有什麼比測試更重要的了。它應該是你的首要任務。

儘可能全面的測試你的app。花時間寫自動化測試用例,創造各種極端的條件,看看你的app是否能經受住考驗。

我曾經犯過未經充分測試就釋出app的錯誤。等使用者報告bug然後修復。

絕對不要那樣做。你可能通過砍掉測試時間而節省了一兩天或者一週,但是以後你很可能會花雙倍的時間。

做任何事都要不慌不忙,從容應對並長遠打算。做一個有遠見的人。此時播種,以後總會有收穫。

13. 安卓的碎片化是魔鬼



碎片化可能是安卓最大的問題了。而谷歌似乎並不願意修復它,你必須適應。

安卓裝置種類繁多,不同螢幕尺寸,不同硬體配置以及各個廠商的自定義系統。

除此之外,谷歌在不同版本上還莫名其妙的新增或者刪除API,進一步加重了你的工作量(這裡是一個例子)。

比如,幾乎每個開發者都需要使用SharedPreferences API來完成一個app,它是如此常見,但是在Android 2.2版本的Samsung Galaxy S 上還是出問題了(bug報告這裡)。

花更多的時間為不同螢幕尺寸的裝置建立不同的佈局。在不同版本,不同定製,不同OEM廠商的裝置上測試。

永遠別覺得某個東西看似可行就不去測試了。

14. 從今天開始使用git!

如果你還沒有使用Git,從現在開始吧。

當我開始安卓開發的時候,悲劇的我並不知道git是什麼東西。我每天都拷貝整個專案,一個備份在硬碟上,一個備份在雲盤上。看起來很傻是嗎?是的,的確很傻。

Git可以極大的提高你的工作效率。如果叫我說出一個我每天都要使用並且離不開的工具的名字,那就是Git了。

在你使用幾天之後,你很可能會愛上它,並好奇Git的內部工作原理。建議你看看這個

過了一段時間之後,你可能開始了一個大專案,對於如何維護一個分支模型感到困惑,那麼可以看看這個

福利:如果你剛剛開始,還付不起GitHub的私人倉庫的月費,你可以試試BitBucket。國內使用者的選擇更多,oschina的git服務也不錯-譯者注。

15.為黑客製造麻煩

安卓的開源特性讓其易受攻擊。每個安卓app都可以輕易的被反編譯,逆向分析。

你不希望你的app發生這種事對吧?

你需要知道如何安全的儲存app中的API keys。如果你要處理使用者的敏感資料,你必須知道如何加密,選擇何種加密演算法(安全且快速)。

你還應該安全的把金鑰儲存在本地或者伺服器上。應該防止app資料被人用ADB備份。如果你在資料庫中儲存敏感資料,要考慮做適當的偽裝。

如果你的app有高階版本,被別人破解免費釋出就損失大了。

有幾種方法可以避免你的app被人篡改。但並不是100&安全。任何一個技術紮實,決心堅決的黑客只要有正確的資源,工具和耐心都可以破解你的app。

你能做的就是儘量讓黑客的破解變得困難,及其困難。

福利:可以從閱讀這個這個開始。

16. 在低端手機上開發

每個人都喜歡使用一個高階安卓手機,我也是。但是記得只作為個人使用,而不是開發的目的。

高階機會隱藏app的許多缺陷。假設你在UI執行緒上做了導致卡頓的事情,但是因為手機過於強大,可能導致你無法察覺。


17. 學習設計模式

這是一項終生受益的投資。

在開發大型app的時候,你會遇到一些已經被比你牛逼的人所解決了的問題。

從今天開始就花點時間去學習設計模式。Here是一個演示了所有已知設計模式的的Github專案。

可以從最常見的開始,比如單例,介面卡模式,工廠方法模式,迭代模式,依賴注入模式,事件驅動架構,建造者模式,回撥,策略模式,外觀模式以及生產消費者模式。

看起來很多是吧?實際上並不多。一旦深入你就會愛上它們的。

小貼士:閱讀一些書籍,比如GoF的 Design Patterns,Martin Fowler的重構以及Joshua Bloch的Effective Java

18. 回饋

你得承認,我們都曾從別人和網際網路那得到許多幫助。

每當你遇到問題的時候,你會做的第一件事就是谷歌,發現第一條來自StackOverflow的連結。有時候你很忙,結果直接拷貝貼上得分最高的答案。

你有沒有想過Github上那些開源庫其實也是別人花時間建立然後貢獻給社群的。

當你被一個難以理解的概念卡住或者遇到一個新的東西時,你發現一篇讓你豁然開朗的部落格,這個時候記住是某人犧牲了約炮時間而寫了這篇文章。

所以也該你回饋了。給予的越多,得到的也就越多。

我們都忙於自己的工作,很難找到時間為別人做什麼事情。但是儘量每週找點時間做點貢獻讓安卓社群更豐富。

我已經分享了自己短暫的安卓生涯中所學到的一些東西。我將繼續下去,學更多,分享更多。希望能為別人的生活帶來微小的幫助。
相關閱讀
評論(0)

相關文章