溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android開發(fā)者怎么進(jìn)一步學(xué)習(xí)Android

發(fā)布時(shí)間:2020-05-29 19:23:09 來(lái)源:億速云 閱讀:212 作者:鴿子 欄目:移動(dòng)開發(fā)

寫在前面

如果你只是一個(gè)想成為 Android 開發(fā)者的人,并且還沒有寫過(guò)任何應(yīng)用,那么這篇文章對(duì)你來(lái)說(shuō),還有點(diǎn)太早。本文主要是為了幫助開發(fā)者成為一個(gè)更專業(yè)的人。

本文,我會(huì)給你很多建議,不會(huì)讓你空手而歸。文章中列出了如何在短時(shí)間成為一個(gè)專業(yè)的開發(fā)者。讀完文章,需要你自己去練習(xí),并時(shí)?;貋?lái)看看這些技能。

在本文開始之前,我就當(dāng)你已經(jīng)在 Google Play 發(fā)布過(guò) Android 應(yīng)用并且使用 GitHub 來(lái)進(jìn)行源碼管理。

一,0-2 年開發(fā)經(jīng)驗(yàn)

Android 是一個(gè)非常復(fù)雜的框架,它擁有陡峭的學(xué)習(xí)曲線。有一些復(fù)雜的概念的確是 Native 的 Android 開發(fā)者需要學(xué)習(xí)的,但另一部分卻是由于 Android 的原因,造成了它的復(fù)雜度。

當(dāng)你向?qū)I(yè)進(jìn)軍時(shí),除了你的軟件開發(fā)工作以外,你應(yīng)該學(xué)習(xí) Android 框架,忘記語(yǔ)言、架構(gòu)、流行的開源庫(kù),專注于核心概念,并進(jìn)行深入的研究。

具體來(lái)說(shuō),我建議你更多的了解以下內(nèi)容:

  • Android 內(nèi)存管理和進(jìn)程調(diào)度

當(dāng)面臨「Low Memory Killer」的時(shí)候,如何保證你的應(yīng)用程序穩(wěn)定可靠的運(yùn)行?這是一件很復(fù)雜的事情。長(zhǎng)話短說(shuō),當(dāng)用戶切換到其它應(yīng)用時(shí),你應(yīng)用的生命周期就會(huì)被打亂,但是當(dāng)用戶過(guò)一會(huì)兒重新切換回來(lái)的時(shí)候,用戶卻希望你的應(yīng)用程序像任何事情都沒有發(fā)生過(guò)一樣,正常運(yùn)行。

在本文中,我并不會(huì)介紹內(nèi)存管理的任何細(xì)節(jié),如果你想了解它們,可以看看這篇文章。

  • 生命周期

如果有人要我說(shuō)出 Android 應(yīng)用程序中的復(fù)雜度和 Bug 的主要來(lái)源,我會(huì)立馬大聲告訴他是“生命周期”(然后捂住臉哭)。

Application、Activity、Fragment、Service、BroadcastReceiver、ContentProvider 和一些 Android 框架的核心組件,都擁有復(fù)雜的生命周期,并且它們的生命周期還不一樣。如果你覺得這還不夠多,Google 也一直在推出新的庫(kù)和框架,這些庫(kù)都有自己的復(fù)雜性和獨(dú)立的生命周期。Loader, ViewModel 和 LiveData 都是為了解決這些問(wèn)題而推出的。

有件有意思的事情,我從來(lái)沒有看到過(guò)任何有關(guān)“生命周期“的定義。我們一直在使用它,但是它到底是什么意思呢?據(jù)我所知,在某種程度上,你只是把一些節(jié)點(diǎn)串聯(lián)在一起,構(gòu)建出一個(gè)生命周期的圖。我對(duì)生命周期有過(guò)很多的思考,在這里,我將嘗試對(duì)它進(jìn)行定義。

