Google Playのテスト版と.NET MAUIのDebug版を同じAndroid端末に共存させる方法(配置エラー回避)
はじめに
.NET MAUIで開発中のAndroidアプリをVisual Studioから実機へ配置したところ、次のエラーが発生しました。
INSTALL_FAILED_USER_RESTRICTED: Install canceled by user
ADBは端末を正常に認識しており、同じ端末へ別のアプリは配置できました。
確認すると、端末にはGoogle Playからインストールしたテスト版が存在し、Visual StudioでビルドしたDebug版も同じApplication IDを使用していました。
そこで、Debug版だけApplication IDと表示名を変更し、Google Play版とは別のアプリとしてインストールできるようにしました。
環境
- Visual Studio 2022
- .NET 9
- .NET MAUI
- Android実機
- Google Play Consoleのテスト版をインストール済み
発生した現象
Google Playからテスト版をインストールした状態で、Visual Studioから同じアプリを実行すると、配置に失敗しました。
ADBからAPKを直接インストールしても同じ結果になります。
$adb = "$env:LOCALAPPDATA\Android\Sdk\platform-tools\adb.exe"
& $adb -s <端末ID> install --no-incremental `
"C:\path\to\project\bin\Debug\net9.0-android\app-Signed.apk"
実行結果は次のとおりです。
Performing Streamed Install
adb: failed to install ...:
Failure [INSTALL_FAILED_USER_RESTRICTED: Install canceled by user]
また、Visual Studioから配置したタイミングで、端末側にGoogle Playのテスト版インストール画面が表示されました。
その画面からインストールするとアプリは入りますが、インストールされるのはVisual Studioで作成したDebug版ではありません。Google Playへアップロード済みのテスト版です。
したがって、Visual Studio側の最新修正は反映されません。
ADB接続を確認する
最初に、ADBが端末を正常に認識しているか確認しました。
$adb = "$env:LOCALAPPDATA\Android\Sdk\platform-tools\adb.exe"
& $adb devices
正常に認識されていれば、次のように表示されます。
List of devices attached
<端末ID> device
複数の実機やエミュレーターが表示される場合は、-sで対象端末を指定します。
& $adb -s <端末ID> install `
"C:\path\to\app-Signed.apk"
今回はADB接続が正常で、別のアプリは同じ端末へ配置できました。
そのため、USBケーブル、USBデバッグ、Android SDK、ADB全体の異常ではないと判断しました。
問題になっていた構成
Google Playのテスト版とVisual StudioのDebug版で、同じApplication IDを使用していました。
com.example.myapp
Androidでは、Application IDによってアプリが識別されます。
同じApplication IDのアプリが端末に存在すると、新しいAPKは別アプリではなく、既存アプリの更新として扱われます。
一方、Google Playから配信されたアプリと、Visual StudioでローカルビルドしたDebug APKでは、署名が異なる場合があります。
同じApplication IDのまま両方を扱おうとすると、別アプリとして共存できず、配置に失敗する可能性があります。
一般的には署名不一致を表す別のエラーになる場合もあります。今回使用した端末では、次のエラーが表示されました。
INSTALL_FAILED_USER_RESTRICTED
Install canceled by user
そのため、このエラーだけを根拠に、端末のインストール制限が原因だと断定しないことが重要です。
次の点も確認する必要があります。
- 同じApplication IDのアプリがすでに入っていないか
- 既存アプリがGoogle Playからインストールされたものではないか
- Google Play版とDebug版を同じ端末で使用しようとしていないか
解決方法
Debugビルドだけ、Application IDとアプリの表示名を変更します。
プロジェクトの.csprojに、Debug構成を対象とする設定を追加します。
<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
<ApplicationTitle>My App DEV</ApplicationTitle>
<ApplicationId>com.example.myapp.dev</ApplicationId>
</PropertyGroup>
通常の設定が次のようになっているとします。
<PropertyGroup>
<ApplicationTitle>My App</ApplicationTitle>
<ApplicationId>com.example.myapp</ApplicationId>
</PropertyGroup>
Debugビルドでは、条件付きの設定によってApplication IDと表示名が切り替わります。
| 種類 | 表示名 | Application ID |
|---|---|---|
| Google Play版 | My App | com.example.myapp |
| Visual Studio Debug版 | My App DEV | com.example.myapp.dev |
Application IDが異なるため、Androidは両者を別のアプリとして扱います。
Release版のApplication IDは変更されないため、Google Playへ提出するアプリには影響しません。
変更後の配置手順
- Visual Studioのビルド構成を
Debugにする - プロジェクトをクリーンする
- プロジェクトをリビルドする
- 配置先のAndroid実機を選択する
- Visual Studioから実行する
変更後は、同じ端末に次の2つをインストールできました。
- Google Playからインストールしたテスト版
- Visual Studioから配置したDEV版
Visual Studioで最新の変更を確認するときは、名前にDEVが付いたアプリを起動します。
Google Playへアップロードした内容を確認するときは、通常版を起動します。
注意点
Application IDが異なるため、Google Play版とDEV版のデータは共有されません。
次の情報は、それぞれ独立して管理されます。
- アプリの設定
- SQLiteデータベース
- アプリ固有ファイル
- 権限
- 通知設定
- バックグラウンド処理
Firebase、Googleログイン、OAuth、App Linksなど、Application IDやパッケージ名を外部サービスへ登録している場合は、DEV版のIDも追加登録する必要があります。
また、アプリアイコンが同じだと通常版とDEV版を取り違えやすくなります。必要であれば、Debug版のアイコンも変更すると判別しやすくなります。
まとめ
Google Playのテスト版が入っている端末へ、同じApplication IDのDebug版を配置すると、既存アプリとの関係や署名の違いによって配置に失敗する場合があります。
今回は、Debug版だけApplication IDと表示名を変更することで解決しました。
<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
<ApplicationTitle>My App DEV</ApplicationTitle>
<ApplicationId>com.example.myapp.dev</ApplicationId>
</PropertyGroup>
この構成にすると、Google Playのテスト版を削除せず、Visual StudioのDebug版を同じ端末へ配置できます。
Google Play版と開発版を同じ実機で確認する場合は、最初からApplication IDを分けておくと管理しやすくなります。