面試解惑:如何系統學習Android開發?
前言
在最近在進行模擬面試,除了我問面試者問題外,也會和麵試者交換了一些看法,回答了一些他們比較關注或迷惑的問題。
在回答這些問題時,有時候是即興發揮,事後在反思面試者遇到的這些問題時,我覺得還是有必要就這些問題進行一個比較完整的論述,也算是對自己思維過程的一個總結。同時也讓有相同問題的讀者可以直接看到,如果能獲得啟發,那正是我所願。
今天和大家分享“如何系統的學習Android開發”,面試者在問我關於學習Android開發的問題時,基本上沒有“系統”兩個字,大家常用的問法是:不知道怎麼學習Android開發,沒有方向,不知道該往哪裡使力。
什麼是系統?
為什麼我會提系統兩個字呢?先說一下新手和專家的區別,大家常常認為新手和專家的區別在於經驗上,這樣說也不能說是錯的。因為確實這個經驗是很重要的,但這個經驗不是指實施某項技術獲得了一個過程和記錄,而是指通過實施某項技術促進了思維的改變。
如果思維沒有改變,那麼一個聲稱擁有十年經驗的開發人員,實際上只是一年的經驗重複了九次。
新手往往都不是特別想要學習,也不知道自己的行為是對是錯,只是想實現一個立竿見影的目標。如果給新手提供一個與情境無關的規則(或者叫指命)讓他們去執行,他們就會變得能幹起來。
而專家更關注情境,更關注系統,而且喜歡說“具體情況具體分析”。他們往往更關注事物之間的聯絡,把自己看做系統的一部份,能分清和認識到系統的邊界。
新手往往不把自己看做系統的一部份,所以學習Android開發也變成了一項孤立的事件,學習的模組也變得孤立起來。雖然花時間學習了很多元件或者技巧,但是卻沒有理清過這些模組或問題之間的關聯。
然而,現實中的問題都是不是孤立的,理解系統,學會用系統思維才更有利於你去解決問題。
系統學習Android的資源和方法
而問怎麼學習Android的人,從學生到工作過幾年的程式設計師都有,大家都在關注怎麼學好Android,怎麼讓自己的開發技能提升,往往看到什麼技術或亮點都想學一下。但太多的人卻忽略了系統,沒有好好系統地學習Android的一些基礎和這些基礎特徵之間的聯絡。
具體的學習方式每個人不一樣,這裡我給出一個我認為比較好的方式:完整地看完和練習官方指導文件。網上有太多Android開發的視訊和文章,但他們都過於碎片化,只有這份官方文當是我認為最系統介紹Android開發的指南。
網址:https://developer.android.com/develop/index.html

一定要把官方文件中的“培訓”和“API指南”認真的看一篇,而且花時間把相關的知識聯絡起來。這個工作只能靠自己了,官方都已經出了這麼好的系統學習資料,但是你不去系統的學就是你自己的問題了。
如何系統的學習Android開發呢?
1. Java語言進階與Android相關技術核心
Android應用是由Java語言進行開發的,SDK也是由Java語言編寫,所以我們要學習java語言。另外,雖說kotlin語言得到了Android官方的熱推,但是kotlin也是編譯成了java語言再執行的。對於Android來說,只要SDK沒有用kotlin重寫,那麼Java語言是都需要學習的。而且Android apk的後臺伺服器程式大概率是java語言構建,所以學習java也是一種必然。那麼Java中哪些東西是我們Android程式設計師需要學習的呢?由於Android程式設計師習慣了 C V 程式碼塊,所以與Android中比較相關的稍微比較難的Java基礎幾乎都是一個門檻,像 泛型,多執行緒,反射,JVM,Java IO,註解,序列化等,都是被 CV 的物件,而程式設計師是不懂原理的,具體內容如大綱所示。

Java語言進階與Android相關技術核心
2. App開發框架知識體系(APP亦物件)
這塊知識是現今使用者最多的,我們稱之為Android 2013~2016年的技術,但是,即使是這樣的技術,Android開發者也往往因為網上Copy程式碼習慣了而導致對這塊經常“使用”的程式碼熟悉而又陌生:熟悉的是幾乎天天在和它們打交道,天天在複製這些程式碼;陌生的是雖然天天和這些程式碼打交道,但是並沒有深入研究過這些程式碼的原理,程式碼深處的內涵。所以我們需要從新的角度去分析這些知識點,深入研究他們,要學習原始碼,模仿原始碼,然後再hook原始碼,這樣才能說自己懂這塊的知識。這些都是做Android開發,做高階工程師的基礎。

App開發框架知識體系(APP亦物件)
3.Android App全方位效能調優
一個app的效能好不好我們需要從兩個層面努力。第一個層面:從寫程式碼的時候就需要注意,讓自己的程式碼是高效能高可用的程式碼,這個過程是書寫高效能程式碼;第二個層面:對已經成型的程式碼通過工具檢查程式碼的問題,通過檢查到的問題來指導我們進行程式碼的刪改,這個過程被稱為調優。
如何寫出高效能的程式碼呢?那就需要我們具備深厚的程式碼功底,這就是程式碼的基礎,如:資料結構達到可以根據應用場景寫出符合當前場景的特殊結構,比如google針對Android平臺特徵研發了sparseArray替代HashMap。另外,對常用的演算法有自己獨到的見解,leetcode上有刷個上百道題,這樣差不多可以達到精通最常用的排序查詢動態規劃等演算法的能力。再者,高效的演算法以及節省記憶體的資料結構如果配合優秀的符合應用場景的設計模式,那麼,這些就為高效能的程式碼提供了實現依據。
另外一個就是對寫好的程式碼進行調優,那麼調優的方向就是使用Profiler工具進行測試和檢查,看哪裡有效能消耗大的操作,然後分析對於程式碼的問題。調優的方向就變成了如何對記憶體調優,對耗電調優,對網路流量調優,當然,還有對啟動速度,頁面切換效果與速度,開機白屏體驗,閃屏方面的原因等進行分析和調優。最後再加上一個螢幕適配相機適配。

Android App全方位效能調優
4.NDK模組開發
音視訊/高清大圖片/人工智慧/直播/抖音等等這年與使用者最緊密,與我們生活最相關的技術一直都在尋找最終的技術落地平臺,以前是windows系統,而現在則是移動系統了,移動系統中又是以Android佔比絕大部分為前提,所以Android NDK技術已經是我們必備技能了。要學習好NDK,其中的關於C/C++,jni,Linux基礎都是需要學習的,除此之外,音視訊的編解碼技術,流媒體協議,ffmpeg這些都是音視訊開發必備技能,而且OpenCV/OpenGl/ 這些又是影象處理必備知識,這些都是原理級的實戰專案。

NDK模組開發
由於篇幅原因,還有很多點需要大家提升的像混合開發、小程式開發、架構專題等,在這邊就不進行贅述了
最後
在現在這個金三銀四的面試季,我自己在網上也蒐集了很多資料做成了文件和架構視訊資料免費分享給大家【包括高階UI、效能優化、架構師課程、NDK、Kotlin、混合式開發(ReactNative+Weex)、Flutter等架構技術資料 】,希望能幫助到您面試前的複習且找到一個好的工作,也節省大家在網上搜索資料的時間來學習。
資料獲取方式:加入Android架構交流QQ群聊:513088520 ,進群即領取資料!!!
點選連結加入群聊【Android移動架構總群】:加入群聊

資料大全
我們想要的東西往往都在身邊觸手可及,但我們卻喜歡跑到遙遠的地方去追求虛假的華麗。