又到了一年一度的 I/O 大会,今年仍然是线上直播的形式,Day1:主要是一些主题演讲、产品发布,还有 Codelab。Day2:则是一些技术领域的 Session。
以下内容是我看完 Day1 内容后,梳理出的 Android 开发者相关的信息,主要包括:Android 13 更新、Android Studio 更新、Jetpack 更新。
Android 13 有许多令人振奋的新特性,这里我只列了跟 Android 开发者相关的变更。
在 Android13 之前,我们为了获取用户在室内的精确位置,地图 SDK 往往需要获取 WiFi 相关的权限。这一行为对于开发者而言是能理解的,但用户却会觉得十分可疑。
因此,Android 13 引入了一个新的权限:
NEARBY_WIFI_DEVICES
详细的介绍大家可以看这个文档。
作者备注:这真的很贴心!其实,Android12 也有类似的行为变更,Android 12 隔离了蓝牙与地理位置权限。用户不必为了地理位置权限而开放蓝牙权限了。
在 Android 13 当中,用户可以通过前台服务管理器(Foreground Services (FGS) Task Manager),管理当前系统运行的所有前台服务。
作者备注:从前,对于没有通知权限的应用,它的前台服务可能无法展示在通知栏,用户自然也就无法注意到。这一点在 Android 13 不再是问题。
对于存储权限,想必大家都对 READ_EXTERNAL_STORAGE
、WRITE_EXTERNAL_STORAGE
十分熟悉。但是,在 Android 13 当中,对读取权限被划分成了更加细的颗粒度。
文件类型 | 对应权限 |
---|---|
图片 | READ_MEDIA_IMAGES |
视频 | READ_MEDIA_VIDEO |
音频 | READ_MEDIA_AUDIO |
...
另外,Android 13 还提供了类似 iOS 的“系统级别的”图片选择器。如果你只需要访问图片与视频,Photo Picker 将会是一个不错的选择。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-loiKBGy5-1652363714314)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9551f0d6aca84c49ba4ce80f0c407aa6~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image)]
以下是一些对开发者不那么重要的变更,大家感兴趣的可以点击链接看详细内容。
阻止不匹配的 Intent-filter
电量管理变更
音乐播放体验优化
全新的Android Studio 版本:海豚、鳗鱼。
其中,海豚版本,已经进入 Beta 渠道了,而鳗鱼版本则是 Canary build,两者都提供了许多实用的特性,尤其是:对 Compose 的支持!
首先,Jetpack 在 Android 生态当中的使用率进一步提升了,可以说 Jetpack 越来越受欢迎,地位也越来越重要了。
今年的 I/O 大会,Jetpack 格外关注性能优化,它同时推出了两个新的库:JankStats、Baseline Profiles,而且,也更新了去年新推出的 Macrobenchmark。
JankStats,顾名思义,就是为了监测掉帧、卡顿的。
大致用法如下:
class JankLoggingActivity : AppCompatActivity() {
private lateinit var jankStats: JankStats
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ...
// metrics state holder can be retrieved regardless of JankStats initialization
val metricsStateHolder = PerformanceMetricsState.getForHierarchy(binding.root)
// initialize JankStats for current window
jankStats = JankStats.createAndTrack(
window,
Dispatchers.Default.asExecutor(),
jankFrameListener,
)
// add activity name as state
metricsStateHolder.state?.addState("Activity", javaClass.simpleName)
// ...
}
override fun onResume() {
super.onResume()
jankStats.isTrackingEnabled = true
}
override fun onPause() {
super.onPause()
jankStats.isTrackingEnabled = false
}
}
[Baseline Profiles是一个被编译进 APK 当中的文件,具体路径在:assets/dexopt/baseline.prof
。我们开发者可以将一些高优先级的方法打进去,方便 Android 虚拟机去做特定的优化。
当应用首次安装的时候,ART 虚拟机可以根据 baseline.prof 当中的方法,进行 AOT 编译优化,这样就可以让我们这些特殊关心的方法运行的更快。
通过 Baseline,我们开发者从某种程度可以跟 ART 虚拟机交流,去决定哪些方法可以进行 AOT 编译。可以想象,这一技术运用到冷启动优化当中是会带来不菲收益的。
以下是它的兼容性描述。
今年的 Jetpack Compose 更新,其实分为两个部分,一个是工具支持,也就是前面提到过的 Android Studio 更新,为我们开发者带来更好的开发体验。另外一个部分,则是API 层面的更新。
首先 Compose 在 1.2 版本中进一步优化了它的Lazy Layou的性能,包括 LazyColumn、LazyRow、LazyVerticalGrid(实验性)。
另外,则是进一步完善了 Compose 当中的嵌套滑动。
实现 Compose 的嵌套滑动,在大部分情况下,是可以自动实现的。比如说这个例子:
val gradient = Brush.verticalGradient(0f to Color.Gray, 1000f to Color.White)
Box(
modifier = Modifier
.background(Color.LightGray)
.verticalScroll(rememberScrollState())
.padding(32.dp)
) {
Column {
repeat(6) {
Box(
modifier = Modifier
.height(128.dp)
.verticalScroll(rememberScrollState())
) {
Text(
"Scroll here",
modifier = Modifier
.border(12.dp, Color.DarkGray)
.background(brush = gradient)
.padding(24.dp)
.height(150.dp)
)
}
}
}
}