Android Q Labs | Jetpack 更新

1,130 阅读5分钟

我是来自开发者关系部的工程师刘亮恩,今天我为大家带来两周前公布的 Jetpack Library,一个叫 Jetpack Compose,另一个叫 CameraX,前者是帮助开发者编写用户界面的一个 Supply Library,后者是帮助开发者编写相机功能和应用的 Supply Library。

Jetpack Compose

两个重要的更新是14年的 Recycler View 和17年的 Constraint Layout。

Google Sooner 是我们在07年发布的一款分辨率为320*240的手机。然而把这个分辨率放到今天的 Pixel 上,这块分辨率区域的大小和图上 Pixel 的视频窗口差不多。Android 1.0 到现在已经11年了,然而和用户界面上没有太大变化和改善。

UI toolkit

我们经常听到开发者反馈,他们要求把 UI toolkit 从系统层面分割出来。举例来解释,假如今天我们在 Android 的系统上面找到一个 UI Bug,我们的 Android 团队要进行修复,修完以后把修复放到我们的 fame 里面,所以最快也要等到下一年的新的 Android 更新,修复才会正式出现。所以再小的修复也要等待1-2年时间,这是个很大的问题。在今年的 IO 上,我们发布了一个用户界面的库。

现在来看我们 Android 系统的 toolkit 中存在的问题。假如有在 AOSP 上看过我们 view.java 代码文件的话,它的代码接近3万行,可以想象在这么大的一个 class 里面进行维护会有多么困难。

大家对 Spinner 应该不陌生,其字面意思是旋转体,但在 Android 系统中它却代表一个 droplist;类似的例子还有 Button。

Android 的开发团队,不光要负责 java 代码的编写,还要处理各式各样的 xml 文件。

Jetpack Compose(Pre-Alpha!) 组合性

Jetpack Compose 是我们参考当下流行的一些有关用户界面的 Library 写了一个 Support Library 来帮助开发者写一些简单的开发者用户界面。

它是由一系列的 Jetpack UI widgets 所组成,用 Kotlin 写成,通过 Compose 写成的界面与用第三方 Library 写成的界面完全兼容。但目前还处于试验阶段,不要把 Compose 生成的界面放入你们的应用中。

Jetpack Compose 代码示范

用函数来表示 UI

用 Jetpack Compose 写 Activity 非常简单,只需要在 setContent 函数中直接把 Jetpack Compose 的函数调用即可。

使用基本的组合 UI 去制造复杂的组合 UI

用 ScrollingList 把 stories 里的每一层传到下一层。

在这个 StoryWidget 中,有一个带有 imageUri 的数据。我们可以写一个 asyncLoad 函数,等图片下载好以后再把它放到 imageUri 里面。

可以注意到,从 StoryWidget 到 TextWidget 中间隔了 Card、Column、Padding 和 Text 4层。

Top-down Data Flow

在 NewsFeed 函数中,从参数拿到 story,然后把每一个 story 里的数据传到下一层,好处在于在每一个 Widget 里它只会管自己从参数得到的数据,而且不需要从别处拿数据,确保了每一个 Widget 里的重用性,进而确保了 UI 的重用性。

假如用户在 Widget 上有后续的操作该如何处理呢? 由于 Kotlin 的特性,可以把回调的函数作为一个匿名的函数传到下一层,这样写起来的话,只需要调用传进来的匿名函数即可。

数据由顶至底一层一层往下传,事件则是一层一层往上传。

View Compatibility

只需要在函数上方加一个 @GenerateView 的标记,马上会变成 Compose。

再把 greeting_name 放到 GreetingView 里面,就直接用 findViewById 把 view 拿出来,与现在 Java 中调用 View 的方法一样。

若大家对这个库感兴趣,请访问: 相关网址

Jetpack CameraX

五年过去了,大多数开发者仍在使用 Camera 1 API。

适配性

CameraX 能支持 Android 5.0 以上的手机,这已经涵盖了市面上90%以上的设备。此外 CameraX 的底层实际上还是使用 Camera 2的,所以CameraX 在 Camera 2 的手机上运行得很好。

效果一致性

CameraX 能保证在不同设备上的效果一致。在 Google 总部有一个 CameraX test lab,拥有50到100台市面上的热门机型做测试,确保了在不同机型上面 CameraX 的运行没有问题。

使用方便

使用 CameraX 时只需管理拍照场景,而不需要管理相机的接口和硬件等。

目前的 Alpha 版包括了3个场景:预览、照片元数据分析以及简易拍照。

使用 CameraX,开发者不必纠结不同设备兼容性的问题。

Preview

创建场景需要先创建 Config。

预览的话则需要先创建预览的 Config。

在预览场景中,为了让数据显示在屏幕上,在预览中会有回调,给出 SurfaceTexture 的回调。开发者可以把它放到 GL renderer 上面。

最后需要将这个预览场景连接到 LifecycleOwner 上面。过去写 Camera 代码时,需要手动管理 Lifecycle;但是使用 Camera X后,只需要将 Lifecycle 和 CameraX 使用场景联系在一起,则 Lifecycle 将由 CameraX 进行管理。

Image Analysis

Image Capture

CaneraX Extebsions

在今年 IO 上,除了 CameraX Core 部分,我们还发布了 CameraX Extensions 部分。

我们已和手机厂商合作,将大光圈、夜景、HDR 和美颜这样的功能开放给第三方开发者。

若要实现以上功能,只需要如下两行代码:

下面是我们和三星合作在他们手机上采用 CameraX 后拍出来的图片效果对比图。

Recap

以上是今天我分享的所有内容,谢谢大家。

Android Q Labs 直播专题页面

Android Q Labs 开场演讲

Android Q 有哪些更新

Android Q 现代化您的应用

后台 Activity 启动的限制

Android Q 分区存储

Android Q 手势导航

Android Q 在折叠屏设备的适配

通用系统映像介绍

Google Play 商店政策

Android Q 地理位置权限变更

Android Q 深色主题

Android Q Labs 总结演讲