組件的生命周期是一個(gè)抽象的狀態(tài)機(jī)。這里的抽象的意思是指,這些狀態(tài)機(jī)的狀態(tài)是預(yù)先定義好的,它們之間的轉(zhuǎn)換條件也是定義好的。但是這些定義是不完整的。你需要去實(shí)現(xiàn)缺少的部分,使他們可以正常工作。這些缺少的部分是這些組件方法的子集,我們稱其為“生命周期回調(diào)”,除了狀態(tài)機(jī)本身之外,這些生命周期回調(diào)中,也有很多隱式的限制和約束。這些限制有些寫在了文檔中,而有些卻并沒有記錄。

生命周期到底有多復(fù)雜?我們先來(lái)看一下這張圖 (它有點(diǎn)不完整,還有點(diǎn)過(guò)時(shí))。這張圖,看起來(lái)有點(diǎn)可怕。不過(guò),你也不要慌,大多數(shù) Andorid 開發(fā)者都搞不明白這個(gè)圖。事實(shí)上,即使 Google 的 Android 開發(fā)者也搞不明白生命周期的問(wèn)題。Google 在發(fā)布 Lifecycle 組件的時(shí)候,里面引入了一些有關(guān) Fragment 的 bug, 直到后續(xù)的新版本發(fā)布了才得以修復(fù)。

雖然現(xiàn)在你不需要完全掌握 Android 的生命周期,但是你必須要知道一些重要的細(xì)節(jié)。否則,你的代碼會(huì)變得混亂不堪,并且容易出現(xiàn)一系列難以解決的問(wèn)題。我寫了兩篇文章 Activity 生命周期與 Fragment 生命周期 ,描述了生命周期的細(xì)節(jié)。當(dāng)你不知道如何使用 onStart 和 onResume 時(shí),你可以去看看這兩篇文章。

當(dāng)你掌握了生命周期的基礎(chǔ)知識(shí),你可以去看看 Gabor Varadi 寫的 Android 開發(fā)的十宗罪 ,這篇文章,列舉出了大多數(shù)開發(fā)者都會(huì)犯的錯(cuò)誤。這些錯(cuò)誤大多數(shù)都與生命周期有關(guān)。

順便說(shuō)一下,在面試中,生命周期相關(guān)的問(wèn)題也會(huì)被經(jīng)常問(wèn)到。這也是你必須好好學(xué)習(xí)生命周期的原因。

  • Context

在每一個(gè) Android 應(yīng)用程序中,都有一個(gè)或多個(gè)上下文對(duì)象。

和生命周期一樣,它也很難被解釋。它就像是一個(gè)“上帝類“一樣,它有非常多的能力。我們很難用一兩句話就把它描述清楚。盡管如此,理解 Context 職責(zé)和不同 Context 之前的區(qū)別也是非常重要的。

本文中,沒有更多關(guān)于 Context 的內(nèi)容,我建議你去讀一下 StackOverflow 中關(guān)于 《What is 'Context' on Android?》 的回答和這個(gè)回答的內(nèi)容.

  • UI 線程

每一個(gè) Android 應(yīng)用程序都有一個(gè)特殊的線程 —— UI 線程。這一個(gè)線程在屏幕上繪制出 UI 頁(yè)面。如果你讓 UI 線程超負(fù)荷運(yùn)行,你的應(yīng)用程序?qū)?huì)變得卡頓,不響應(yīng)。在極端情況下,UI 線程中的錯(cuò)誤會(huì)導(dǎo)致整個(gè)應(yīng)用程序出錯(cuò)(至少看起來(lái)像是出錯(cuò)了)。

如果你想詳細(xì)了解線程背后的機(jī)制原理,你可以去看這個(gè)視頻,視頻中詳細(xì)解釋了 Android 中的多線程,包含 UI 線程的相關(guān)細(xì)節(jié)和可能存在的問(wèn)題。

  • 邏輯拆分

從整體上說(shuō),Android 框架的代碼很不“整潔”。它包含著很多的上帝類,這些類中,每一個(gè)有數(shù)千行代碼,并且我們還必須去擴(kuò)展這些類,才能讓我們的應(yīng)用程序運(yùn)行起來(lái)。在多數(shù)情況下,不管是 Application, Activity ,F(xiàn)ragments 還是 Service,我們都是在一個(gè)很大的類中,做很多的事情。

