安卓不知道怎麼學?看十年碼農如何回答這個問題。

image

有很多朋友問過怎麼學習 Framework,之前寫了三篇文章,主要說的是之前開發應用的如何過渡到開發 Framework 。喜歡的可以通過下面的鏈接閱讀。

Android 如何從應用深入到Framework (一)

Android 如何從應用深入到Framework (二)

Android 如何從應用深入到Framework (

寫完這個,發現還是有很多人迷惑,不知道 Android 該怎麼學習,於是今天抽空,聊聊關於學習方法,以及 Android 具體該怎麼去學。

在開始今天的文章之前,先插入一段這些年我所折騰的內容:

2010-2013 功能機時代,以 Mstar、MTK、 展訊平臺爲主,負責通話相關模塊,比如 InCallUI 、Dialer 、PhoneBook爲主。同時完成三方應用對接工作,比如移植 QQ,移植遊戲中心。在這個期間主要收穫是,閱讀代碼的能力,以及形成了框架思維。

2013-2016 智能機時代,以 MTK、 展訊、 高通平臺爲主,負責系統需求開發,應用開發,比如權限管理分析,系統框架調試,快速定位界面信息,商業化 APP,CM 移植紅米2,三方 rec twrp 源碼分析,實現工模測試程序。在這個期間主要是深入代碼,開始進入系統框架,啓動過程,開始深度定製系統,完成了自己商業化思維雛形。

2016-2019 自媒體時代, 在公號開始輸出技術文章,以分析三方開源庫,多窗口分屏源碼剖析,HOOK 機制以及 Android NDK 開發講解。同時輸出自己的商業思考,賺錢邏輯,建立個人IP。

以上是對於我這些年做的事情,做的一個簡單梳理,有很多分支,就不過多涉及了。

這些年來,有很多人誇我能力強,而我實際曉得這裏面的原因,並不是天賦造成的。

前段時間,花了一個月時間,閱讀了程序員中一些牛人的成長故事,梳理出來很多關鍵字,我把這些篩檢後,總結了四個出來:

  • 自學能力

  • 時間管理

  • 升維能力

  • 自我激勵

自學能力是排在第一的,這個是從我自身出發,得出的結論。大學期間要說什麼對我有着深遠的影響:

一個是自學能力,一個是寫作

在自學計算機方面,觸發我去做這個的原因是,數字電路學得很好,C 語言比較感興趣。

而我找到了一個切入的路線,就是學習 80C51 單片機。這個是脫離了操作系統,簡單直接操作硬件 Pin 腳,使用仿真器可以來直接模擬個 C51 開發板。

這個是開端,痛苦不言而喻。無法理解地址,偏移,中斷向量,以及堆棧平衡,這個時候就遇見了操作系統。進入操作系統,算是進入了漩渦,陷在裏面不斷掙扎,又不斷的挑戰,期間報了個培訓班,是做 ARM嵌入式開發,進而接觸到了 μC/OS-II 小型操作系統,在老師的帶領下,最終算是將基礎打通,剩下的便是自己琢磨,反覆練習,閱讀代碼。

每個人自學的路線不一樣,我是在宿舍自學的。我不習慣自習室安靜的氛圍,同時我的學習狀態,不是一個事情專注一天,而是一個事情就堅持半小時,隨即切換到娛樂,或者是休息,跑別的宿舍轉圈溜達。這個是我自學中的調節,現在也曉得這個跟番茄時間是基本吻合的。

**我們很多時候總結的東西,都是自己踩坑之後才深刻理解。**在你沒有總結出自己的高效學習方法之前,你就只剩下大量的刻意練習,從而找到自己的路線,這裏沒有捷徑。

我們很多人會隨口說出那句:

我要花時間,也能跟他一樣牛!

可實際結果是你只是嘴上說說而已,並沒有實際去做。比如我說這個就是堅持,用時間累積出來的成績。大家通常會覺得堅持只要自己想做,就是輕而易舉的。

實際是,

堅持看起來很簡單,但卻很難。

那些最終成功的人,有很強的時間觀念。他們曉得他們的成績是時間複利出來的,我們很早就學過,不積跬步無以至千里。可是有多少人真的去積跬步呢?

我們習慣去議論別人的成績,羨慕他們的成就,然後輕易的否定自己,把別人的都歸於好運而已。我在觀察這些成功大牛之後,發現他們除了自學能力超強之外,還有的就是時間管理。

你與他們約定飯局,他們能夠提前預定好路線,基本能做到準時,而且他們尊重你的時間,會比較聚焦的聊一些話題,不會漫天聊天,沒有重點。同時他們也會對這次飯局做簡單的覆盤,大概聊多久,自己今天還有什麼事情要辦。

我之前也是沒有時間概念的,導致的結果就是丟三落四,做事沒有輕重緩急,弄得自己又忙又累,卻看不到結果。隨後我便開始列任務清單,就在手機上記。

當我慢慢習慣這麼來做的時候,發現我做事情高效了,我能分清什麼是今天需要完成的,什麼是沒有做完,當下要完成的是哪些任務。

任務清單比起那個時間四象限來說,很容易執行。就是把自己隨後要做的事情排序,把當下要完成的排到前面,哪個可以取消就往後放,或者乾脆去掉。這個在時間管理的書裏叫做喫掉青蛙,而喫掉青蛙的步驟就是拆成一些蝌蚪,一個個來完成,遵循 SMART 規則。

SMART原則(S=Specific、M=Measurable、A=Attainable、R=Relevant、T=Time-bound)是爲了利於員工更加明確高效地工作,更是爲了管理者將來對員工實施績效考覈提供了考覈目標和考覈標準,使考覈更加科學化、規範化,更能保證考覈的公正、公開與公平。

完成任務就會不斷地累積成就感,我在做這個之外,會做一個叫做每日覆盤的動作。也就是我每天會有具體的計劃,哪些要今天完成,哪些是這周完成的,時間要定到具體的某一天。

每日覆盤 的意義是巨大的。通過這個可以很清楚的知道自己哪些方面做得不好,用獎勵的方法填充到你的任務當中,把每天的任務在早上計劃出來,然後隨着工作中加入任務,在這個任務清單中插入進去。

如果明天有計劃,那麼準備工作我是放到今天晚上,而不是明天早上。因爲今天晚上時間充足,能夠保證不落掉任何東西。同時也能在明天起來的時候,不顯得太趕忙。

在做一件的時候,可以使用 PDCA 進行迭代。PDCA 具體爲:

PDCA循環是美國質量管理專家休哈特博士首先提出的,由戴明採納、宣傳,獲得普及,所以又稱戴明環。全面質量管理的思想基礎和方法依據就是PDCA循環。PDCA循環的含義是將質量管理分爲四個階段,即計劃(Plan)、執行(Do)、檢查(Check)、處理(Act)。在質量管理活動中,要求把各項工作按照作出計劃、計劃實施、檢查實施效果,然後將成功的納入標準,不成功的留待下一循環去解決。這一工作方法是質量管理的基本方法,也是企業管理各項工作的一般規律。[1]

除此之外,我也沒有其他高級的技巧,

我們要先從外驅動力進行訓練,然後逐步獲取金錢,或者榮譽,這些刺激你,將外驅動力轉化爲內驅動力,從而形成習慣。

當你掌握了時間和任務的搭配方式之後,剩下的就是持續行動,不放棄。在行動中不斷踐行 MVP ,也就是我們講的瀑布開發模型。像個漩渦一樣,一圈一圈,一直到最強最大。

當你這樣子持續堅持着,你便能夠很敏銳的捕捉到一些信息,也就是所謂的外行看熱鬧,內行看門道。當大家都在人云亦云,吐槽焦慮的時候,你發現你也會遇到這個問題,所以你開始嘗試,

投資自己,豐富知識體系。

升維能力是怎麼出來的呢?我在大學期間,貼在課桌牆上的一句話是,每天進步一點點。我在大學一直用這句話在激勵自己。職場中可以再修正一下,變成比別人多想一步,你就離成功更進一步。

這裏的升維能力主要體現在,大家都在討論具體技術的時候,你在想這個技術解決了什麼問題,複雜度,以及客戶時效性。你能夠脫離技術,從市場,商業模型去考慮問題。

當大家都厭倦加班的時候,你能夠知道自己的訴求,知道自己加班在做什麼,自身在怎樣的成長,是否是自己預期的結果。我在看牛人的故事的時候,所謂時間管理,以及勤奮,努力,不也是自己給自己加班嗎?

多處在老闆的位置思考,同時多考慮自己的未來。

如果你沒有這麼拼命,那麼你的技術卓越靠的是天賦?我們再想一下你多年之後能夠從容應對,技術出類拔萃,不是在公司加班,就是在家加班了。升維能力能夠讓你看的更長遠,也讓你能夠看清,這一切都是在爲自己投資。

我們想下,你工作最終想做什麼?想當領導,想做老闆,想創業找投資,想做自媒體。這個就是你在提前佈局,那麼你必須升維,先匹配接觸這些信息,你才能夠看得透徹,知道自己現在的付出,未來都會開花結果。

你總想着佔便宜,那麼誰要喫虧?只有利他了,最終纔會利己。

這句話又是一個看起來很簡單,卻很難做到的。

最後我再說說這個自我激勵,因爲我們的惰性,以及短視,導致我們堅持一件事總是半途而廢,總想着很快見效果。

可世界很多時候就是反常識的,求而不得,越急越錯。只有你穩紮穩打的成功,你遇見的問題,你經歷的事情,才能讓你這個系統穩固,不會輕易被人攻陷,所謂有了防禦力,抵禦風險的能力。

俗話說的好,

肚子有貨,心裏不虛。

要有目標,分階段目標和長遠目標。長遠目標是個奔頭,階段目標是不斷靠近。也就是年計劃,月計劃這種。只有你把年計劃拆成月計劃,月計劃分攤到每一天,你才能夠真正的行動起來。

自我激勵很重要,你爲什麼拼命?你要實現什麼目標,這個很重要。你要賺多少錢,你要用錢做什麼,升維能力又體現出來了。

當你突然心動地時候,就是你要開花結果時候,這個時候要謹記,要行動了,否則只會望梅止渴,望洋興嘆了。

講完了這個,我們再來看看 Android 當前市場需求都有哪些方向:

image

原生開發,主要以大平臺爲主。因爲它的成本比較高,需要安卓,IOS 和 Web 各個方向都要投入人力。做系統維護的,接觸的系統級別的 APP,基本都是原生開發的,不會是跨平臺。這裏就是牽扯一些開源框架,像 MVP  、MVVM 框架,以及開源 okhttp 、Retrofit 等等。

跨平臺開發出現在小公司,以及需要快速迭代的場景下,它能夠快速推送到各個平臺,能夠實現後臺熱更,可以方便的修復問題。主要技術有 react-native 和 Flutter 。

系統移植和裁剪,主要是以 Linux 驅動爲核心,同時移除一些系統服務,開發一些守護進程。這個以 C 、C++爲主,門檻比較高,有驅動經驗,對操作系統有概念。

這個主要的市場就是那些性能要求較高的場景,需要啓動快,比如路由器。

電視盒子這裏需要掌握的是 TV 開發場景,它跟我們普通的開發有區別,因爲不是觸摸響應,而是按鍵,需要焦點切換,以及實現一些軟鍵盤之類的東西。

智能門鎖,需要的和嵌入式開發差不多,安卓系統也可以來實現,這裏除了硬件驅動,還有就是上層的指紋識別,以及屏幕顯示,監控系統。

音視頻開發隨着這個 5G 到來,流量問題解決,會是個強需求。相關的抖音,快手這些,對於音視頻的需求很大。這裏開源的項目主要是 FFmpeg sdl2 ,如果要說更多的話,那麼加上  opengl es,以及 glsl 或者其他的 gpu編程。

系統級別的開發,以虛擬機優化,分身,系統廣告攔截,通知管理,權限,靜默安裝,分屏,像 APP 的插件化編程,註解編程這些,APM 性能監控,sysTrace 分析,藍牙 Wifi 功能定製等等。

其餘的就是在細分領域,虛擬機優化,xHOOK,xp插件 開發,輔助功能開發,自動化測試腳本,瀏覽器開發,GPS硬件 芯片調優,音頻,相機調優等等。

接下來說說具體該怎麼學習,這裏寫個我學習的路線,更多細緻學習,需要自己百度檢索,找到學習資料。

這裏具體爲:

image

除此之外,還有這些:

image

View 這裏主要以 TextView 、Button 這種爲主,主要是去熟悉如何開發一個應用,如何調試,如何佈局。這裏比較關鍵的是,如何自定義View,懂得核心的三個方法,測量,佈局,繪製,同時知道繪製的一些方法,比如 Path,以及 xor圖像 混合,畫一個儀表盤,以及動畫。

這個學習完了後,開始進入 SurfaceView 學習,這個學習 openGL es 的開發流程,繪製過程,以及語法,生命週期。爲什麼學習這個呢,因爲很多開源庫,就是用的這個,比如 cocos2dx 、 libgdx ,遊戲引擎大多數都是這種,因爲耗時,而這個 SurfaceView 是另開闢的線程,所以沒有這問題,並且直接對應一個 Layer,可以快速繪製。

四大組件是個寶藏,

Android 開發的四大組件分別是:活動(activity),用於表現功能;服務(service),後臺運行服務,不提供界面呈現;廣播接受者(Broadcast Receive),勇於接收廣播;內容提供者(Content Provider),支持多個應用中存儲和讀取數據,相當於數據庫。

這裏主要學習,每個組件完成 Demo,知道使用方法,場景。startActivity() 、startService()、sendBroadcast() 、ContentProvider.query() 這些方法是一個引子,它是撬動你進入系統代碼的一個個線索。

於是我們跟着這些方法,參考網上文檔,使用調試技巧,開始分析,畫流程圖,當你把這些跟蹤完了之後,你對系統就不會再陌生,也不會畏懼。

在這個過程裏面,同步穿插着來學習 系統啓動過程,System_server 進程啓動過程,AMS 、WMS 、PhoneWindowManager 初始化過程。

這兩個會同步進行,最終在系統框架匯合,你便將這個線路打通。而在這個應用和系統之間,是可以通過分析 SystemUI 和 Launcher 的啓動過程,來掌握這些知識。

這些都掌握了,也就是主線已經打通,剩下的就是繼續蔓延,將自己感興趣的學習起來。比如 SF 學習繪製相關,Binder,SELinux 安全模型。

關於調試,主要是 調試 JAVA 調試系統調試 NDK ,調試 Smali,這個大家點擊上面的文字,可以直接跳轉過去閱讀。

總結下學習過程,主要就是尋找線索(興趣),持續行動(畫流程),調試跟蹤,總結收穫。在工作中就是,處理一個問題的時候,需要使用三步法,分析,定位,解決。而你要成長起來,實際這個後面需要一個沉澱,這個很大程度我們會忘掉,所以才學得不牢靠。

最後,想再說說關於如何構建自己的知識體系,主要的方法爲:

image

關於點線面,之前寫過一篇文章,大家可以點擊閱讀。這裏簡單說下,

點線面的理論,就是尋找一個突破口,先進入市場,然後不斷地積累,將點串成線,然後再深入下去,形成面。每一面起來之後,就是一個體系,你的能力矩陣就在這個框裏面。

總分總針對的是學習新的知識,需要做的策略,先整體閱讀概念,使用場景,以及它的優缺點,隨後就是細分,開始實踐,分爲學習實例,掌握實例,應用實例,做出產品,最終再回到總結,加深對這個新的知識的理解,以便後續做別的產品,曉得是否這個新的知識可以直接應用。

這個總分總,就像人生三個境界:"看山是山,看水是水;看山不是山,看水不是水;看山還是山,看水還是水。"有句詩是這麼說的,願你走出半生,歸來仍是少年。

關於成長思維,我們都聽過一個段子,叫如何讓一個技術羣吵起來,就是扔一句話, PHP 是世界上最好的語言。然後就會出現各種不服,開始狂噴,相互 Diss 。這個屬於調侃,也無可厚非。但我們時刻要保持着成長思維,也就是是否對自己成長有用。

比如爭論這個,沒用。看到一個人寫的博客,寫錯了一點,就開始覺得自己比他牛,這個也是沒用,因爲這樣思考你不成長的。成長思維,就像是個好奇寶寶,時刻謙卑地吸收,學習自己的不足,用來強大自己。

能看到別人的優點,這個也是看起來很容易,實際卻很難。

不擡槓,認可別人的能力,誠懇的請教,這樣子的你,才能以最優的方式成長。
–完--推薦你讀:

說一說賺錢

副業剛需
賺錢還是掙錢

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章