編輯推薦:稀土掘金,這是一個針對技術開發者的一個應用,你能夠在掘金上獲取最新最優質的技術乾貨,不只僅是Android知識、前端、後端以致於產品和設計都有涉獵,想成爲全棧工程師的朋友不要錯過!html
原文:What 2 Years of Android Development Have Taught Me the Hard Way前端
我仍記得2014年我決定作安卓開發的那天,這是我一輩子中作出的最好決定之一。到如今已經有2年半了,java
最初的時候,並無人告訴我如何作纔是正確的。我犯了不少錯誤,浪費了不少時間。android
一年半以後,我有機會和一個真正有才並且經驗豐富的安卓開發者一塊兒工做,他指導我,教我正確的作事方式。這期間我學到了不少東西,學會了該作什麼不應作什麼。git
我直接或者間接幫助其它開發者也有很長一段時間了。這裏是個人StackOverflow和Github的簡介。github
本文我將分享這幾年所收集的精華。也許能夠幫助某人更快上手,避免重複我犯的錯誤。算法
最初,我有一種不肯使用開源庫的思想。無論須要什麼,我總想本身去實現。這是一種很是可怕的思想。數據庫
若是在開發app的時候遇到一個問題,而這個問題已經被別人很好的解決了,爲何不使用它呢?你能夠節省大量時間啊。編程
把更多的精力花在app的業務邏輯上吧。若是你想在app中發起一個網絡調用,是不須要本身去造一個Retrofit來的。後端
Bonus:Android Arsenalmaintains a database of almost all Android libraries ever made. Go check it out.
在Github上有許多無償使用的開源庫,可是別因太激動而盲目的使用。
檢查library的star數目,越多越好。看看做者是否還建立了其它的一些受歡迎的庫。查看issues(打開和關閉的都看),這可讓你對這個library的健壯性和穩定性有更好的瞭解。
若是你時間充足,你應該深刻這個庫的代碼看看它究竟是都真的值得使用。
你只須要確保它的代碼是可靠的,bug很少的,高質量的。
小貼士:使用Dryrun的命令行嘗試任何library。
咱們在閱讀別人代碼上花的時間比本身寫代碼的時間多得多,若是你不是的話,從今天就開始作吧。
無論你如今能寫出什麼樣的代碼,老是由於在某年某月你閱讀和學習到了什麼東西。它只是你已有知識的反映。
安卓的偉大之處就在於它是一個徹底開源的平臺。能夠去深刻研究這些代碼看看他們是如何實現framework的。Github中有成千上萬的開源庫,只需選擇一個看看人家是如何實現的,
福利:這裏是一些最佳library的列表,這裏是幾乎全部開源安卓app的列表。
若是把編碼比做寫做,那麼編程規範就是你的書法水平。
就跟你閱讀別人的代碼同樣,別人也會閱讀你的代碼,我想你也不想把別人嚇到是吧?若是你在一個公司,須要和同事協同工做,那麼務必重視這個問題。
編寫簡短,乾淨,可讀性強的代碼可讓你和別人讀代碼的時候很享受。代碼應該讀起來像是讀故事同樣。
代碼是詩。
若是你寫了一段代碼結果你的同事幾天都不跟你說話,怨不得別人。
絕對不要犯尚未使用ProGuard的狀況下就在Play Store上發佈app的錯誤。ProGuard不只僅減少了你的代碼,還混淆了代碼,讓逆向工程師更難理解和複製。
它是Android SDK附帶的,徹底免費,所以沒有理由不用。
我曾見過幾個開發者沒有使用ProGuard就把app發佈了。對於一個技術很普通的黑客來講破解你的app也就是幾個小時的事情。
小貼士:可是若是你須要頂尖的安全性,ProGuard就力不從心了,你須要DexGuard。
你永遠都會慶幸本身從一開始就選擇了一個恰當的架構。
你可使用MVP (Model-View-Presenter)架構,它能夠把你的代碼解耦成不一樣的層便於管理,從而提升代碼的靈活性並極大的減少維護的時間成本。
能夠參考一個demo項目。若是以爲很難掌握,能夠看看這篇針對初學者的指南。
福利:務必看看這裏,這裏尤爲是這裏。它們將爲你實現MVP提供極大的幫助。
若是你是在公司,作的是純安卓開發,你極可能不須要關心這個問題,由於有UI/UX設計師管這個問題。
可是若是你是一個獨立開發者,你就須要考慮它了。我曾經見過一些把app功能作的很好,可是用戶體驗很恐怖的開發者。
要設計一個乾淨,簡單直觀的界面,你不要站在開發者的角度思考問題,而要挖掘本身心裏中埋藏的設計師的潛力。
儘可能嘗試設計一個漂亮的界面,讓你的用戶持續保持印象,這樣用戶回到你的app的次數就比別人多,從而產生更多的收穫(也許是購買高級版本)。
你應該樂於去減小元素,而不是增長。保持簡潔和小巧。
福利:你能夠從Dribble或者MaterialUp的熱門設計師那裏得到靈感。若是你對設計感興趣,你極可能會喜歡這本書。
若是你想建立一個真正使人驚歎的app,你須要重度依賴分析工具去分析app不一樣部分的性能和用例。
對於分析,我藉助於crash reporting和app usage tracking。
無論你怎麼作,永遠沒法作到完美。當真實的用戶開始在各類各樣的設備以及版本上使用你的app的時候,你會發現即時寫的最好的代碼也難以保證不出岔子。
一旦發生崩潰,Crash reporting工具能夠幫助你跟蹤與修復它們。
你必須學會像銷售那樣思考問題並分析app不一樣模塊的使用。這樣能夠幫助你減少產品和用戶實際需求之間的落差。
小貼士:使用FirebaseCrash Reporting以及Analytics tools。
若是你是一個我的開發者,你必須超出做爲開發者的思惟,去理解市場。
我見過一些很好的產品由於缺少正確的市場營銷而失敗,同時也見過並不怎麼樣的產品由於牛逼的市場營銷而取得極大成功。
若是你對你的工做是認真的但願它能得到可觀的用戶,你必須把在市場營銷上花費必要的時間和金錢。可是在營銷活動開始以前,確保app已經徹底穩定,功能已經完善。
花時間研究誰是你的競爭對手以及如何戰勝他們。肯定一個能夠當即戰勝的以及一個未來會戰勝的。
小貼士:這裏是一個價錢合理的市場分析工具,我比較喜歡用。
這是一個大多數人都不會去作的事情,可是你應該作。
寫代碼與寫高性能的代碼之間有很大的區別。高性能的代碼是指運行速度快,內存和存儲消耗更少的代碼。
一個未經優化的的app也許在普通狀況下運行良好,可是當放在各類壓力情景中,它就原形畢露了。檢查你app的內存使用狀況看看有沒有內存泄漏存在。記住小漏不補沉大船。花時間弄懂Java的內存回收機制是怎麼回事,建立並分析你的活對象。
小貼士:可使用Leak Canary檢測你的內存泄漏。它能夠節省你很多時間。
你極有可能正在使用Android Studio開發app,編譯系統使用的是Gradle。Gradle很棒可是也很慢,當項目顯著增大的時候慢得根蝸牛樣。
有時候工做忙的時候我還須要在Gradle編譯上浪費差很少一個小時。
可是,總有加速的辦法。
你能夠照着這篇以及這篇文章的作法顯著提升編譯速度。通過優化以後個人編譯時間從4分鐘降到了30秒鐘。
沒有什麼比測試更重要的了。它應該是你的首要任務。
儘量全面的測試你的app。花時間寫自動化測試用例,創造各類極端的條件,看看你的app是否能經受住考驗。
我曾經犯過未經充分測試就發佈app的錯誤。等用戶報告bug而後修復。
絕對不要那樣作。你可能經過砍掉測試時間而節省了一兩天或者一週,可是之後你極可能會花雙倍的時間。
作任何事都要鎮定自若,從容應對並長遠打算。作一個有遠見的人。此時播種,之後總會有收穫。
碎片化多是安卓最大的問題了。而谷歌彷佛並不肯意修復它,你必須適應。
安卓設備種類繁多,不一樣屏幕尺寸,不一樣硬件配置以及各個廠商的自定義系統。
除此以外,谷歌在不一樣版本上還莫名其妙的添加或者刪除API,進一步加劇了你的工做量(這裏是一個例子)。
好比,幾乎每一個開發者都須要使用SharedPreferences API來完成一個app,它是如此常見,可是在Android 2.2版本的Samsung Galaxy S 上仍是出問題了(bug報告這裏)。
花更多的時間爲不一樣屏幕尺寸的設備建立不一樣的佈局。在不一樣版本,不一樣定製,不一樣OEM廠商的設備上測試。
永遠別以爲某個東西看似可行就不去測試了。
若是你尚未使用Git,從如今開始吧。
當我開始安卓開發的時候,悲劇的我並不知道git是什麼東西。我天天都拷貝整個項目,一個備份在硬盤上,一個備份在雲盤上。看起來很傻是嗎?是的,的確很傻。
Git能夠極大的提升你的工做效率。若是叫我說出一個我天天都要使用而且離不開的工具的名字,那就是Git了。
在你使用幾天以後,你極可能會愛上它,並好奇Git的內部工做原理。建議你看看這個。
過了一段時間以後,你可能開始了一個大項目,對於如何維護一個分支模型感到困惑,那麼能夠看看這個。
福利:若是你剛剛開始,還付不起GitHub的私人倉庫的月費,你能夠試試BitBucket。國內用戶的選擇更多,oschina的git服務也不錯-譯者注。
安卓的開源特性讓其易受攻擊。每一個安卓app均可以輕易的被反編譯,逆向分析。
你不但願你的app發生這種事對吧?
你須要知道如何安全的存儲app中的API keys。若是你要處理用戶的敏感數據,你必須知道如何加密,選擇何種加密算法(安全且快速)。
你還應該安全的把密鑰存儲在本地或者服務器上。應該防止app數據被人用ADB備份。若是你在數據庫中存儲敏感數據,要考慮作適當的假裝。
若是你的app有高級版本,被別人破解免費發佈就損失大了。
有幾種方法能夠避免你的app被人篡改。但並非100&安全。任何一個技術紮實,決心堅定的黑客只要有正確的資源,工具和耐心均可以破解你的app。
你能作的就是儘可能讓黑客的破解變得困難,及其困難。
每一個人都喜歡使用一個高端安卓手機,我也是。可是記得只做爲我的使用,而不是開發的目的。
高端機會隱藏app的許多缺陷。假設你在UI線程上作了致使卡頓的事情,可是由於手機過於強大,可能致使你沒法察覺。
這是一項終生受益的投資。
在開發大型app的時候,你會遇到一些已經被比你牛逼的人所解決了的問題。
從今天開始就花點時間去學習設計模式。Here是一個演示了全部已知設計模式的的Github項目。
能夠從最多見的開始,好比單例,適配器模式,工廠方法模式,迭代模式,依賴注入模式,事件驅動架構,建造者模式,回調,策略模式,外觀模式以及生產消費者模式。
看起來不少是吧?實際上並很少。一旦深刻你就會愛上它們的。
小貼士:閱讀一些書籍,好比GoF的 Design Patterns,Martin Fowler的重構以及Joshua Bloch的Effective Java。
你得認可,咱們都曾從別人和互聯網那獲得許多幫助。
每當你遇到問題的時候,你會作的第一件事就是谷歌,發現第一條來自StackOverflow的連接。有時候你很忙,結果直接拷貝粘貼得分最高的答案。
你有沒有想過Github上那些開源庫其實也是別人花時間建立而後貢獻給社區的。
當你被一個難以理解的概念卡住或者遇到一個新的東西時,你發現一篇讓你豁然開朗的博客,這個時候記住是某人犧牲了約炮時間而寫了這篇文章。
因此也該你回饋了。給予的越多,獲得的也就越多。
咱們都忙於本身的工做,很難找到時間爲別人作什麼事情。可是儘可能每週找點時間作點貢獻讓安卓社區更豐富。
我已經分享了本身短暫的安卓生涯中所學到的一些東西。我將繼續下去,學更多,分享更多。但願能爲別人的生活帶來微小的幫助。