雖然在 Andorid 開發(fā)中,這是一個(gè)常見的做法,但這樣子做并不利于長(zhǎng)期維護(hù)我們的代碼邏輯。因此我建議,要盡可能的注意這個(gè)問(wèn)題,多找機(jī)會(huì)去重構(gòu)代碼,將邏輯拆分到獨(dú)立的類中去。

說(shuō)實(shí)話,我現(xiàn)在并不認(rèn)為,一個(gè)初級(jí)開發(fā)者可以對(duì)架構(gòu)和設(shè)計(jì)做出太多的改善工作。正確的封裝代碼邏輯,提取出有意義的類,都需要一些開發(fā)經(jīng)驗(yàn)。當(dāng)然,我也不希望你不去思考代碼拆分,你可以做一些力所能及的事情,避免出現(xiàn)不可控的情況(例如,一個(gè) Activity 中寫了超過(guò) 5000 行代碼)。

剛開始,你可以嘗試拆分這篇文章中描述的與 Context 有關(guān)的邏輯。

二,2-4 年開發(fā)經(jīng)驗(yàn)

當(dāng)你在你的職業(yè)生涯中工作幾年,你變成經(jīng)驗(yàn)豐富的 Android 開發(fā)者,通過(guò)研究和學(xué)習(xí),你可以很輕松的實(shí)現(xiàn)一些非專業(yè)化的功能。那下一步,你該做什么?

我認(rèn)為,在這個(gè)時(shí)候,你已經(jīng)很熟悉 Android 框架的基礎(chǔ)知識(shí)了,可以嘗試去學(xué)習(xí)更高層次的技能。這些技能不局限于 Android,它們是一些通用的軟件開發(fā)的技能。具體來(lái)說(shuō),你可以研究以下主題:

  • 依賴注入

依賴注入是一個(gè)關(guān)注結(jié)構(gòu)分離的設(shè)計(jì)模式。它主要是用來(lái)進(jìn)行分離應(yīng)用程序的兩個(gè)功能:應(yīng)用程序和核心功能、核心功能組件實(shí)現(xiàn)之間的鏈接。

從某些方面來(lái)說(shuō),實(shí)現(xiàn)了依賴注入的代碼庫(kù)就好你一個(gè)計(jì)算機(jī):依賴注入的基礎(chǔ)庫(kù)就像是主板一樣,而其他的功能組件就好像是 CPU、內(nèi)存、外設(shè)等。只要你的代碼中實(shí)現(xiàn)了依賴注入,你就可以很方便的插入新功能,并且可以很容易的重用其它組件的功能,也可以很方便的使用新組件的功能。雖然這個(gè)比喻有點(diǎn)夸張,但是在我看來(lái),它也確實(shí)很好的反映了依賴注入背后的思想。

不幸的是,現(xiàn)在關(guān)于依賴注入的文章,很多都存在誤解,這給初學(xué)者帶來(lái)很多干擾。因此,如果你想學(xué)習(xí)依賴注入,我建議你讀一下這篇文章,本文中,我分析了眾多依賴注入的“神話“。

  • UI 分離

由于 Android 框架本身的架構(gòu),造成了我們?cè)陂_發(fā)的過(guò)程中,使用戶頁(yè)面與應(yīng)用程序中的其它邏輯耦合在一起。幾乎所有的 Android 初學(xué)者都會(huì)這樣。這種耦合會(huì)導(dǎo)致我們寫一個(gè)很大的類,這個(gè)類里面有應(yīng)用程序的 UI 繪制、網(wǎng)絡(luò)處理、多線程處理、應(yīng)用業(yè)務(wù)邏輯等。

根據(jù)我的經(jīng)驗(yàn),UI 邏輯與其它邏輯耦合在一起,會(huì)導(dǎo)致代碼的可維護(hù)性越來(lái)越差,遲早會(huì)使用代碼變得難以理解,無(wú)法閱讀。到最后,可能會(huì)因?yàn)楣δ苌系囊稽c(diǎn)小變化,引起很大的副作用。

