Android Studio Quail 1 Canary 5 发布,Compose 截图测试 + R8 混淆 mapping 问题解决

5 月 15 日,Google 发布了 Android Studio Quail 1 Canary 5

这次对应的 Android Gradle Plugin 是 9.3.0-alpha05

本次主要修了两个问题:Compose Preview Screenshot Testing 的 locale 解析,以及 R8/L8 的 mapping 输出。

先看版本号

Quail 1 Canary 5 仍然在 Canary 通道,适合放在单独环境验证,不适合直接替换团队主力 IDE。

如果只想验证 AGP,可以把插件版本固定到 9.3.0-alpha05

bash 复制代码
plugins {
    id("com.android.application") version "9.3.0-alpha05" apply false
    id("com.android.library") version "9.3.0-alpha05" apply false
}

预览版 Studio 和预览版 AGP 最好配套使用。

如果 Studio 版本和 AGP 预览版本不匹配,Sync 可能直接失败,或者出现一些只在 IDE 模型构建阶段暴露的问题。

这类版本的正确用法,是先跑真实工程的 Sync、构建、测试和发布产物检查。

Compose 截图测试修了 locale

第一条修复来自 Compose Preview Screenshot Testing。问题是:当 Preview 的 locale 使用 ar-rXB 这类字符串时,测试会失败。官方问题描述里提到,原因和大小写敏感的解析逻辑有关。

ar-rXB 不是普通语言环境,它是 Android 用来做伪本地化测试的一类 locale。它经常用于检查 RTL 布局、字符串拉伸、双向文本、数字和英文缩写混排等问题。

一个简化后的 Preview 可能长这样:

bash 复制代码
@Preview(
    name = "RTL pseudo locale",
    locale = "ar-rXB",
    showBackground = true
)
@Composable
fun PaymentCardPreview() {
    PaymentCard(
        title = "Total balance",
        amount = "$128.00"
    )
}

这里的重点不是 PaymentCard,而是 locale = "ar-rXB"

如果工具链解析 locale 时直接失败,测试还没走到截图对比阶段,结果就已经不可用了。

伪本地化不是翻译

很多团队会把本地化测试理解成翻译检查。伪本地化更偏 UI 压力测试。

英文文案短,换成更长的字符串后,按钮、Tab、卡片标题可能会被撑开。LTR 布局在 RTL 环境下,图标方向、列表顺序、导航层级可能会错。数字、英文缩写、阿拉伯语混排时,文本方向也可能和预期不一致。

这些问题最好在组件级别提前发现。

Compose Preview Screenshot Testing 的价值就在这里:把 Preview 变成可重复跑的截图输入。

如果一个组件有默认态、加载态、空态、错误态、长文案态、RTL 态,就可以把这些状态拆成不同 Preview,再交给截图测试验证。

这次修复不改变写法,但会减少 ar-rXB 这类边界场景带来的工具链噪音。

R8/L8 mapping 修复更影响发布

第二条修复是:启用 R8 或 L8 时,mapping 文件没有被正确输出。

这条对普通 debug 开发不显眼,但对 release 链路很关键。

R8 负责代码压缩、优化和混淆。L8 主要处理 desugaring 相关的库转换。

开启混淆后,线上崩溃堆栈通常会变成这样:

bash 复制代码
Fatal Exception: java.lang.NullPointerException
    at a.b.c.a(Unknown Source:17)
    at x.y.z.b(Unknown Source:42)

没有 mapping 文件,Crash 平台就无法把 a.b.c.a 还原成真实类名和方法名。

APK 或 AAB 能构建出来,不代表 release 链路完整。

mapping、native symbol、source info、baseline profile、测试报告,这些都属于发布产物的一部分。

升级后要检查产物

如果你已经在验证 AGP 9.3 alpha,升级到 9.3.0-alpha05 后,建议先跑一次真实 release variant。

重点不是只看 BUILD SUCCESSFUL,而是确认 mapping 文件是否生成。

常见路径是:

bash 复制代码
app/build/outputs/mapping/release/mapping.txt

有 flavor 时,路径通常会变成:

bash 复制代码
app/build/outputs/mapping/<variant>/mapping.txt

可以用最小命令做一次检查:

bash 复制代码
./gradlew :app:assembleRelease
find app/build/outputs/mapping -name mapping.txt

如果团队有多渠道包,不要只检查默认 release

真正要看的是线上发版使用的 variant。

CI 里可以加一条硬检查

mapping 文件缺失的问题,不应该等崩溃发生后才发现。

发布流水线里可以加一条硬检查:

bash 复制代码
MAPPING_FILE="app/build/outputs/mapping/release/mapping.txt"

if [ ! -s "$MAPPING_FILE" ]; then
  echo "Missing R8 mapping file: $MAPPING_FILE"
  exit 1
fi

这段脚本不解决所有问题,但能挡住最直接的产物缺失。

如果项目有多个 flavor,可以把 variant 名作为参数传进去:

bash 复制代码
VARIANT="googleRelease"
MAPPING_FILE="app/build/outputs/mapping/$VARIANT/mapping.txt"

AGP 升级时,很多风险不是 API 编译不过,而是构建任务、产物路径、上传脚本之间的假设变了。

这类问题只靠本地跑 debug 很难发现。

最后

Android Studio Quail 1 Canary 5 的信息量不大。但这次两个修复点都不是"看得见的新功能",而是测试和发布链路里的基础问题。

试用 AGP 9.3 alpha 时,可以把它放进工具链兼容性验证;生产项目继续等 Beta、RC 或稳定版更稳。

#AndroidStudio #AGP #JetpackCompose #Android开发 #R8

相关推荐
山上春1 小时前
MT-Workflow2:面向 Odoo 的可视化审批工作流引擎
android·workflow·odoo·bpmn
恋猫de小郭1 小时前
Flutter GenUI 0.9 和 A2UI 0.9 发布,全动动态 UI 支持,AI 在 App 里直出界面
android·flutter·ios
Carson带你学Android2 小时前
Flutter 官方 Skills:一条命令,让 AI 写出「专家级别」的代码
android
三少爷的鞋2 小时前
Android 架构系列之MVVM 和 MVI 算架构吗?
android·kotlin
白菜欣11 小时前
Linux — 进程控制
android·linux·运维
俩个逗号。。15 小时前
Gradle 踩过的坑
android
土星碎冰机18 小时前
ai自学笔记(3.安卓篇,制作app
android·笔记·ai
随遇丿而安19 小时前
专题:Glide / Coil / Fresco,不是三种写法,而是三套图片加载思路
android
只可远观20 小时前
Android 自动埋点(页面打开 / 关闭 + 点击事件)完整方案
android·kotlin