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 或稳定版更稳。