I/O 前沿 | Android 更新一览(Day1)

大家好,我是朱涛。

又到了一年一度的 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 不再是问题。

扫描二维码关注公众号,回复: 14131798 查看本文章

更细颗粒度的存储权限

对于存储权限,想必大家都对 READ_EXTERNAL_STORAGEWRITE_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 将会是一个不错的选择。

其他变更

以下是一些对开发者不那么重要的变更,大家感兴趣的可以点击链接看详细内容。

二、Android Studio 更新

全新的Android Studio 版本:海豚、鳗鱼。

其中,海豚版本,已经进入 Beta 渠道了,而鳗鱼版本则是 Canary build,两者都提供了许多实用的特性,尤其是:对 Compose 的支持

三、Jetpack 重要变更

首先,Jetpack 在 Android 生态当中的使用率进一步提升了,可以说 Jetpack 越来越受欢迎,地位也越来越重要了。

性能优化: JankStats

今年的 I/O 大会,Jetpack 格外关注性能优化,它同时推出了两个新的库:JankStatsBaseline 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 编译。可以想象,这一技术运用到冷启动优化当中是会带来不菲收益的。

以下是它的兼容性描述。

作者备注:另外,Baseline 可以跟 Macrobenchmark 搭配使用,更多内容请阅读Macrobenchmark 官方文档Baseline Profiles 的官方文档

四、Jetpack Compose 更新

今年的 Jetpack Compose 更新,其实分为两个部分,一个是工具支持,也就是前面提到过的 Android Studio 更新,为我们开发者带来更好的开发体验。另外一个部分,则是API 层面的更新。

Lazy Layout

首先 Compose 在 1.2 版本中进一步优化了它的Lazy Layout的性能,包括 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)
                )
            }
        }
    }
}
复制代码

其他更新

以上就是 Google I/O 大会 Day1 当中,咱们 Android 开发者需要重点关注的内容,如果你想了解更全面的内容,可以浏览 Android Developer 官方 YouTube 频道的回放。

说明

本文所有图片内容,均来自 Google 官方文档和 I/O 大会直播截图。

结尾

最近我会继续更新一些 I/O 大会中,Android 领域的技术解读文章和视频,欢迎关注持续关注~

Day1.003.jpeg

猜你喜欢

转载自juejin.im/post/7096697731338469406