劝学:Android 14 Framework 引入了哪些“新”技术栈

作者: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 编译强相关,只不过它碰巧支持构建 JavaC++GoKotlin 等语言,而 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/27973.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Netty中ServerBootstrap类介绍

一、Netty基本介绍 Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。Netty 在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。 Netty 是一…

OpenShift Route 的实现原理

OpenShift Route 的实现原理 OpenShift 如何使用 HAProxy 实现 Router 和 RouteRouter appHAProxy 配置1. HTTP2. HTTPS OpenShift 中的 Route 解决了从集群外部访问服务的需求,与 Kubernetes 中的 Ingress 类似。 OpenShift 中 Route 资源 API 定义如下&#xff1…

【数据结构】树

树 一些简单的性质: 设树中的结点总数为n,等于所有结点的度数之和1。设树中度数为i的结点数为ni ,则nn0n1n2…nm11 * n12 * n2…m*nm度为m的树中第i层上至多有m^i-1个结点(i>1)高度为h的m叉树至少有(m^h-1)/(m-1)个结点具有n个结点的m叉树的最小高度…

React生命周期

生命周期是一个抽象的概念,在生命周期的整个过程,分成了很多个阶段: 比如挂载阶段(Mount),组件第一次在DOM树中被渲染的过程; 比如更新过程(Update),组件状…

Spring集成Kafka

前言 我负责的其中一个项目,接口的交互量在千万级/d,所以要存储大量的日志,为了防止日志的存储影响到系统的性能,所以在技术选型就决定了使用Kafka中间件和一个日志存储系统来负责日志的存储。 使用Kafka 的优点: 1.…

图书推荐|大数据从业人人必备的Excel大数据处理分析

《Excel大数据处理&分析》为活页式新形态教材,介绍了Excel 2016的数据表基本操作、数据输入、数据获取、数据排序、数据筛选、分类汇总、公式与函数、日期和时间函数、数学和统计函数、查找和引用函数、数据透视表、图表的可视化分析、宏和VBA、数据分析工具的应…

23年软件测试前景和出路?新人入行测试怎样走“正确“的路...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 现在面试&#xf…

金融计量学第1节课:股指收益率序列统计特征

量化策略开发,高质量社群,交易思路分享等相关内容 导论与介绍 大家好,我是Le Chiffre 今天我们来为大家分享金融计量学系列内容,在松鼠量化3年多分享的内容中,大部分以量化策略为主,至今为止,…

Kotlin Lambda表达式和匿名函数的组合简直太强了

Kotlin Lambda表达式和匿名函数的组合简直太强了 简介 首先,在 Kotlin 中,函数是“第一公民”(First Class Citizen)。因此,它们可以被分配为变量的值,作为其他函数的参数传递或者函数的返回值。同样&…

【Excelc超实用快捷键!!!办公效率1000%up!up!up!】

目录索引 ctrle:提取数据:合并数据: 普通快捷键:ctrla:ctrlc:ctrlv:ctrlx:ctrlz:ctrly:ctrls:ctrlf: 文字格式快捷键:ctrl…

Python程序设计基础:数值

文章目录 一、数值数据类型二、python内置的数值操作三、math库 一、数值数据类型 Python语言可以很方便的用于处理数值运算问题,在数值运算过程中,常见的额两种数据类型分别为整数类型(int)和浮点类型(float&#xf…

局域网内不同网段的设备互相连接设置

目录 介绍1、打开网络连接,找到本地网络->属性->ipv4->属性->高级:2、在高级设置页面,我们添加一个IP,这个IP和板子在一个网段,我这里设置的是192.168.253.101:3、设置完成即可生效&#xff0c…

Jetpack Compose ——Row

当我们构建界面时,经常需要在Compose中使用Row布局来水平排列多个组件。Row提供了一种方便的方式来管理和定位子组件,使它们按照我们期望的方式呈现。 在Compose中,Row可以接受多个子组件作为参数,并根据指定的布局规则进行排列。…

ChatGPT 应用——使用 chatGPT 写高考作文

写作文,很简单,但写一篇好的作文,是非常有难度的。 想要写一篇高分作文,需要对作文题目有正确的理解,需要展现独到的观点和深入的思考,需要具备清晰的逻辑结构,需要准确而得体的语言表达。 正…

金鸣识别的表格分析技术揭秘

表格分析是指将图片中的表格区域分割出来,并识别出表格中的单元格和单元格中的内容。表格分析技术主要包括以下几个步骤: 1. 表格检测:通过图像处理技术,将图片中的表格区域分割出来。 2. 单元格分割:将表格中的每个单…

Unity入门4——重要组件与API

一、GameObject (一)成员变量 // 名字 print(this.gameObject.name); this.gameObject.name "Lesson4唐老狮改名"; print(this.gameOb…

简单使用Hystrix

使用Hystrix之前&#xff0c;需要先对SpringCloud有所了解&#xff0c;然后才会使用的顺畅&#xff0c;它是我们SpringCould的一种保护机制&#xff0c;非常好用。 下面直接开始 先导入Hystrix所需要的依赖 <!-- 引入openfiegn--> <dependency> <groupId>org…

图解数据结构--栈的实现-C语言版本--源码

目录-总 -分- 总结构 图片可视化 总源码1.头文件介绍---分2.节点的实现3.栈顶栈底4.函数的提前声明5. 栈 ---初始化栈6. 栈 ---进栈7.栈 --- 遍历8.栈 --- 是否为空9.栈 --- 出栈10总结 图片可视化 总 源码 /*time 2023年6月12日12:39:06auther yzmcntent stract 栈 */#inclu…