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

相关推荐
千里马学框架3 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台3 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone3 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc3 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo3 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077003 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼3 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone3 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen3 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone3 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui