Compose Preview Screenshot Testingを実行したとき、Androidリソースのスタイルに実際の循環参照がないにもかかわらず「Cyclic style parent definitions」というエラーでレンダリングが停止することがあります。Googleは、ドットを含むスタイル名と明示的なparent=""の組み合わせを誤判定する既知問題として追跡し、Android Studio Rabbit 1 Canary 3/AGP 9.5.0-alpha03で修正しました。
代表的なエラーログ
Cyclic style parent definitions
Style: AppTheme.Component.Card
parent=""
実際のスタイル名やタスク名はプロジェクトごとに異なります。通常のアプリビルドではなく、Compose Preview Screenshot Testingのレンダラーで発生し、ドット区切りの名前と空の親指定が含まれる点が特徴です。
原因
Androidのスタイル名ではドットが暗黙の親子関係として解釈されることがあります。一方、parent=""は親を明示的に持たせない指定です。影響を受けるScreenshot Testingのレンダラーは、この組み合わせを正しく扱えず、存在しない循環関係として誤検出していました。
本当に親スタイルが相互参照している場合にも同じ診断が出ます。まずstyles.xmlのparentを確認し、A→B→Aのような実際の循環がないことを確認してください。
発生条件・対象バージョン
- Compose Preview Screenshot Testingを利用している
AppTheme.Component.Cardのようなドットを含むスタイル名がある- そのスタイルに
parent=""を明示している - 修正前のScreenshot Testing/Android Studioツールチェーンを利用している
公式に確認できる修正版はAndroid Studio Rabbit 1 Canary 3に同梱されたAGP 9.5.0-alpha03です。
推奨する解決手順
- プレビュー版を利用できる環境ではAndroid Studio Rabbit 1 Canary 3以降とAGP 9.5.0-alpha03以降へ更新します。
- Gradle Wrapper、JDK、Compose Screenshot Testing関連プラグインの互換性を確認します。
- テスト生成物を削除してスクリーンショットテストを再実行します。
plugins {
id("com.android.application") version "9.5.0-alpha03" apply false
}
./gradlew --stop
./gradlew clean
./gradlew validateDebugScreenshotTest --stacktrace
プレビュー版へ更新できない場合の代替策
一時的な回避策として、対象スタイルのドットをアンダースコアなどへ変更し、すべての参照も更新すると暗黙の親推論を避けられる場合があります。
<style name="AppTheme_Component_Card" parent="">
<item name="android:padding">8dp</item>
</style>
また、設計上問題がなければ明示的な空のparentを外す方法もあります。ただし、ドットによる暗黙の親が適用されて見た目が変わる可能性があるため、回避策は画面比較を伴って検証してください。
確認方法
- エラーログに示されたスタイルと親指定を確認します。
- 実際の循環参照がないことを確認します。
- 修正版への更新後、同じPreviewのScreenshot Testを再実行します。
- 基準画像と新しい画像を比較し、回避策でテーマ継承が変化していないことを確認します。
注意点
AGP 9.5.0-alpha03は公式修正を含みますがプレビュー版です。安定版が必要なCIでは、スタイル名変更などの回避策を限定的に使用し、修正済み安定版へ移行後に元の命名へ戻すかを判断してください。実在する循環参照を「誤検出」と決めつけないことも重要です。
まとめ
Compose Preview Screenshot Testingの「Cyclic style parent definitions」が、ドット付きスタイル名とparent=""でのみ発生する場合は既知の誤検出です。推奨策はAGP 9.5.0-alpha03以降への更新で、更新できない場合はスタイル名や親指定を一時的に調整し、見た目の差分を確認してください。
