Android Studioでコードを記述していると、
Cannot resolve symbol
と表示され、クラス名や変数名、メソッド名などが赤字になることがあります。
このエラーは、
Android Studioがコード内に書かれているシンボルを正しく認識できない場合に発生します。
原因は、
単純なスペルミス、
import文の不足、
Gradle依存関係の不足、
クラスやメソッドの移動、
モジュール間依存関係、
リソース生成の失敗、
Gradle Syncの失敗などさまざまです。
この記事では、
Android Studioで
Cannot resolve symbol
が発生する主な原因と、
エラーになっているシンボルを確認して解決する方法を順番に解説します。
- Cannot resolve symbolとは
- 代表的なエラー表示
- まずエラーになっているシンボル名を確認する
- 原因1:名前のスペルが間違っている
- 原因2:import文が不足している
- 間違ったクラスをimportしていないか確認する
- 原因3:必要なGradle依存関係が追加されていない
- 依存関係を追加したらGradle Syncを実行する
- 原因4:ライブラリのバージョン変更でクラスやメソッドがなくなった
- 原因5:クラスを削除または別のパッケージへ移動した
- 原因6:変数やメソッドがスコープ外にある
- 原因7:アクセス修飾子によって参照できない
- 原因8:別モジュールのクラスを参照できていない
- 原因9:RがCannot resolve symbolになる
- 間違ったRをimportしていないか確認する
- 原因10:指定したリソースが存在しない
- 原因11:BuildConfigがCannot resolve symbolになる
- 原因12:AndroidXと古いSupport Libraryが混在している
- AndroidXの設定を確認する
- 原因13:RecyclerViewなどのAndroidXクラスが認識されない
- 原因14:生成コードが作成されていない
- 原因15:debugやreleaseなどのソースセットが異なる
- 原因16:Gradle Syncに失敗している
- Gradle Syncで解消するか確認する
- CleanやRebuildを実行する
- Android Studio上だけ赤字になる場合
- Cannot resolve symbolとUnresolved referenceの違い
- それでもCannot resolve symbolが直らない場合
- 大量のCannot resolve symbolが表示される場合
- まとめ
Cannot resolve symbolとは
Cannot resolve symbol
は、
Android Studioがコード内で指定されているクラス、
変数、
メソッド、
フィールドなどを解決できない場合に表示されるエラーです。
たとえば、
SampleClass
というクラスを使用しているにもかかわらず、
Android Studioがそのクラスを見つけられない場合があります。
SampleClass sample = new SampleClass();
このとき、
SampleClass
に対して次のようなエラーが表示されることがあります。
Cannot resolve symbol 'SampleClass'
ポイント:
Cannot resolve symbol
は、
Android Studioが「その名前が何を指しているのか分からない」状態を示します。
エラーになっている名前だけでなく、
import、
依存関係、
スコープ、
モジュール、
Gradleの状態なども確認する必要があります。
代表的なエラー表示
Cannot resolve symbol 'SampleClass'
メソッドの場合は、
次のように表示されることがあります。
Cannot resolve method 'sampleMethod'
Android開発では、
次のようなシンボルが認識されない場合もあります。
Cannot resolve symbol 'R'
Cannot resolve symbol 'BuildConfig'
Cannot resolve symbol 'RecyclerView'
Cannot resolve symbol 'AppCompatActivity'
どのシンボルが解決できないかによって、
確認すべき原因が異なります。
まずエラーになっているシンボル名を確認する
Cannot resolve symbol
が表示された場合は、
最初にエラーになっている名前を確認します。
Cannot resolve symbol 'SampleClass'
この場合は、
SampleClass
がどこで定義されているものなのか確認します。
自分で作成したクラスなのか、
Android SDKのクラスなのか、
AndroidXのクラスなのか、
外部ライブラリのクラスなのかによって、
調べる場所が変わります。
原因1:名前のスペルが間違っている
最も基本的な原因は、
クラス名、
変数名、
メソッド名などのスペルミスです。
たとえば、
実際のクラス名が
SampleClass
であるにもかかわらず、
次のように記述している場合です。
SampleClas sample = new SampleClas();
正しいクラス名へ修正します。
SampleClass sample = new SampleClass();
JavaやKotlinでは大文字と小文字も区別されるため、
名前が完全に一致しているか確認します。
原因2:import文が不足している
使用するクラスが別のパッケージに存在している場合、
必要なimport文が追加されていないことで
Cannot resolve symbol
になることがあります。
たとえば、
Intent
を使用する場合は、
次のようなimportが必要です。
import android.content.Intent;
Android Studioでは、
エラーになっているクラス名にカーソルを合わせたり、
クイックフィックスを利用したりすると、
import候補が表示される場合があります。
間違ったクラスをimportしていないか確認する
import文が存在していても、
意図したものとは別の同名クラスをimportしている場合があります。
特に複数のライブラリに同じ名前のクラスが存在する場合は、
import文のパッケージ名まで確認します。
import com.example.library.SampleClass;
使用したいクラスが別のパッケージに存在する場合は、
正しいimportへ変更します。
原因3:必要なGradle依存関係が追加されていない
外部ライブラリやAndroidXのクラスを使用している場合、
必要なGradle依存関係が追加されていないと
Cannot resolve symbol
が発生することがあります。
たとえば、
あるライブラリのクラスを使用する場合は、
モジュールの
build.gradle
または
build.gradle.kts
に必要な依存関係を追加します。
dependencies {
implementation("com.example:sample-library:VERSION")
}
VERSION
には、
使用するライブラリのバージョンを指定します。
エラーになっているクラスがどのライブラリに含まれているか確認し、
必要な依存関係が追加されているか確認します。
依存関係を追加したらGradle Syncを実行する
build.gradle
や
build.gradle.kts
を変更した場合は、
Gradle Syncを実行します。
依存関係を記述していても、
Gradleの同期が正常に完了していなければ、
Android Studioがクラスを認識できないことがあります。
Sync時に別のエラーが表示されている場合は、
そのエラーを先に修正します。
原因4:ライブラリのバージョン変更でクラスやメソッドがなくなった
ライブラリを更新したあとに
Cannot resolve symbol
が発生した場合は、
使用していたクラスやメソッドが新しいバージョンで変更、
移動、
または削除された可能性があります。
古いバージョンでは利用できたクラスが、
新しいバージョンでは別のパッケージへ移動している場合もあります。
使用しているライブラリの公式ドキュメントや変更履歴を確認し、
現在のバージョンで利用できるクラスやメソッドへ修正します。
原因5:クラスを削除または別のパッケージへ移動した
リファクタリングなどでクラスを削除した場合や、
別のパッケージへ移動した場合にも
Cannot resolve symbol
が発生することがあります。
以前のパッケージを参照するimportが残っていないか確認します。
import com.example.old.SampleClass;
クラスを移動した場合は、
現在のパッケージに合わせてimportを修正します。
原因6:変数やメソッドがスコープ外にある
変数やメソッドが存在していても、
現在の位置からアクセスできない場合は、
シンボルを解決できないことがあります。
たとえば、
メソッド内で定義したローカル変数を、
別のメソッドから使用しようとしている場合です。
void sample() {
String message = "Hello";
}
void anotherSample() {
System.out.println(message);
}
この例では、
message
は
sample()
内のローカル変数なので、
anotherSample()
から参照できません。
必要に応じて、
参照可能な範囲へ変数やメソッドを移動します。
原因7:アクセス修飾子によって参照できない
クラス、
メソッド、
フィールドなどのアクセス修飾子によって、
別のクラスやパッケージから参照できない場合があります。
たとえば、
対象が
private
として定義されている場合は、
定義されたクラスの外部から直接参照できません。
private String message = "Hello";
必要なアクセス範囲になっているか確認し、
クラス設計に合わせて修正します。
原因8:別モジュールのクラスを参照できていない
複数モジュールで構成されたAndroidプロジェクトでは、
別モジュールのクラスを使用するために、
モジュール間の依存関係が必要です。
たとえば、
app
モジュールから
samplelibrary
モジュールを利用する場合は、
次のような依存関係を設定します。
dependencies {
implementation(project(":samplelibrary"))
}
モジュールがプロジェクト内に存在していても、
app
から参照するための依存関係が設定されていなければ、
そのモジュールのクラスを使用できません。
原因9:RがCannot resolve symbolになる
Androidアプリでは、
次のようなエラーが表示されることがあります。
Cannot resolve symbol 'R'
R
は、
Androidアプリのリソースを参照するために生成されるクラスです。
R
が認識されない場合は、
JavaやKotlinのコード自体ではなく、
XMLリソースに別のエラーが発生している可能性があります。
res
フォルダ内のXMLにエラーがないか、
リソース名が正しいか、
Build Outputに別のリソースエラーが表示されていないか確認します。
間違ったRをimportしていないか確認する
R
に関するエラーでは、
意図していない
R
クラスをimportしていないかも確認します。
import部分を確認し、
自分のアプリとは異なるパッケージの
R
が追加されていないか確認します。
不要なimportがある場合は削除し、
アプリの正しい
R
を参照するようにします。
原因10:指定したリソースが存在しない
R
自体は認識されていても、
特定のIDやレイアウト名だけが認識されない場合があります。
R.id.sampleButton
この場合は、
XML内に
sampleButton
が実際に定義されているか確認します。
android:id="@+id/sampleButton"
リソース名のスペルや、
参照しているレイアウトファイルなども確認します。
原因11:BuildConfigがCannot resolve symbolになる
Androidプロジェクトでは、
次のようなエラーが発生する場合があります。
Cannot resolve symbol 'BuildConfig'
BuildConfig
は、
Androidのビルド処理によって生成されるクラスです。
使用しているモジュールやAndroid Gradle Pluginの設定によっては、
BuildConfig
の生成設定を確認する必要があります。
必要な場合は、
Androidモジュールの
buildFeatures
を確認します。
android {
buildFeatures {
buildConfig = true
}
}
また、
別モジュールの
BuildConfig
を誤って参照していないかも確認します。
原因12:AndroidXと古いSupport Libraryが混在している
古いAndroidプロジェクトでは、
AndroidXと旧Support Libraryが混在していることで、
クラスを正しく解決できない場合があります。
たとえば、
古いSupport Libraryのクラスを使用しているコードが残っていないか確認します。
import android.support.v7.app.AppCompatActivity;
AndroidXへ移行している場合は、
対応するAndroidX側のクラスを使用しているか確認します。
import androidx.appcompat.app.AppCompatActivity;
AndroidXの設定を確認する
AndroidXへ移行したプロジェクトでは、
gradle.properties
も確認します。
android.useAndroidX=true
android.enableJetifier=true
android.useAndroidX=true
は、
AndroidXを使用する設定です。
android.enableJetifier=true
は、
古いSupport Libraryを参照する一部の依存関係を
AndroidX向けに変換するために使用されてきた設定です。
すべての依存ライブラリがAndroidXへ対応している場合は、
使用しているAndroid Gradle Pluginやライブラリの構成に合わせて設定を確認します。
原因13:RecyclerViewなどのAndroidXクラスが認識されない
たとえば、
次のようなエラーが表示される場合があります。
Cannot resolve symbol 'RecyclerView'
この場合は、
RecyclerViewに必要なAndroidXライブラリが依存関係へ追加されているか確認します。
また、
正しいパッケージをimportしているか確認します。
import androidx.recyclerview.widget.RecyclerView;
原因14:生成コードが作成されていない
ライブラリやビルドツールが自動生成するクラスを参照している場合、
コード生成が失敗していると
Cannot resolve symbol
が表示されることがあります。
この場合は、
Build Outputを確認し、
Cannot resolve symbol
より前にコード生成処理やGradleタスクのエラーが発生していないか確認します。
Cannot resolve symbol
が原因ではなく、
それより前に発生したビルドエラーの結果として
シンボルが生成されていない場合があります。
Build Outputでは、
最初に発生したエラーから確認することが重要です。
原因15:debugやreleaseなどのソースセットが異なる
Androidプロジェクトでは、
main
以外に
debug、
release、
Product Flavorなどのソースセットを使用できます。
src/main/
src/debug/
src/release/
あるクラスが
debug
にだけ存在する場合、
release
ビルドからそのクラスを参照することはできません。
特定のビルドバリアントだけで
Cannot resolve symbol
が発生する場合は、
クラスが配置されているソースセットを確認します。
原因16:Gradle Syncに失敗している
Android Studioが依存関係やプロジェクト構成を正常に読み込めていない場合、
多数のクラスが
Cannot resolve symbol
になることがあります。
Gradle Syncに失敗している場合は、
Sync時に表示されるエラーを確認します。
リポジトリ、
ライブラリのバージョン、
Gradle設定などの問題を修正し、
Gradle Syncが正常に完了する状態にします。
Gradle Syncで解消するか確認する
依存関係を追加したり、
Gradle設定を変更した直後に
Cannot resolve symbol
が表示された場合は、
Gradle Syncを実行します。
Syncが正常に完了したあと、
Android Studioがシンボルを認識するようになったか確認します。
CleanやRebuildを実行する
コードや依存関係を修正してもエラーが残っている場合は、
古いビルド結果や中間ファイルが影響している可能性があります。
Android Studioの
Build
メニューから、
使用しているAndroid Studioのバージョンで利用可能な
CleanやRebuildに相当する処理を実行します。
その後、
再度ビルドしてエラーが解消されたか確認します。
Android Studio上だけ赤字になる場合
Gradleによる実際のビルドは成功しているにもかかわらず、
Android Studioのエディタ上だけ
Cannot resolve symbol
と表示される場合があります。
この場合は、
IDEが保持しているプロジェクト情報とGradle側の状態が一致していない可能性があります。
まずGradle Syncを実行し、
プロジェクトを再読み込みして状態が更新されるか確認します。
実際のビルドも失敗している場合は、
IDE表示だけの問題ではないため、
Build Outputに表示されているコンパイルエラーを確認します。
Cannot resolve symbolとUnresolved referenceの違い
Cannot resolve symbol
と
Unresolved reference
は、
表示される文言は異なりますが、
どちらもコード内の名前を正しく解決できない場合に発生します。
Cannot resolve symbol
はJavaコードやAndroid Studioのエディタで見られることがあり、
Kotlinでは
Unresolved reference
と表示されることがあります。
どちらの場合も、
スペル、
import、
依存関係、
スコープ、
モジュール構成などを確認する点は共通しています。
それでもCannot resolve symbolが直らない場合
原因が分からない場合は、
エラーになっているシンボルを基準に順番に確認します。
- シンボル名のスペルが正しいか確認します。
- 大文字と小文字が正しいか確認します。
- 必要なimport文が追加されているか確認します。
- 間違った同名クラスをimportしていないか確認します。
- 必要なGradle依存関係が追加されているか確認します。
- Gradle Syncが正常に完了しているか確認します。
- 使用中のライブラリのバージョンで対象クラスやメソッドが存在するか確認します。
- クラスやメソッドを別パッケージへ移動していないか確認します。
- 変数やメソッドが現在のスコープから参照可能か確認します。
- アクセス修飾子によって参照できなくなっていないか確認します。
- 別モジュールを使用する場合はモジュール間依存関係を確認します。
Rの場合はXMLやリソースエラーを確認します。BuildConfigの場合は生成設定や参照モジュールを確認します。- AndroidXと旧Support Libraryが混在していないか確認します。
- 特定のビルドバリアントだけで発生する場合はソースセットを確認します。
- Build Outputで先に発生している別のエラーがないか確認します。
- 必要に応じてCleanやRebuildを実行します。
大量のCannot resolve symbolが表示される場合
プロジェクト内で多数の
Cannot resolve symbol
が同時に表示される場合があります。
この場合、
すべてのシンボルを個別に修正する必要があるとは限りません。
たとえば、
Gradle Syncが失敗して外部ライブラリを読み込めていない場合は、
そのライブラリに含まれる多数のクラスが一度に認識されなくなります。
また、
リソース生成やコード生成に失敗している場合も、
関連する多数のシンボルがまとめてエラーになることがあります。
大量の
Cannot resolve symbol
が表示された場合は、
1件ずつ修正する前に、
Gradle Syncの失敗、
依存関係の読み込み失敗、
リソースエラー、
コード生成エラーなど、
共通する原因がないか確認することが重要です。
まとめ
Android Studioの
Cannot resolve symbol
は、
クラス、
変数、
メソッド、
フィールドなど、
コード内で指定された名前をAndroid Studioが正しく認識できない場合に発生します。
主な原因として、
スペルミス、
import不足、
Gradle依存関係の不足、
ライブラリのAPI変更、
スコープやアクセス範囲の問題、
モジュール間依存関係、
AndroidXと旧Support Libraryの混在、
ソースセットの違いなどがあります。
Rや
BuildConfig
などの生成されるクラスが認識されない場合は、
そのクラス自体ではなく、
XMLリソースやビルド設定などに先行するエラーがないか確認します。
多数の
Cannot resolve symbol
が同時に発生している場合は、
Gradle Syncや依存関係の問題など、
共通する原因を先に確認します。
Cannot resolve symbol
を解決するときは、
「そのシンボルは本来どこで定義されているのか」を確認することが重要です。
定義場所が分かれば、
import、
依存関係、
スコープ、
モジュール、
ビルド設定など、
問題がある場所を絞り込むことができます。
