Package Name は、リバースドメイン記法に基づいたAndroidアプリケーションの固有識別子です。システムはユーザーのデバイス上でアプリを区別するため、Google Playは製品を識別するため、Firebaseサービスはプロジェクトのすべての設定を連携するためにこれを使用します。Android Developer Documentationによると、パブリッシュ後、Package Nameはアプリケーションのライフサイクルを通して不変です。
ポイント
Package Name は、Androidがオペレーティングシステムレベルでアプリケーションを識別するために使用する固有の文字列です。これはAndroidManifest.xmlファイルのpackageフィールドおよびアプリケーションモジュールのbuild.gradleファイルのapplicationIdフィールドに対応します。固有のPackage Nameがなければ、ユーザーのデバイスにアプリをインストールすることはできません。
デバイス上で、Package Nameはアプリ管理のキーとして機能します: システムは/data/data/[packageName]ディレクトリに各アプリのデータ、設定、キャッシュを保管します。同じ識別子を持つ2つのアプリは共存できません — 重複アプリをインストールしようとすると、システムは既存のアプリを削除するよう説催します。
Android Gradle Pluginバージョン0.11+では、Package Name (マニフェスト内) とApplication ID (build.gradle内) の区別が導入されました。Application IDは、システムおよびGoogle Playに対する実際のアプリ識別子です。マニフェストのPackage Nameは、リソース解決とRクラス生成に使用されます。簡単のために、両者を同じにすることが推奨されます。
// build.gradle (Module: app)
android {
defaultConfig {
applicationId "com.example.myapplication"
minSdkVersion 24
targetSdkVersion 34
versionCode 1
versionName "1.0"
}
buildTypes {
debug {
applicationIdSuffix ".debug"
}
}
}
applicationIdSuffixフィールドにより、異なるビルド設定のためにApplication IDに接尾語を追加できます。デバッグバージョンは識別子com.example.app.debugを持て、プロダクションバージョンと並行インストールして並行テストができます。
Google Playは、パブリッシュ時に守るべきPackage Nameの厳しいルールを定めています。識別子はストア全体で固有であり、構文要件を満たし、商標ポリシーを侵犯してはなりません。
Package Nameに使用できるのは、ラテン文字(A-Z, a-z)、数字(0-9)、ドット(.)、アンダースコア(_)のみです。最大長さは150文字です。ドットで区切られた各セグメントは文字で始まる必要があります。ハイフェン、スペース、特殊文字はGoogle Playのルールで禁止されています。
| 要件 | 値 | 例 |
|---|---|---|
| 使用可能な文字 | ラテン文字、数字、ドット、アンダースコア | com.example.my_app |
| 最大長さ | 150文字 | com.example.verylongappname |
| セグメントの先頭 | 文字のみ | com — 3comは不可 |
| 禁止 | ハイフェン、スペース、キリル文字 | com.example-app — エラー |
| 一意性 | Google Playでグローバル | 作成時に検証 |
Package Nameの一意性は、Google Play Storeの絶対的な要件です。もし他のアプリが既に選択した識別子を使用している場合、パブリッシュは拒否されます。Googleは削除されたアプリの識別子を解放しないため、最初のPackage Nameを選択することは、すべての開発者にとって重要な決定です。
リバースドメイン記法は、企業のドメイン名を逆の順で書く命名基準です: example.comの代わりにcom.example。このシステムは、すべてのドメイン名が本質的に固有であるため、識別子のグローバルな一意性を保証します。
開発者は通常、ドメインのTLDに対応する接頭辞を使用します: comは商業組織向け、orgは非営利組織向け、ioはテクノロジープロジェクト向け、netはネットワークサービスとソリューション向け。個人プロジェクトには、com.github.usernameまたはcom.emailが可能です。
iOSおよびAndroidでリリースされるアプリでは、両プラットフォームで同じ識別子を使用することが推奨されます。これにより、Firebase、AppsFlyer、Adjustなど、プロジェクト識別子に結びつく分析システムとの統合が簡単になります。例えば、com.mycompany.myappは、iOSではBundle ID、AndroidではPackage Nameになります。
AndroidプロジェクトでのPackage Name設定には、build.gradleのapplicationIdの変更および対応するJava/Kotlinソースコードのディレクトリ構造の変更が含まれます。Android StudioはPackage Nameのリファクタリングツールを提供していますが、複雑なプロジェクトの場合は、ステップごとのマイグレーションが推奨されます。
// ファイルパスはPackage Nameに対応する
// com/example/myapp/MainActivity.kt
package com.example.myapp
import android.os.Bundle
import androidx.activity.ComponentActivity
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
}
KotlinやJavaでは、ソースファイル内のPackage Nameがディレクトリ構造と一致する必要があります。build.gradleでPackage Nameを変更する際は、ファイルを対応するディレクトリに移動し、すべてのpackageおよびimport宣言を更新する必要があります。Android StudioはRefactor -> Moveで自動的にこれを行うことができますが、数十ファイルの大きなプロジェクトの場合は、リファクタリング後に結果を確認することが推奨されます。
プロジェクトがData Binding、View BindingまたはHiltを使用している場合、Package Nameの変更は生成されたクラスにも影響します。バインディングクラスは、モジュールのPackage Nameとレイアウトディレクトリに基づいて作成されます。識別子を変更した後は、生成されたすべての参照を更新するために、プロジェクトを再ビルドする必要があります。キャッシュされた古い参照によるエラーを防ぐため、Package Name変更後はクリーンビルドを実行することが推奨されます。
Gradle 7.0+では、build.gradleにnamespaceのサポートが導入され、Rクラスおよびリソース生成の目的でAndroidManifest.xmlのpackageフィールドを置き換えました。一方、applicationIdはシステムおよびGoogle Playに対する実際のアプリ識別子のままです。これにより、namespaceが固定され、公開識別子がビルド中に変更できるライブラリモジュールに役立つ、異なるapplicationIdとnamespaceが可能になります。
モジュラーアーキテクチャのプロジェクトでは、あるモジュールのPackage Name変更が他のモジュールのimportに影響する可能性があります。dataモジュールがパッケージcom.example.dataを持ち、domainモジュールがそのクラスを使用している場合、識別子変更後は依存するすべてのモジュールのimportを更新してください。Android Gradle Pluginバージョン8.0+は、build.gradleからの自動namespace生成により、このプロセスを簡素化します。
現在のApplication IDを取得するには、BuildConfigクラスを使用します: BuildConfig.APPLICATION_ID。これは、コード内の条件論理、環境への結合、またはデバッグ画面に識別子を表示するのに便利です。BuildConfigはbuild.gradleに基づいて自動生成されます。
// ランタイムでのApplication IDの取得
val packageName = BuildConfig.APPLICATION_ID
val packageManager = packageManager
val appInfo = packageManager.getPackageInfo(packageName, 0)
println("App version: ${appInfo.versionName} (${appInfo.versionCode})")
println("Package: $packageName")
Google Playでアプリをパブリッシュした後のPackage Name変更は、全く新しい製品を作成することを意味します。システムは異なるPackage Nameで既存のアプリを更新することを許可しないため、識別子を変更する決定は、ストアでプロジェクトを再始することになります。
Package Nameを変更すると、以下が失われます: すべての評価とレビュー、インストール統計、Google Servicesの統合(移行しない場合)、Firebaseプロジェクトのリンク(新しいgoogle-services.jsonが必要)。ユーザーは自動更新を受け取りません — ストアで新しいアプリを見ることになります。
Package Name変更は、企業のリブランディング、アプリを他の開発者アカウントに移行する場合、または別の地域向けの独立バージョンを作成する場合に正当化されます。いずれの場合でも、変更前に古いアプリを通じてユーザーに通知し、データ移行を含むマイグレーション計画を立てることが推奨されます。マイグレーション計画がなければ、ユーザーは購入コンテンツ、サブスクリプション、アプリの保存データへのアクセスを失います。マイグレーションには、SharedPreferencesやRoomを通じたデータベースおよびファイルの移行が含まれます。
Package Nameを変更する前に、新しい識別子が固有で命名ルールを守っていることを確認してください。新しいPackage NameでGoogle Playに新しいアプリを作成し、独立した製品としてパブリッシュします。古いアプリの説明に、新しいアプリへのリンクを記載します。ユーザーをリダイレクトするためにGoogle Play Custom Store Listingを検討してください。
よくある質問
Package Nameでは、アンダースコア(_)は許可されますが、ハイフェン(-)は許可されません。アンダースコアはめったに使われますが、com.example.my_appは可能です。ハイフェンはGoogle Playのルールで禁止されており、パブリッシュ時にエラーになります。セグメントの区切りとしては、ドットのみを使用することが推奨されます。
Package NameはAndroidManifest.xml内の識別子で、リソース解決とRクラス生成に使用されます。Application IDはbuild.gradleのフィールドで、システムおよびGoogle Playストアに対するアプリ識別子を決定します。両者を同じにすることが推奨されますが、applicationIdSuffixを使用する際は違いが許可されます。
企業またはニックネームのリバースドメイン記法を使用します: com.domain.appname。識別子がGoogle Playで固有であることを確認してください。一般的な単語(todo, test, app)を避け、Google Playで検索して識別子が他の開発者によって既に使用されていないか確認してください。
はい、Google Playへのパブリッシュ前であれば、Package Nameを影響なく変更できます。変更後は、google-services.jsonを再生成し、ディレクトリ構造を更新し、すべてのimportを確認する必要があります。Android Studioは、プロセスを自動化するRefactor -> Moveツールを提供しています。
Package Nameは署名証明書と一緒に、Google Playでアプリを識別する固有のバインディングを形成します。2つのアプリが異なるPackage Nameを持っていても、同じ鍵で署名できます。署名証明書の変更は、Key Rotationを通じてPlay Consoleで識別子を失うことなく可能です。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。