又到了一年一度的 I/O 大会,今年仍然是线上直播的形式,Day1:主要是一些主题演讲、产品发布,还有 Codelab。Day2:则是一些技术领域的 Session。
以下内容是我看完 Day1 内容后,梳理出的 Android 开发者相关的信息,主要包括:Android 13 更新、Android Studio 更新、Jetpack 更新。
一、Android 13 的重要变更
Android 13 有许多令人振奋的新特性,这里我只列了跟 Android 开发者相关的变更。
隔离 WiFi 与地理位置权限
在 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 |
<manifest ...>
<!-- 只在 Android 13 使用. -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<!-- 兼容Android 13 之前的系统. -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<application ...>
...
</application>
</manifest>
另外,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 更新
全新的Android Studio 版本:海豚、鳗鱼。
其中,海豚版本,已经进入 Beta 渠道了,而鳗鱼版本则是 Canary build,两者都提供了许多实用的特性,尤其是:对 Compose 的支持!
三、Jetpack 重要变更
首先,Jetpack 在 Android 生态当中的使用率进一步提升了,可以说 Jetpack 越来越受欢迎,地位也越来越重要了。
性能优化: JankStats
今年的 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
[Baseline Profiles是一个被编译进 APK 当中的文件,具体路径在:assets/dexopt/baseline.prof
。我们开发者可以将一些高优先级的方法打进去,方便 Android 虚拟机去做特定的优化。
当应用首次安装的时候,ART 虚拟机可以根据 baseline.prof 当中的方法,进行 AOT 编译优化,这样就可以让我们这些特殊关心的方法运行的更快。
通过 Baseline,我们开发者从某种程度可以跟 ART 虚拟机交流,去决定哪些方法可以进行 AOT 编译。可以想象,这一技术运用到冷启动优化当中是会带来不菲收益的。
以下是它的兼容性描述。
四、Jetpack Compose 更新
今年的 Jetpack Compose 更新,其实分为两个部分,一个是工具支持,也就是前面提到过的 Android Studio 更新,为我们开发者带来更好的开发体验。另外一个部分,则是API 层面的更新。
Lazy Layout
首先 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)
)
}
}
}
}