要將 UI 邏輯與其它邏輯進(jìn)行分離,可以用使用 Model- View - X 的架構(gòu)模式。例如: Model-View-Contoller(MVC)、Model-View-Presenter(MVP)、Model-View=ViewModel(MVVM)。這些架構(gòu)模式都屬于同一類架構(gòu),當(dāng)然,這一類架構(gòu)不僅僅包含列舉的這幾個(gè),還有其它的架構(gòu)模式。在這里,為了更方便的描述這一類架構(gòu)模式,我把他們統(tǒng)稱為 MVx 模式。

當(dāng)你在學(xué)習(xí) MVx 模式的時(shí)候,請(qǐng)記住,這些都不是架構(gòu),而是一種架構(gòu)模式。這些架構(gòu)模式僅用于 UI 展示邏輯。因此僅僅使用 MVx 并不能給你一個(gè)好的架構(gòu),要有一個(gè)好的架構(gòu),你還需要在其它方面做出更多的努力才能實(shí)現(xiàn)。

  • 多線程

有經(jīng)驗(yàn)的 Android 開發(fā)者都會(huì)了解多線程,并且了解他們對(duì)應(yīng)用程序的影響。你也許會(huì)說(shuō),我精通 AsyncTask、RxJava、協(xié)程等。我想表達(dá)的多線程不是你理解的這個(gè)。會(huì)使用多線程框架并不等同于理解多線程。

舉個(gè)例子,眾多 Android 開發(fā)者都認(rèn)為,使用 AsyncTask 會(huì)導(dǎo)致內(nèi)存泄漏。這個(gè)觀點(diǎn)來(lái)自 Android Studio 默認(rèn)的多線程 lint 規(guī)則中。既然如此,那這個(gè)觀點(diǎn)就是對(duì)的了嗎?很不幸,這個(gè)觀點(diǎn)是錯(cuò)誤的。在這里,我不講解它們的細(xì)節(jié),你可以讀一下這篇文章,里面有很多關(guān)于 AsyncTask 的內(nèi)容。

我認(rèn)為要理解多線程程,就必須可以使用任何多線程框架,甚至是基于基礎(chǔ)的 Thread ,都可以寫出正確的并發(fā)代碼。要實(shí)現(xiàn)這個(gè)目標(biāo),你不僅僅需要知道你喜歡的多線程庫(kù)的 API,你還需要理解多線程的細(xì)節(jié)。這些多線程庫(kù)雖然好用,但如果你不理解多線程的基礎(chǔ)細(xì)節(jié),那么你的應(yīng)用程序出現(xiàn)多線程的問(wèn)題只是時(shí)間問(wèn)題。

如果你想學(xué)習(xí)多線程,從這個(gè)視頻 開始,視頻中講解了所有 Android 開發(fā)人員都需要知道的基本概念與原理。

  • 自動(dòng)化測(cè)試

據(jù)我所知,很多 Android 項(xiàng)目,都沒有使用任何的自動(dòng)化測(cè)試。在使用自動(dòng)化測(cè)試的項(xiàng)目中,大多數(shù)也是 QA 人員使用 Appium 之類的工具來(lái)完成的。這是整個(gè) Android 行業(yè)的現(xiàn)狀,非常可悲。之所以沒有自動(dòng)化測(cè)試,這個(gè)問(wèn)題可以追溯到 Android 起源,Google 也在很長(zhǎng)一段時(shí)間里,沒有關(guān)注過(guò)第三方應(yīng)用的自動(dòng)化測(cè)試。

現(xiàn)如今,有單元測(cè)試和 UI 自動(dòng)化測(cè)試經(jīng)驗(yàn)的開發(fā)者需求量很大。即使你到一家沒有使用過(guò)任何自動(dòng)化測(cè)試的公司去面試,如果你說(shuō)你會(huì)自動(dòng)化測(cè)試,就會(huì)給你的面試加分。反之,如果你去的是一個(gè)廣泛使用自動(dòng)化測(cè)試的公司,你沒有自動(dòng)化測(cè)試的技能,這會(huì)給你面試減分,處于劣勢(shì)。

