PC パソコン

Android Studio「Unable to get provider」でconnectedDebugAndroidTestが失敗する原因と解決方法

./gradlew :app:connectedDebugAndroidTestで「Unable to get provider」とClassNotFoundExceptionが出て、ProviderがDynamic Feature Moduleにある場合はAGPの既知問題が該当する可能性があります。GoogleはIssue #257765153をAGP 9.4.0-alpha02で修正済みとしており、安定版AGP 9.4.0以降への更新が推奨対応です。

代表的なエラー

java.lang.RuntimeException:
Unable to get provider com.example.feature.MyProvider:
java.lang.ClassNotFoundException:
Didn't find class "com.example.feature.MyProvider"

インストルメンテーション開始時、AndroidはMerged Manifest内のContentProviderを生成します。宣言は存在しても、Dynamic Featureのコードがテスト時のインストール構成に正しく含まれなければ、Providerクラスをロードできず停止します。

適用条件

  • Dynamic Feature Moduleを利用している
  • ContentProviderがFeature内にある
  • :app:connectedDebugAndroidTestで失敗する
  • 原因がProviderのClassNotFoundExceptionである
  • AGP 9.4.0-alpha02より前の影響版を使っている

android:nameやnamespaceの誤りでも同じ例外が出ます。例外の完全修飾クラス名が実際のProviderと一致するか先に確認してください。

推奨する解決手順

1. Merged Manifestを確認する

Providerの所属モジュールと最終的なクラス名、宣言元をAndroid StudioのMerged Manifestで確認します。

<provider
    android:name="com.example.feature.MyProvider"
    android:authorities="${applicationId}.feature.provider"
    android:exported="false" />

2. AGP 9.4.0以降へ更新する

AGP 9.4リリースノートでは9.4.0-alpha02の修正項目として掲載され、安定版9.4.0にも含まれています。現在はalpha版ではなく安定版9.4.0以降を選びます。

plugins {
    id("com.android.application") version "9.4.0" apply false
    id("com.android.dynamic-feature") version "9.4.0" apply false
}

AGP 9.4.0の公式互換条件はGradle 9.6.0、SDK Build Tools 36.0.0、JDK 17です。applicationとdynamic-featureのAGP版を揃えてください。

3. クリーンな状態で再テストする

./gradlew --stop
./gradlew clean
./gradlew :app:connectedDebugAndroidTest --stacktrace

Windowsではgradlew.batを使います。端末に古いアプリやテストAPKが残る場合は対象パッケージをアンインストールして再実行します。

代替策

  • 設計上可能なら起動時に必須のProviderをbase appへ一時移動する
  • Providerを含むFeatureが端末へ確実にインストールされる構成で検証する
  • 影響を受けないAGPへ戻しCIを固定する
  • Providerを必要としないテストを分離する

Featureをbaseへ移すと配信サイズとオンデマンド配信設計が変わります。更新までの限定的な回避策です。

更新後も失敗する場合

  • ProviderがDebugで利用できるSource Setにあるか
  • Dynamic Featureとbase appの関係が正しいか
  • base APKと必要なsplitが同時にインストールされているか
  • androidTest用Manifestが宣言を上書きしていないか

確認方法

  1. connectedDebugAndroidTestがテスト実行まで進む
  2. ProviderのClassNotFoundExceptionが消える
  3. テスト結果HTML/XMLが生成される
  4. クリーンなEmulatorでも成功する

注意点

ManifestからProviderを削除するだけでは本番機能を壊す可能性があります。起動時必須のProviderをDynamic Featureへ置く設計が配信条件と整合するかも確認してください。

まとめ

Dynamic Feature内のProviderがconnectedDebugAndroidTestで見つからない問題はAGP 9.4.0-alpha02で修正され、安定版9.4.0に含まれています。Manifestとクラス名を確認し、AGP・Gradle・JDKを互換条件に合わせて更新して、クリーンな端末で検証します。

参考資料