作者:Mr_萬能膠
2023 年 Google I/O 已于 2023 年 5 月 10 日 拉開帷幕,Android 14 Beta 版本近期也已經 釋放到 Google partners,本文主要分析 Google 在 Android 14 框架代碼中引入了哪些新的技術棧,而對于新功能和 API Change,則并不在本文的討論范圍之內。
編譯系統:Bazel 使用范圍進一步擴大
說到編譯,對于獨立應用而言,大家接觸最多的應該是build.gradle
,這個不在此贅述。事實上,Bazel
已經不能說是在 Android 14 首次亮相了,這一點大部分 Java
開發者應該感知不到,因為我們幾乎都被 Gradle
還有 Make
寵壞了(雖然也不是那么好用),比較關注新技術的搞瀏覽器或者偏底層的小伙伴,倒是可能早就在用了。
需要首先說明的是,Bazel
并不跟 Android
編譯強相關,只不過它碰巧支持構建 Java
、C++
、Go
,Kotlin
等語言,而 Android 開發也基本使用上述這些語言。另外,對 Rust
, Python
的支持也在逐漸被加入,Google 對 Bazel
的開發還是十分積極的。
轉到框架這邊,截止到 Android 13,你寫的大部分配置文件應該還是 Android.bp
,它經過 Soong
解析成 Ninja
,而偏底層配置相關的邏輯,則依然由 Android.mk
定義,并經過 Kati
解析成 Ninja
,一個典型的編譯流程圖如下:
而來到 Android 14,Bazel
的解析流程會被加入進來,流程圖如下:
從目前 Google 公布的路線圖來看,從 Android 14 開始,所有遷移后的 C++
模塊將默認使用 Bazel
編譯,從 Android 15 開始,所有 Mainline
的模塊將默認使用 Bazel
編譯。
看到這,估計你還是不慌,反正老的還兼容著呢,不急。然而 Google 對這塊還是有信心的,如果問題不大,再加上官方自己不棄坑的話(老實說 Google 棄的坑不少了,懂得都懂),等到了 Android 16,整個編譯系統應該都會切到 Bazel
。
怎么辦?怎么辦?怎么辦?
學!怎么學?看官網!官網給我們提供了非常豐富的例子,不管你的項目是 Java 的,還是 Kotlin 的,常見的問題,比如第三方庫怎么引用,NDK 項目怎么配置等,都能找到依葫蘆畫瓢的答案。
Settings:Kotlin 和 Jetpack Compose 都來了
開始遷移到 Kotlin
Google 在 2017 年的 IO 大會上將 Kotlin 定義為 Google 官方支持的開發語言,時至今年,大部分 App 開發者都已經切過來了。然而,Android 框架開發者很多似乎還對這門語言嗤之以鼻,或者換句話說,平時用不到,再加上 Google 似乎一直沒在框架里過多使用,所以暫時也沒有學的必要。
很”遺憾“,在 android 14 的 Settings 模塊,我們開始看到了 Kotlin 的影子。自此,搞框架 App 開發的同學失去了最后一個不學 Kotlin 的借口。
事實上,Settings 模塊并不是第一個吃螃蟹的,頭部的 SystemUI
模塊,早在 2018 年就開始用 Kotlin 改寫部分模塊了,而且這次 android 14 上還有進一步的演進,這個后面會提到。
我們很多搞框架開發的小伙伴,對于新技術似乎有種本能的排斥,大家的內心 OS 無外乎:
- 這玩意兒都是折騰 App 用的,框架要的是穩定,完全用不到
- Google 自己都沒咋在模塊里面用到,我干嘛折騰呢?
- 天生驕傲,覺得自己是搞框架的,比隔壁那些搞 App 的高到不知道哪里去了…
希望看到這篇文章的小伙伴,平時千萬不要有以上這些想法。我們的認知永遠都是有限的,很多時候你這樣想,很可能只是因為沒有看過別的模塊而已,別的模塊說不定早就卷入新的技術棧了,就等著彎道超車呢。
怎么辦?怎么辦?怎么辦?
學!Kotlin 怎么學,這個……這么多年了,網上太多教程了,不說了。
引入 Jetpack Compose
說起來這又是一個新的坑,Google 是在 2019 年的 IO 大會宣布了把 Jetpack Compose 定義為 Android’s recommended modern toolkit for building native UI。然而,寫慣了 findViewById
的我們,有可能剛剛學會用 ViewBinding,怎么這次直接上 Jetpack Compose
了?
從 Android 14 目前釋放的代碼來看,Google 新建了一個 spa
包,這個包里面嘗試把“應用管理”、“應用通知管理”,還有“使用情況”頁用 Jetpack Compose
重寫了,這些頁面幾乎都是純列表頁面,拿它們優先下手理論上不會有太多坑,我猜 Google 也是這么考慮的?
除此之外,還有3個主頁面也進行了重寫,這三個頁面本質上也是列表頁:
出于穩健考慮,Google 沒有默認使能這些頁面。如果你想提前吃螃蟹,可以使用以下命令來開啟: adb shell settings put global settings_enable_spa true
通過搜索代碼,也可以輕松找到這個開關在哪里被使用:
然后我們可以去到相關頁面看一下前后對比:
原生實現
Jetpack Compose 實現
由于 Jetpack Compose
的各個組件一直都在很好地踐行 Material Design 3,可以看到后者的視覺還原要更好,也不會出現前者那樣 MenuItem
背景顏色不正確的問題。
好了,讓我們回到技術本身。其實我知道很多小伙伴拒絕學習 Jetpack Compose
,本質上是拒絕學習聲明性編程,一看到那種樣式的代碼就腦闊疼。而我完全理解你痛苦。就像當初學習 RxJava
,好不容易從函數式編程過渡到了響應式編程,這次又來了一個新概念,確實內心是拒絕的。
其實編程思維的轉變,說難也難,說簡單也簡單?;剡^頭想一下,當初你看著別人寫的 RxJava
代碼,一氣呵成,感覺很厲害的樣子,其實本質上還是因為那個時候你沒學會,看不懂 lambda
,看不懂那些運算符是啥意思。等你后面學會了,再回過頭來看,那種感覺跟初學的時候就完全不一樣了。事實上,學習聲明式編程也是如此。
怎么辦?怎么辦?怎么辦?
學!幸運的是,Google 給我們提供了詳細的指導,大家可以參考 developer.android.com/jetpack/com…來快速入門上手。而且,這波 Google 自己帶節奏,不學看起來是真的不行了。
SystemUI:使用架構最佳實踐(Best Practise)重寫
當看到這個標題的時候,你一定會覺得很晦澀,但我相信看到下面這張圖,你一定不會感到陌生。
沒錯,這就是 Google 這幾年一直在 App 開發層推崇的架構最佳實踐。從 Android 14 開始,這套架構被引入 SystemUI
模塊,用來解決之前狀態欄各 item 的 Controller
和狀態之間混亂不堪的問題。
對于 SystemUI
而言,狀態欄的每一個 item,無外乎都關聯著一個個回調,而回調進來的數據,往往都是外部對象,而 item 本身可能更關心的是自己的內部對象,并且狀態一旦變了, UI 是一定要跟著變的,而這個需求恰好是這套架構最佳的使用場景。來看 Google 是怎么重構的:
近年來,Android App 應用開發已經從最開始那種兵荒馬亂的年代,慢慢過渡到大家都開始重視應用架構了。從最開始的啥都往 Activity
/Fragment
里塞,慢慢到后來有了 MVC
,再后來到 MVP
,現在又流行的 MVVM
,Google 似乎最終也站穩了立場。
怎么辦?怎么辦?怎么辦?
學!關于 app 架構最佳實踐 的詳細內容,可以參考 Google 官網的這篇介紹。需要注意的是,要想更方便地運用這套結構,依賴注入(DI) 往往是必不可少的,SystemUI
其實很早就在用依賴注入了,目前依然是 Dagger
,而其實 Google 這幾年一直在推進他們基于 Dagger
演變的 Hilt
,這是一套更適合 Android 平臺的依賴注入框架,大家可以從這里了解到具體詳情。另外,Kotlin
協程,和對數據流(Flow
)的理解也是必不可少的,這部分大家也可以參考官網。
我的個人建議是,大家先學習依賴注入(DI),再學習 Kotlin Flow,最后再回過頭來入門這套架構,這套學習路線應該是比較正確的。
福利: Android Studio for Platform 要來了
文章最后帶來一個好消息,那就是 Google 在今年總算良心發現,想起了我們這幫苦巴巴的搞 Android 框架的平臺開發者,在繼 AIDEGEN 之后,他們正在搞 Android Studio for Platform
。
從目前放出的預覽圖來看,整體應該至少是基于 IDEA 2022.3,因為默認啟用了 NEW UI,然后平臺開發會用到的應該都會支持,但何時能放出下載官方暫時還沒有說,希望 Google 能好好搞,求別棄坑。
總結
寫到這里,我想回到本文的標題,細心的讀者會發現,我給”新技術棧的”新“字打了引號,為什么?因為對于那些關注技術發展,同時在 Android 應用層和框架層之間工作的同學來講,這些其實早就不是新技術了,有些甚至可以說是應用層”玩剩下的“。為什么這些技術時至今日才被引入 Android 框架?我想無外乎還是為了追求穩定,就像當年 Kotlin 也是在社區,在 App 開發層火了好多年,Google 后面才參與進來,并最終引入框架一樣,很多東西的可行性和穩定性也需要時間去驗證。我個人很欣賞國外大廠在技術上的務實,不像國內很多廠商弄東西,還沒穩定,或者還沒經過時間驗證,總是拿出來先吹為敬,可能也是大環境導致吧。
Android 學習筆錄
Android 性能優化篇:https://qr18.cn/FVlo89
Android 車載篇:https://qr18.cn/F05ZCM
Android 逆向安全學習筆記:https://qr18.cn/CQ5TcL
Android Framework底層原理篇:https://qr18.cn/AQpN4J
Android 音視頻篇:https://qr18.cn/Ei3VPD
Jetpack全家桶篇(內含Compose):https://qr18.cn/A0gajp
Kotlin 篇:https://qr18.cn/CdjtAF
Gradle 篇:https://qr18.cn/DzrmMB
OkHttp 源碼解析筆記:https://qr18.cn/Cw0pBD
Flutter 篇:https://qr18.cn/DIvKma
Android 八大知識體:https://qr18.cn/CyxarU
Android 核心筆記:https://qr21.cn/CaZQLo
Android 往年面試題錦:https://qr18.cn/CKV8OZ
2023年最新Android 面試題集https://qr18.cn/CgxrRy
Android 車載開發崗位面試習題:https://qr18.cn/FTlyCJ
音視頻面試題錦:https://qr18.cn/AcV6Ap