因此,我建議每一個(gè) Android 開發(fā)者都去學(xué)習(xí)一下自動(dòng)化測(cè)試的相關(guān)知識(shí)。就個(gè)人而言,我更喜歡單元測(cè)試。而一些開發(fā)者喜歡 UI 自動(dòng)化測(cè)試。所以,可以選擇一個(gè)你更感興趣的技術(shù),嘗試一下。

三,4 年以上經(jīng)驗(yàn)

如果你對(duì) Android 已經(jīng)有了非常豐富的開發(fā)經(jīng)驗(yàn),那么,是時(shí)候?qū)W習(xí)一些“元”技能了,并且在特定領(lǐng)域進(jìn)行深度研究。在我看來(lái),以下技能對(duì)專業(yè)的開發(fā)人員來(lái)說(shuō),都是非常不錯(cuò)的方向。

  • 技術(shù)方案評(píng)估

如果你還沒有做過(guò)這件事情,那么現(xiàn)在是時(shí)候開始做了。每一個(gè)重要的技術(shù)決定,都需要進(jìn)行評(píng)估、權(quán)衡。有時(shí)候,這種決定帶來(lái)的結(jié)果非常好,立竿見影。但是大多數(shù)時(shí)候,并非總是能夠立竿見影,看到效果。通常情況下,需要決策的范圍越大,所涉及到的評(píng)估范圍就越大,除了可以簡(jiǎn)單進(jìn)行決策的事情,還有很多可評(píng)估項(xiàng)都是非常抽象,短時(shí)間內(nèi)根本看不到結(jié)果的。

在自己豐富的經(jīng)驗(yàn)水平下,面對(duì)眾多選擇,你至少應(yīng)該知道如何找到取舍。如果你能對(duì)技術(shù)方案評(píng)估提供有用的建議,你就非常優(yōu)秀了。技術(shù)方案評(píng)估權(quán)衡這是一項(xiàng)非常復(fù)雜的技能。通常,在與其它開發(fā)者、項(xiàng)目經(jīng)理甚至是其它部門員工討論的時(shí)候,你能找到折中方案,就能進(jìn)行方案評(píng)估。因此,在大數(shù)情況下,你只需要掌握評(píng)估方案的能力就夠了。

那我們所說(shuō)的“技術(shù)方案的評(píng)估”到底是什么意思?說(shuō)實(shí)話,很難具體說(shuō)明它是什么。不過(guò),我們可以提供一些反例,來(lái)解釋為什么不適合在開發(fā)中使用。舉個(gè)例子:

我們應(yīng)該將多線程的使用遷移到 RxJava, 而不是 AsyncTask, 因?yàn)?AsyncTask 會(huì)導(dǎo)致內(nèi)存泄漏。

正如我前面所說(shuō),AsyncTask 并不會(huì)導(dǎo)致內(nèi)存泄漏。所以上面這句話是錯(cuò)誤的。說(shuō)這句話的開發(fā)者并沒有深入的研究多線程。此外,他也沒有提到 RxJava 的問(wèn)題。對(duì)于一個(gè)項(xiàng)目中的開發(fā)人員來(lái)說(shuō),RxJava 存在一個(gè)很陡峭的學(xué)習(xí)曲線。

我們應(yīng)該為我們的新代碼寫單元測(cè)試,并且設(shè)定一個(gè)長(zhǎng)期的目標(biāo),覆蓋所有的代碼,以確保我們的代碼質(zhì)量。

這句話包含幾個(gè)前提,首先,我們現(xiàn)在開始單元測(cè)試是不可能的,至少需要開發(fā)人員投入時(shí)間來(lái)學(xué)習(xí)這種技術(shù)。編寫單元測(cè)試是一個(gè)很明智的決定。我們不能為所有代碼編寫單元測(cè)試,因?yàn)橛幸恍┎糠质遣环€(wěn)定的。最后,達(dá)到特定的覆蓋目標(biāo)并不會(huì)自動(dòng)提高“質(zhì)量“。在這個(gè)例子中,開發(fā)者并不了解單元測(cè)試,他們無(wú)法確定在項(xiàng)目中使用單元測(cè)試所涉及的問(wèn)題和影響。

我希望,你對(duì)“技術(shù)方案評(píng)估”已經(jīng)有了大致的想法,如果你有一個(gè)重要的決定,你需要完成所有必要的調(diào)研,如果你依然看不到整個(gè)評(píng)估中存在的復(fù)雜網(wǎng)絡(luò),那可能是你的調(diào)研沒有做好。在做決定的時(shí)候,有些事情可能超出技術(shù)范圍,你也需要考慮你的決策對(duì)其它部門同事的影響。

  • 專業(yè)領(lǐng)域

如何區(qū)分一個(gè)技術(shù)專家和一個(gè)普通開發(fā)者?是我們熟悉的概念的數(shù)量嗎?我認(rèn)為,在技術(shù)方面,區(qū)分是否是專家主要在于知識(shí)上的深度。

作為一個(gè)技術(shù)專家,你應(yīng)該有一個(gè)或者多個(gè)專業(yè)領(lǐng)域。你知道這些領(lǐng)域的詳細(xì)細(xì)節(jié),比一般的開發(fā)者知道的要多得多。你需要持續(xù)深入的研究,來(lái)保證你的專業(yè)深度,了解專業(yè)領(lǐng)域的最新發(fā)展,不會(huì)對(duì)新的工具和技術(shù)感到驚訝。此外,即使你并沒有在任何項(xiàng)目中使用某些技術(shù),你也需要研究這些技術(shù)使用上相關(guān)聯(lián)的各種成本。

現(xiàn)如今,有一個(gè)自己的專業(yè)領(lǐng)域很難。這不是從博客中挑選幾篇好文章進(jìn)行閱讀就可以的,也不是讀完幾本好書、上完幾門好課就可以的。當(dāng)然,通過(guò)這些內(nèi)容進(jìn)行學(xué)習(xí),對(duì)你的專家之路都是有幫助的,但是要有自己的專業(yè)領(lǐng)域,唯一的方法就是積極參與其中進(jìn)行學(xué)習(xí)研究并獲得大量經(jīng)驗(yàn)。

我很喜歡物理學(xué)家尼爾斯·玻爾說(shuō)的這句話:

An expert is a man who has made all the mistakes which can be made, in a narrow field.(專家就是把領(lǐng)域內(nèi)所有該犯的錯(cuò)都犯完的人。)

我們可以在哪些領(lǐng)域進(jìn)行深入研究呢?實(shí)際上,幾乎所有的都可以進(jìn)行深入的研究,在軟件開發(fā)領(lǐng)域,沒有任何一個(gè)領(lǐng)域會(huì)因?yàn)樘《荒茉O(shè)置成專業(yè)目標(biāo)。對(duì)此,我也有一些建議:

  • UI

  • 構(gòu)建系統(tǒng)

  • 離線工作

  • 并發(fā)

  • NDK

  • 持續(xù)集成

  • 性能

  • 架構(gòu)

  • 監(jiān)測(cè)

  • 項(xiàng)目管理

  • 專業(yè)知識(shí)領(lǐng)域

還有很多很多。需要注意的是,上面我列出來(lái)的內(nèi)容,一些并不屬于嚴(yán)格的技術(shù)領(lǐng)域。只要你能為你的雇主產(chǎn)生價(jià)值,你可以選擇你喜歡的任何領(lǐng)域并進(jìn)行深入研究。

我認(rèn)為,一個(gè) Android 技術(shù)專家,至少有 2~3 個(gè)專業(yè)領(lǐng)域,例如,我的專業(yè)領(lǐng)域是:架構(gòu)、單元測(cè)試、并發(fā)、依賴注入。我相信,在不久的將來(lái),我能夠?qū)ⅰ爸貥?gòu)祖?zhèn)鞔a”添加我的專業(yè)技能列表里面。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI