[Xamarin] DebugビルドとReleaseビルドでアプリケーションID(Bundle ID)とアプリ名を切り替える
数年前に作成し、たまに更新しているXamarin製の個人作アプリがあります。 シンプルなアプリなのでDebugとRelease用に分けないで開発していましたが、通信してデータ取得するようになると、下記のように開発したくなりました。
- Debug用アプリ:WebAPI(Dev)を使う
- Release用のアプリ:WebAPI(Prod)を使う
WebAPIをデプロイするとき、Debug用のアプリをビルド&インストールして動作確認したあと、Release用のアプリをビルド&インストールするのがめんどくさいのです……。 最初からDebug用とRelease用のアプリが2つあれば楽ちんですよね!
本記事はXamarin Advent Calendar 2020の11日目です。
まずは基本となるアプリを作成する
プロジェクトを新規作成する
適当なプロジェクトを新規作成します。
アプリのテンプレートはポップアップを選択します。
Androidアプリの場合
AndroidManifest.xmlをRelease用とDebug用に分ける
既存のAndroidManifest.xml
を複製し、Release用とDebug用とします。
cp BuildSample.Android/Properties/AndroidManifest.xml BuildSample.Android/Properties/AndroidManifest_release.xml mv BuildSample.Android/Properties/AndroidManifest.xml BuildSample.Android/Properties/AndroidManifest_debug.xml
Debug用のAndroidManifest.xmlにあるアプリケーションIDとアプリ名を編集する
AndroidManifest_debug.xml
のpackage
を編集して、アプリケーションIDにdebug
を含めるようにします。
- 変更前: com.companyname.buildsample
- 変更後: com.companyname.buildsample.debug
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.buildsample"> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.buildsample.debug">
続いて、アプリ名をDebugにして分かりやすいようにします。これは設定画面のアプリ一覧で表示されるようです。
- 変更前: BuildSample.Android
- 変更後: Debug
-<application android:label="BuildSample.Android" android:theme="@style/MainTheme"></application> +<application android:label="Debug" android:theme="@style/MainTheme"></application>
MainActivityのAndroidアプリ名をDebugにする
MainActivity
にあるLabel
も修正します。これは通常時のアプリ名として表示されるようです。
下記は強引に切り分けていますが、Label
の記述を削除してもOKです。むしろAndroidManifestのみになるため、削除するほうが良いかもですね。
--- a/BuildSample.Android/MainActivity.cs +++ b/BuildSample.Android/MainActivity.cs namespace BuildSample.Droid { + #if DEBUG - [Activity(Label = "BuildSample", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize )] + #else + [Activity(Label = "Debug", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize )] + #endif public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity { ... } }
今回は行いませんが、アイコンも変えるとより分かりやすくなります。
BuildSample.Android.csprojでAndroidManifest.xmlを使い分ける
BuildSample.Android.csproj
をエディタで開き、AndroidManifest関連を修正します。
PropertyGrouタグの修正
<PropertyGroup>
にある<AndroidManifest>...</AndroidManifest>
を削除<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
に<AndroidManifest>...debug用...</AndroidManifest>
を追加<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
に<AndroidManifest>...release用...</AndroidManifest>
を追加
--- a/BuildSample.Android/BuildSample.Android.csproj +++ b/BuildSample.Android/BuildSample.Android.csproj <PropertyGroup> ... - <AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest> ... </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> ... + <AndroidManifest>Properties\AndroidManifest_debug.xml</AndroidManifest> ... </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <AndroidManifest>Properties\AndroidManifest_release.xml</AndroidManifest> </PropertyGroup>
ItemGroupタグの修正
<ItemGroup>
にある<None Include="Properties\AndroidManifest.xml" />
を削除- Debug用の
<ItemGroup>
を追加 - Release用の
<ItemGroup>
を追加
--- a/BuildSample.Android/BuildSample.Android.csproj +++ b/BuildSample.Android/BuildSample.Android.csproj <ItemGroup> - <None Include="Properties\AndroidManifest.xml" /> </ItemGroup> + <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <None Include="Properties\AndroidManifest_debug.xml" /> + </ItemGroup> + <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <None Include="Properties\AndroidManifest_release.xml" /> + </ItemGroup>
動作確認(Android)
Debug用とRelease用のアプリが分かれています。
iOSアプリの場合
AndroidみたいにInfo.plist
の名前を変更して使い分けると、ビルドエラーが発生します。
そのため、Debug用とRelease用を用意しておき、ビルド時にInfo.plist
に置き換えることにします。
Info.plistをRelease用とDebug用に分ける
Debug用とRelease用のInfo.plist
を作ります。
cp BuildSample.iOS/Info.plist BuildSample.iOS/Info_Debug.plist cp BuildSample.iOS/Info.plist BuildSample.iOS/Info_Release.plist
オリジナルのInfo.plist
は残しておき、Debug用と同じ内容にしておきます。こうすることによって、開発時のDebugビルドでGit差分が出ないようにします。
Debugビルドするたびに「Info.plistが更新された」「Info.plistが新しくできた」というGit差分が出たらめんどくさいからです。
Debug用のBundle IDを変更する
info.plist
とInfo_Debug.plist
にあるBundle IDをデバッグ用に変更します。
<dict> ... - <string>xxx.yyy.zzz.buildsample</string> + <string>xxx.yyy.zzz.buildsample.debug</string> ... </dict>
Debug用のアプリ名にする
Info.plist
とInfo_Debug.plist
にあるアプリ名をデバッグ用に変更します。
<dict> ... <key>CFBundleDisplayName</key> - <string>BuildSample</string> + <string>Debug</string> ... </dict>
ビルド時にInfo.plistを上書きする
ビルド時にInfo_Debug.plist
とInfo_Release.plist
のどちらかをInfo.plist
に上書きする処理を作成します。共通プロジェクトのプロパティを開き、「ビルド前イベントのコマンドライン」に下記を追加します。 細かいPathは各自の環境に合わせてください。
cp "$(SolutionDir)$(ProjectName).iOS\Info_$(ConfigurationName).plist" "$(SolutionDir)$(ProjectName).iOS\Info.plist" touch "$(SolutionDir)$(ProjectName).iOS\Info.plist"
動作確認(iOS)
Debug用とRelease用のアプリが分かれました!
さいごに
1年以上前にGoogleServiceのJSONファイルで似たようなことをやっていたのですが、今更ながら気づいて試してみました。 参考になれば幸いです。