12年高階工程師的“飛昇之路”,Android多型實現原理
1. Kotlin ?
-
Kotlin 通常被視為下一個 Java,它是由谷歌和 JetBrains(Android Studio 開發者)贊助的。Java 從一開始就一直是 Android 應用的首選開發語言,但近年來 Kotlin 迅速普及,如今在 10,000 種 Google Play 應用中有近 60%使用了 Kotlin[3]。雖說在少數需要訪問底層原生程式碼的情況下,仍會繼續使用 C++;但在其他情況下,Kotlin 都可以代替 Java。
-
Kotlin 的主要優勢是與 Java 的完全互操作性,這意味著開發人員可以儘可能遷移舊程式碼,而不用完全重寫整個應用程式。這兩種語言相容得很好,Android Studio 甚至可以自動從 Java 轉換為 Kotlin。
-
這種相容性,加上更簡潔的語法和數百項細小改進,使 Kotlin 在 StackOverflow 的 2019 年開發人員調查 [4] 中成為第四大“最受歡迎”和第五大“想要”的程式語言,在所有移動程式語言中排名最高。
-
遷移現有應用有一個好方法,就是在修改現有 Java 檔案時將其轉換為 Kotlin。雖然這意味著你要把經常編輯的檔案轉換過去,會增加程式碼審查的複雜度(比如會面臨潛在的衝突),但由於轉換後的區域能得到審查,因此可以確保任何問題都能被發現。
-
目前 Candyspace 中使用的 Kotlin 程式碼佔 86%(並且一直在增長),其餘的 14%是實用工具 / 轉換程式碼,這些程式碼已經有些年頭沒改動過了。
2. Jetpack
谷歌的 AndroidX/Jetpack 庫是一組實用工具,旨在簡化常見的應用需求。例如用於裝置上資料庫的 Room[5],或用來在底層資料更改時更新顯示內容的 LiveData[6]。
有了 Jetpack 庫,新專案就省掉了重新發明輪子的麻煩,也不必等待其他開發人員來開源他們的實現方式,現在每位開發者都能獲取到那些基礎要素了。這些庫更新非常頻繁,新功能不斷推出,錯誤修復也會及時釋出。由於這些庫是為了協同工作而構建的,因此多使用 AndroidX 庫有助於最大程度地減少應用中出現意外。
從開發工作起步開始就使用 Jetpack 庫可以節省數百小時的時間,但我們也可以將已有的應用遷移到 Jetpack 庫上面。雖然看起來很麻煩,但由於這些庫非常流行,針對遷移工作的指南也很容易找到。至少,底層 Android 元素(檢視、片段等)可以自動轉換 [7]。
在 Candyspace,我們使用了 Data Binding 和 ViewModel,並可能很快加入 Room 和 Navigation。
3. 模組化設計
-
一直以來,應用都被構建為一個巨大的“應用”模組,其中包含整個應用所需的一切。儘管這樣做確實能讓資源共享起來更容易,但也意味著這個應用的某些部分無法為其他應用 / 開源專案所重用;更重要的是,對應用做出更改時必須重新編譯整個程式碼庫。
-
相反,如果應用由許多較小的模組組成,則只需重新編譯做出更改的程式碼即可,從而大大縮短了構建時間。此外,模組化設計還為高階 Android 特性(例如即時應用——使用者無需安裝任何內容即可使用你的應用的部分功能,和動態特性——按需安裝應用的各個部分)的應用打開了大門。
-
將一款現有應用拆分為多個模組可能會是一個很複雜的工作,因為會因此而發現之前隱藏的問題(“DateUtility 是什麼東西?為什麼每個類都需要它!?”);但是一旦改造完成,程式碼庫就會進入一種更加健康的狀態。另外,如果一款新的應用需要類似的功能,則可以快速重用已有模組,從而大大節省時間!
模組化應用架構的一個示例
雖然設計一個模組化架構可能是很複雜的任務,但我之前已經寫過一些指導性原則 [8],這些原則受到了 Nikits Kozlov 關於模組化和構建時間的文章 [9] 的啟發。Plaid 也寫了一篇介紹他們向模組化設計遷移經驗的文章 [10]。
在 Candyspace,我們的應用設計都是完全模組化的,以儘量減少構建時間對開發工作的中斷影響。
4. App Bundle
使用傳統的 APK 將應用分發到使用者的裝置時,必須安裝針對所有裝置準備的所有資源。這意味著每張點陣圖影象可能會有 5 個副本(用於不同的螢幕精度),還要安裝針對不同裝置架構的多個庫版本,甚至還得安裝多組邊距和填充值。
使用 App Bundle 分發一款應用時,使用者下載的 APK 只包含他們實際所需要的資源。這樣一來,平均的應用大小就會減少 20%,而未經優化的應用改換格式後應用大小將會得到更顯著的縮減。
縮減應用大小的示例(資料來源於Google I/O 2018)
App Bundles 是 18 個月前剛剛誕生的,但已經有超過 25%的應用安裝時使用了這種格式!這是谷歌推薦使用的格式 [11],並且大多數應用幾乎無需改動就能使用這種格式,只需在 Play 商店上處理一下 App Bundle 的簽名即可。
在 Candyspace,我們正在遷移到 App Bundles 上,同時儘量避免破壞我們現有的工作流程(Slack、QAing 構建、非 Google Play 安裝)。Alistair Sykes 的文章是一份很棒的遷移參考資料 [12],文章考慮到了 CI 伺服器、Slack 和 Google Play 內部應用共享等事項。
最後
文章不易,如果大家喜歡這篇文章,或者對你有幫助希望大家多多點贊轉發關注哦。文章會持續更新的。絕對乾貨!!!
- Android進階學習全套手冊
關於實戰,我想每一個做開發的都有話要說,對於小白而言,缺乏實戰經驗是通病,那麼除了在實際工作過程當中,我們如何去更瞭解實戰方面的內容呢?實際上,我們很有必要去看一些實戰相關的電子書。目前,我手頭上整理到的電子書還算比較全面,HTTP、自定義view、c++、MVP、Android原始碼設計模式、Android開發藝術探索、Java併發程式設計的藝術、Android基於Glide的二次封裝、Android記憶體優化——常見記憶體洩露及優化方案、.Java程式設計思想 (第4版)等高階技術都囊括其中。
-
Android高階架構師進階知識體系圖
關於視訊這塊,我也是自己蒐集了一些,都按照Android學習路線做了一個分類。按照Android學習路線一共有八個模組,其中視訊都有對應,就是為了幫助大家系統的學習。接下來看一下導圖和對應系統視訊吧!!!
-
Android對標阿里P7學習視訊
- BATJ大廠Android高頻面試題
這個題庫內容是比較多的,除了一些流行的熱門技術面試題,如Kotlin,資料庫,Java虛擬機器面試題,陣列,Framework ,混合跨平臺開發,等