关于 build-test-verify
为 Bitwarden Android 项目提供构建、测试、静态分析和代码库查找指引,面向参与开发与验证的工程师。内容涵盖构建变体、测试命令及测试报告定位。
主要功能
- 01Android 构建命令参考
- 02单元测试与报告指引
- 03detekt 与 Android Lint
- 04代码库组件查找
- 05版本与发布渠道说明
适用场景
- 01构建 debug 或 release 版本
- 02运行指定模块或测试类
- 03检查暂存文件的 detekt 结果
- 04查找 UI 组件与 ViewModel
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ bitwarden/ android --skill build-test-verify安装后在 Claude Code 中输入/build-test-verify确认已加载。
详细介绍
构建、测试与验证
环境设置
| 变量 | 必需 | 描述 |
|---|---|---|
GITHUB_TOKEN | 是(CI) | SDK 的 GitHub Packages 身份验证(read:packages 范围) |
| 构建变体 | - | standard(Play Store)、fdroid(无 Google 服务) |
| 构建类型 | - | debug、beta、release |
如果构建时无法解析 Bitwarden SDK,请检查 user.properties 或环境中的 GITHUB_TOKEN,并确认可以连接到 maven.pkg.github.com。
构建
# Debug builds
./gradlew app:assembleDebug
./gradlew authenticator:assembleDebug
# Release builds (requires signing keys)
./gradlew app:assembleStandardRelease
./gradlew app:bundleStandardRelease
# F-Droid builds
./gradlew app:assembleFdroidRelease
运行测试
重要:应用模块使用 standard 变体。务必使用 testStandardDebugUnitTest,而非 testDebugUnitTest。
重要:务必在首次运行时通过过滤器传递测试输出,以捕获失败信息。Gradle 默认会隐藏详细的失败输出,因此请使用 2>&1 | grep -E "FAILED|BUILD|expected:|actual:|AssertionError|failures" | head -30,无需再次运行即可查看通过/失败结果和断言详情。
# App module tests (correct flavor!)
./gradlew app:testStandardDebugUnitTest 2>&1 | grep -E "FAILED|BUILD|expected:|actual:|AssertionError|failures" | head -30
# Run specific test classes
./gradlew app:testStandardDebugUnitTest --tests "com.x8bit.bitwarden.SomeTest" 2>&1 | grep -E "FAILED|BUILD|expected:|actual:|AssertionError|failures" | head -30
# Run all unit tests across all modules
./gradlew test
# Individual shared modules (no flavor needed)
./gradlew :core:test
./gradlew :data:test
./gradlew :network:test
./gradlew :ui:test
# Authenticator module
./gradlew authenticator:testStandardDebugUnitTest
查看测试报告
如果需要 grep 未捕获的完整失败详情,请查看 HTML 测试报告:
# After a test run, open the report at:
# app/build/reports/tests/testStandardDebugUnitTest/index.html
# Or read individual failure XML:
find app/build/test-results -name "*.xml" -exec grep -l "failure" {} \;
测试结构
app/src/test/ # App unit tests
app/src/testFixtures/ # App test utilities
core/src/testFixtures/ # Core test utilities (FakeDispatcherManager)
data/src/testFixtures/ # Data test utilities (FakeSharedPreferences)
network/src/testFixtures/ # Network test utilities (BaseServiceTest)
ui/src/testFixtures/ # UI test utilities (BaseViewModelTest, BaseComposeTest)
测试速查
- 分发器控制:使用
:core:testFixtures中的FakeDispatcherManager - MockK:用于模拟的
mockk<T> { every { } returns },用于挂起函数的coEvery { } - Flow 测试:使用 Turbine 和
BaseViewModelTest中的stateEventFlow()助手 - 时间控制:注入
Clock,以进行确定性时间测试
Lint 与静态分析
重要:优先仅对修改过的文件运行 detekt——扫描整个项目既慢,在开发过程中也没有必要。项目支持 -Pprecommit=true 标志,可将 detekt 限制为已暂存文件。
重要:务必通过过滤器传递 detekt 输出,以便在首次运行时捕获错误。detekt 会向 stderr/stdout 输出违规详情,但 Gradle 可能会使其难以查看。使用下方的 grep 模式即可立即查看违规项。
# Detekt on staged files only (preferred during development)
git add -u && ./gradlew -Pprecommit=true detekt 2>&1 | grep -E "FAILED|BUILD|Line |Rule |Signature|detekt" | head -40
# Detekt on all files (full scan, use sparingly)
./gradlew detekt 2>&1 | grep -E "FAILED|BUILD|Line |Rule |Signature|detekt" | head -40
# Android Lint
./gradlew lint
# Full validation suite (detekt + lint + tests + coverage)
./fastlane check
-Pprecommit=true 的工作原理
根目录下的 build.gradle.kts 会配置 detekt 任务:设置此属性后,使用 git diff --name-only --cached,将分析范围限制为已暂存文件。这与项目的 pre-commit hook 使用相同机制。运行前请使用 git add 暂存更改。
代码库探索
# Find existing Bitwarden UI components
find ui/src/main/kotlin/com/bitwarden/ui/platform/components/ -name "Bitwarden*.kt" | sort
# Find all ViewModels
grep -rl "BaseViewModel<" app/src/main/kotlin/ --include="*.kt"
# Find all Navigation files with @Serializable routes
find app/src/main/kotlin/ -name "*Navigation.kt" | sort
# Find all Hilt modules
find app/src/main/kotlin/ -name "*Module.kt" -path "*/di/*" | sort
# Find all repository interfaces
find app/src/main/kotlin/ -name "*Repository.kt" -not -name "*Impl.kt" -path "*/repository/*" | sort
# Find encrypted disk source examples
grep -rl "EncryptedPreferences" app/src/main/kotlin/ --include="*.kt"
# Find Clock injection usage
grep -rl "private val clock: Clock" app/src/main/kotlin/ --include="*.kt"
# Search existing strings before adding new ones
grep -n "search_term" ui/src/main/res/values/strings.xml
部署与版本管理
版本位置:gradle/libs.versions.toml
appVersionCode = "1"
appVersionName = "2025.11.1"
格式:YEAR.MONTH.PATCH
发布渠道:
- Play Store:使用已签名 AAB 的 GitHub Actions 工作流
- F-Droid:使用 F-Droid 签名密钥的专用工作流
- Firebase App Distribution:Beta 测试