Android StudioでJavaやKotlinのコードを記述していると、「Package R does not exist」というエラーが表示されることがあります。
このエラーは、Androidプロジェクトで自動生成されるRクラスをコンパイラが正しく参照できない場合などに発生します。
Rクラスには、レイアウト、文字列、画像、色、IDなど、resフォルダ内のリソースへアクセスするための情報がまとめられています。
そのため、「Package R does not exist」が表示された場合は、コード上のRの記述だけではなく、XMLファイルのエラー、リソース名、import、packageやnamespace、Gradle設定、ビルドエラーなども確認する必要があります。
この記事では、Android Studioで「Package R does not exist」が表示される主な原因と、基本的な解決方法を紹介します。
- 「Package R does not exist」とは
- 原因1:XMLファイルに構文エラーがある
- 原因2:strings.xmlやthemes.xmlなどのリソースXMLにエラーがある
- 原因3:リソースファイル名が命名規則に違反している
- 原因4:存在しないリソースを参照している
- 原因5:誤ったRクラスをimportしている
- 原因6:package宣言が間違っている
- 原因7:namespaceの設定に問題がある
- 原因8:Rを完全修飾名で間違って参照している
- 原因9:Gradle Syncが正常に完了していない
- 原因10:別のビルドエラーによってRクラスが生成されていない
- 原因11:マルチモジュール構成で別モジュールのRを参照している
- 原因12:Android Studioのインデックスやキャッシュに問題がある
- まずresフォルダ内のエラーを確認する
- package・namespace・importを確認する
- Gradle Syncを実行する
- プロジェクトを再ビルドする
- Clean Projectを実行する
- Package R does not existが表示されたときの確認ポイント
- まとめ
「Package R does not exist」とは
Androidアプリでは、resフォルダ内に配置されたリソースをコードから参照するためにRクラスが使用されます。
例えば、Javaでレイアウトを指定する場合は次のように記述します。
setContentView(R.layout.activity_main);
また、ViewのIDを参照する場合は次のように記述します。
Button button = findViewById(R.id.button);
コンパイラがこのRを正しく参照できない場合、次のようなエラーが表示されることがあります。
Package R does not exist
Rクラスは通常、Androidプロジェクト内のリソース情報をもとにビルド時に自動生成されます。
そのため、リソースのコンパイルに失敗していたり、参照するRクラスのパッケージが間違っていたりすると、このエラーにつながることがあります。
原因1:XMLファイルに構文エラーがある
「Package R does not exist」の代表的な原因の一つが、resフォルダ内にあるXMLファイルの構文エラーです。
例えば、レイアウトXMLのタグを正しく閉じていない場合があります。
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello"
XMLの構文が正しくないと、Androidのリソース処理が失敗し、Rクラスの生成に影響することがあります。
タグを正しく閉じます。
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello" />
エラーが突然表示された場合は、直前に編集したXMLファイルに問題がないか確認します。
原因2:strings.xmlやthemes.xmlなどのリソースXMLにエラーがある
レイアウトファイルだけでなく、strings.xml、colors.xml、themes.xmlなどに記述ミスがある場合も、Rクラスの生成に影響することがあります。
例えば、strings.xmlの閉じタグが不足している場合です。
<string name="app_name">My App
正しくは次のように閉じタグを記述します。
<string name="app_name">My App</string>
一つのリソースXMLにエラーがあるだけでも、複数のJavaやKotlinファイルでR関連のエラーが表示されることがあります。
原因3:リソースファイル名が命名規則に違反している
resフォルダ内のリソースファイル名には、Androidで使用できる文字に制限があります。
例えば、次のようなファイル名は問題になる場合があります。
MyImage.png
button-icon.png
Androidのリソース名では、基本的に小文字の英字、数字、アンダースコアを使用します。
例えば次のように変更します。
my_image.png
button_icon.png
不正なリソース名が存在すると、リソースのコンパイルに失敗し、その結果としてRクラスが正常に生成されない場合があります。
原因4:存在しないリソースを参照している
コード内で、実際には存在しないレイアウトやIDなどを参照している場合があります。
setContentView(R.layout.activity_home);
このとき、res/layoutフォルダ内にactivity_home.xmlが存在しなければ、そのリソースを参照することはできません。
実際に存在するリソース名へ修正します。
setContentView(R.layout.activity_main);
ファイル名やIDを変更した直後にエラーが発生した場合は、古いリソース名がコード内に残っていないか確認します。
原因5:誤ったRクラスをimportしている
ソースコードの上部で、意図しないRクラスをimportしている場合があります。
特に次のようなimportには注意します。
import android.R;
android.RはAndroidシステム側のリソースを参照するためのクラスであり、自分のアプリのRクラスとは異なります。
自分のアプリのリソースを使用する場合は、誤ったimportを削除します。
// import android.R; を削除する
必要に応じて、アプリ側の正しいRクラスをimportします。
import com.example.myapp.R;
Android Studioの自動importによって別のRクラスが追加される場合もあるため、R関連のエラーが発生したときはimport文を確認します。
原因6:package宣言が間違っている
ソースファイルの先頭に記述されているpackage宣言が、現在のプロジェクト構成と合っていない場合があります。
例えば、次のようなpackage宣言があるとします。
package com.example.oldapp;
プロジェクトの構成を変更しているにもかかわらず、古いパッケージ名が残っている場合は、正しいRクラスを参照できないことがあります。
ソースファイルのpackage宣言と、現在のプロジェクト構成を確認します。
原因7:namespaceの設定に問題がある
現在のAndroidプロジェクトでは、モジュールのGradle設定にあるnamespaceによって、生成されるRクラスの名前空間が決まります。
例えば、build.gradle.ktsで次のように設定されているとします。
android {
namespace = "com.example.myapp"
}
通常、このnamespaceに対応するRクラスが生成されます。
namespaceを変更した後に「Package R does not exist」が発生した場合は、importやpackage宣言が古い設定のままになっていないか確認します。
原因8:Rを完全修飾名で間違って参照している
Rクラスを完全修飾名で記述している場合、パッケージ名が間違っていると参照できません。
com.example.oldapp.R.layout.activity_main
実際のRクラスがcom.example.myappに生成されている場合は、正しいパッケージ名へ修正します。
com.example.myapp.R.layout.activity_main
パッケージ名やnamespaceを変更した後は、古い完全修飾名が残っていないか確認します。
原因9:Gradle Syncが正常に完了していない
Gradleの設定を変更した後に同期が正常に完了していないと、Android Studioがプロジェクト構成や生成コードを正しく認識できない場合があります。
依存関係、Android Gradle Plugin、SDK、namespaceなどを変更した後に発生することがあります。
Gradle Syncを実行し、同期中に別のエラーが発生していないか確認します。
Gradle Syncが失敗している場合は、「Package R does not exist」だけを修正しようとするのではなく、Sync時に最初に表示されるエラーを先に解決します。
原因10:別のビルドエラーによってRクラスが生成されていない
Rクラスはビルド処理の中で生成されるため、プロジェクト内に別のビルドエラーが存在すると正常に生成されない場合があります。
そのため、「Package R does not exist」が表示されていても、実際の原因は別のXMLファイルやGradle設定に存在することがあります。
Android StudioのBuildウィンドウを確認し、最初に発生しているエラーから順番に修正します。
原因11:マルチモジュール構成で別モジュールのRを参照している
複数のモジュールを使用するAndroidプロジェクトでは、各モジュールに対応するRクラスが生成されます。
リソースが存在するモジュールとコードが存在するモジュールが異なる場合は、依存関係やimportが正しく設定されている必要があります。
マルチモジュール構成で「Package R does not exist」が発生した場合は、現在参照しているRがどのモジュールのものなのか確認します。
原因12:Android Studioのインデックスやキャッシュに問題がある
コードやリソースに問題がなく、ビルドも正常に完了しているにもかかわらず、Android Studio上でR関連のエラーが残る場合があります。
この場合は、Android Studioのインデックスやキャッシュの状態が影響している可能性があります。
Android Studioを再起動したり、必要に応じてキャッシュの再構築を行ったりすることで改善する場合があります。
キャッシュの再構築は、XMLの構文エラーやGradle設定の問題を修正する方法ではありません。まずプロジェクト内に実際のビルドエラーがないことを確認してから試します。
まずresフォルダ内のエラーを確認する
「Package R does not exist」が表示された場合は、まずresフォルダ内のファイルにエラーがないか確認します。
特に、直前に次のようなファイルを編集していないか確認します。
activity_main.xmlなどのレイアウトファイルstrings.xmlcolors.xmlthemes.xml- DrawableのXMLファイル
- MenuのXMLファイル
- Navigation関連のXMLファイル
これらのファイルに一つでもエラーがあると、Rクラスの生成に影響する場合があります。
package・namespace・importを確認する
XMLやリソースに問題がない場合は、package、namespace、importの関係を確認します。
特に、アプリのパッケージ構成を変更した直後や、別のプロジェクトからコードをコピーした直後は、古いパッケージ名が残っている場合があります。
Rをimportしている場合は、現在のnamespaceに対応した正しいRクラスを参照しているか確認します。
Gradle Syncを実行する
設定に明らかな問題が見つからない場合は、Gradle Syncを実行します。
Gradle Syncによってプロジェクト設定が再読み込みされ、生成コードや依存関係が再認識されることでエラーが解消する場合があります。
ただし、Sync中にエラーが表示された場合は、そのエラーを無視してSyncを繰り返すのではなく、表示された原因を先に修正します。
プロジェクトを再ビルドする
Gradle Syncが正常に完了した場合は、プロジェクトを再ビルドします。
再ビルドによってリソースが再処理され、Rクラスが再生成されることでエラーが解消する場合があります。
再ビルドに失敗した場合は、Buildウィンドウに表示された最初のエラーを確認します。
Clean Projectを実行する
古いビルド結果が残っていることが原因と考えられる場合は、Clean Projectを実行してから再度ビルドすると改善する場合があります。
ただし、XMLやGradle設定に実際のエラーがある場合は、Clean Projectを実行するだけでは解決しません。
まず構文エラーや設定エラーがないことを確認することが重要です。
Package R does not existが表示されたときの確認ポイント
「Package R does not exist」が表示された場合は、次の項目を順番に確認します。
resフォルダ内のXMLに構文エラーがないかstrings.xmlやthemes.xmlなどに記述ミスがないか- リソースファイル名がAndroidの命名規則に違反していないか
- 参照しているレイアウトやIDが実際に存在するか
import android.Rなど誤ったRクラスをimportしていないか- ソースファイルの
package宣言が正しいか - Gradleの
namespaceが正しいか - 古いパッケージ名を使った完全修飾名が残っていないか
- Gradle Syncが正常に完了しているか
- 別のビルドエラーが発生していないか
- マルチモジュールの場合、正しいモジュールの
Rを参照しているか - Android Studioのインデックスやキャッシュに問題がないか
特に、複数のファイルで突然「Package R does not exist」が表示されるようになった場合は、それぞれのコードに問題があるのではなく、一つのリソースエラー、Gradleエラー、またはnamespaceの変更などが原因になっている可能性があります。
まとめ
Android Studioの「Package R does not exist」は、Androidプロジェクトで使用するRクラスをコンパイラが正しく参照できない場合などに表示されるエラーです。
代表的な原因には、XMLの構文エラー、リソース名の問題、存在しないリソースの参照、誤ったRクラスのimport、packageやnamespaceの設定、Gradle Syncやビルドの失敗などがあります。
また、Rそのものに問題があるのではなく、別のリソースエラーやビルドエラーによってRクラスが正常に生成されていない場合もあります。
基本的には、まずresフォルダ内のXMLやリソース名を確認し、その後にpackage、namespace、import、Gradle Sync、ビルドエラーの順で確認すると原因を特定しやすくなります。
「Package R does not exist」が表示されたときは、エラーが出ているRの行だけを見るのではなく、プロジェクト全体の中でRクラスの生成や参照を妨げている問題がないか確認することが重要です。
