MAUIが初めてリリースされたとき、いくつかのテンプレートプロジェクトを作成して試したことがありますが、特に問題はありませんでした。最近、飲食業向けのレジスター(Androidシステム)向けアプリを開発する必要が生じました。このようなレジスターは一般的にスペックが低く、システムバージョンやパフォーマンスも私たちが使っているスマートフォンには及びません。技術選定の際にまずMAUIを思い浮かべ、次にFlutter、React Nativeを候補に挙げました。いずれも大手がメンテナンスするクロスプラットフォームアプリケーションフレームワークです。MAUIフレームワークを使用中に、新しく作成したテンプレートアプリが起動時に即座にクラッシュするという問題に遭遇しましたが、最終的に解決に至りましたので、この経験を共有します。
プロジェクトの作成
プロジェクト作成手順のデモです。全てのフローはIDEのデフォルト設定で、一切変更を行いません。
MAUIテンプレートプロジェクトの新規作成
VSでMAUIテンプレートプロジェクトを新規作成します。以下の通りです。

プロジェクト名もデフォルトのMauiApp1とします。

デバイスの接続
- USB経由でターゲットのAndroidデバイスを接続します。
- ターゲットデバイスで開発者モードを有効にし、USBデバッグをオンにします(詳細はご自身で
BaiduBing/Googleで検索してください)。 - スマートフォン上でUSBデバッグのモードを切り替えます。通常は「充電のみ」「ファイル転送」などが表示されます。各オプションを適当に切り替え、VSにデバイスが表示されれば成功です。

プロジェクトのデバッグ
上記のデバイス接続が完了したら、直接デバッグモードでプロジェクトを起動します。

しばらく待つと、デバイス上にアプリがインストールされているのが確認できます。通常であれば自動で起動するはずですが、いくら待っても動かず、VSの出力ウィンドウにも新しい出力は表示されませんでした。

デバイス上でインストールされたMauiApp1アプリを手動でタップすると、スプラッシュ画面で大きな.NETロゴが一瞬表示された後、Maui1 が停止しました と表示されました。

クラッシュ問題の解決
以前、Android Studioを使用してネイティブAndroidアプリを開発した経験があります。そのような問題はIDEにエラー出力があり、エラー情報からクラッシュの原因を特定できました。
今回の問題を振り返ると、どこでログを確認すればよいか分からず、クラッシュの原因をどのように調べればよいのか迷いました。VSがAndroid Studioのように詳細なログを確認できれば良いのですが、現時点では詳細なデバッグログを確認できる場所があるかどうかは分かりません。そこで、汎用的なトラブルシューティング方法としてadbツールを選びました。
adbについては説明しません。読者の皆様はご自身でBaiduBing/Googleで検索してください。Androidアプリをデバッグするための強力なツールであることだけ知っておいてください。
以下の手順を実行するには、adbディレクトリを環境変数PATHに追加し、adbコマンドをグローバルに使用できるようにする必要があります。
よく使うコマンド
adbコマンドでスマートフォンにインストールされているすべてのアプリのパッケージ名を表示する:
adb shell pm list packages
システムアプリのパッケージ名のみを表示する:
adb shell pm list packages -s
サードパーティ製アプリのパッケージ名のみを表示する(システムアプリを除く):
adb shell pm list packages -3
特定のパッケージに含まれる可能性のあるキーワードを推測する:
adb shell dumpsys activity | findstr mFocusedActivity
アプリのデータとキャッシュを消去する:
adb shell pm clear アプリのパッケージ名
ログを表示する:
adb logcat
- V: Verbose(最低優先度)
- D: Debug
- I: Info
- W: Warning
- E: Error
- F: Fatal
- S: Silent(最高優先度、何も出力しない)
目的のログを見つける
adbがデバイスを認識していることを確認する:
$ adb devices
List of devices attached
1234567890ABCDEF device
パッケージ名を特定する:
$ adb shell pm list packages -3
....
package:com.landi.print.service
package:com.companyname.mauiapp1
....
パッケージ名はcom.companyname.mauiapp1です。
logcatを使用する
adb logcatを直接実行すると、デバイスのすべてのログが表示され、調査の妨げになります。package:com.companyname.mauiapp1のログだけを表示するには、grepでフィルタリングします。これはWindowsのコマンドラインツールではサポートされていないため、GitBashのshellコマンドラインツールを使用してこの機能を利用します。
adb logcat | grep com.companyname.mauiapp1
こうすると、mauiapp1のログだけが出力されます。
上記のコマンドを実行した後、mauiapp1アプリのアイコンをタップして起動すると、アプリ起動からクラッシュまでのすべてのログが以下のように出力されます:
06-16 10:21:11.953 1424 1424 D Launcher2.2.10: flow not clicked com.companyname.mauiapp1crc64e632a077a20c694c.MainActivity
06-16 10:21:11.953 1424 1424 D Launcher2.2.10: flow click desktop com.companyname.mauiapp1crc64e632a077a20c694c.MainActivity
06-16 10:21:11.953 424 466 I ActivityManager: START u0 {act=android.intent.action.MAIN flg=0x10200000 cmp=com.companyname.mauiapp1/crc64e632a077a20c694c.MainActivity} from uid 10072
06-16 10:21:11.958 424 466 E ActivityManager: getPackageFerformanceMode--ComponentInfo{com.companyname.mauiapp1/crc64e632a077a20c694c.MainActivity}----com.companyname.mauiapp1
06-16 10:21:11.967 424 1456 E ActivityManager: getPackageFerformanceMode--ComponentInfo{com.companyname.mauiapp1/crc64e632a077a20c694c.MainActivity}----com.companyname.mauiapp1
06-16 10:21:11.987 424 1456 I ActivityManager: Start proc 19415:com.companyname.mauiapp1/u0a97 for activity com.companyname.mauiapp1/crc64e632a077a20c694c.MainActivity
06-16 10:21:12.173 19415 19415 D debug-app-helper: Checking if libmonodroid was unpacked to /data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm/libmonodroid.so
06-16 10:21:12.173 19415 19415 D debug-app-helper: Native libs extracted to /data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm, assuming application/android:extractNativeLibs == true
06-16 10:21:12.173 19415 19415 D debug-app-helper: Added filesystem DSO lookup location: /data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm
06-16 10:21:12.173 19415 19415 W debug-app-helper: Using runtime path: /data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm
06-16 10:21:12.173 19415 19415 W debug-app-helper: checking directory: `/data/user/0/com.companyname.mauiapp1/files/.__override__/lib`
06-16 10:21:12.173 19415 19415 W debug-app-helper: directory does not exist: `/data/user/0/com.companyname.mauiapp1/files/.__override__/lib`
06-16 10:21:12.173 19415 19415 W debug-app-helper: Checking whether Mono runtime exists at: /data/user/0/com.companyname.mauiapp1/files/.__override__/libmonosgen-2.0.so
06-16 10:21:12.173 19415 19415 W debug-app-helper: Checking whether Mono runtime exists at: /data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm/libmonosgen-2.0.so
06-16 10:21:12.173 19415 19415 I debug-app-helper: Mono runtime found at: /data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm/libmonosgen-2.0.so
06-16 10:21:12.192 19415 19415 W monodroid: Creating public update directory: `/data/user/0/com.companyname.mauiapp1/files/.__override__`
06-16 10:21:12.198 19415 19415 F monodroid: No assemblies found in '/data/user/0/com.companyname.mauiapp1/files/.__override__' or '<unavailable>'. Assuming this is part of Fast Deployment. Exiting...
06-16 10:21:12.275 19433 19433 F DEBUG : pid: 19415, tid: 19415, name: nyname.mauiapp1 >>> com.companyname.mauiapp1 <<<
06-16 10:21:12.284 19433 19433 F DEBUG : Abort message: 'No assemblies found in '/data/user/0/com.companyname.mauiapp1/files/.__override__' or '<unavailable>'. Assuming this is part of Fast Deployment. Exiting...'
06-16 10:21:12.288 19433 19433 F DEBUG : #01 pc 0001b08b /data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm/libmonodroid.so (xamarin::android::internal::MonodroidRuntime::create_domain(_JNIEnv*, xamarin::android::jstring_array_wrapper&, bool, bool)+282)
06-16 10:21:12.288 19433 19433 F DEBUG : #02 pc 0001c08f /data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm/libmonodroid.so (xamarin::android::internal::MonodroidRuntime::create_and_initialize_domain(_JNIEnv*, _jclass*, xamarin::android::jstring_array_wrapper&, xamarin::android::jstring_array_wrapper&, _jobjectArray*, xamarin::android::jstring_array_wrapper&, _jobject*, bool, bool, bool)+26)
06-16 10:21:12.288 19433 19433 F DEBUG : #03 pc 0001d2c5 /data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm/libmonodroid.so (xamarin::android::internal::MonodroidRuntime::Java_mono_android_Runtime_initInternal(_JNIEnv*, _jclass*, _jstring*, _jobjectArray*, _jstring*, _jobjectArray*, _jobject*, _jobjectArray*, int, unsigned char, unsigned char)+4020)
06-16 10:21:12.288 19433 19433 F DEBUG : #04 pc 0001d55f /data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm/libmonodroid.so (Java_mono_android_Runtime_initInternal+50)
06-16 10:21:12.288 19433 19433 F DEBUG : #05 pc 0005282f /data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/oat/arm/base.odex (offset 0x2e000)
06-16 10:21:12.905 424 19434 W ActivityManager: Force finishing activity com.companyname.mauiapp1/crc64e632a077a20c694c.MainActivity
06-16 10:21:12.916 424 451 I ActivityManager: Showing crash dialog for package com.companyname.mauiapp1 u0
06-16 10:21:12.976 424 877 I ActivityManager: Process com.companyname.mauiapp1 (pid 19415) has died: fore TOP
ログレベルがF、Eのものだけに注目します:
以下のエラー情報がプログラムのクラッシュ原因を示しています。
06-16 10:21:12.198 19415 19415 F monodroid: No assemblies found in '/data/user/0/com.companyname.mauiapp1/files/.__override__' or '<unavailable>'. Assuming this is part of Fast Deployment. Exiting...
06-16 10:21:12.275 19433 19433 F DEBUG : pid: 19415, tid: 19415, name: nyname.mauiapp1 >>> com.companyname.mauiapp1 <<<
06-16 10:21:12.284 19433 19433 F DEBUG : Abort message: 'No assemblies found in '/data/user/0/com.companyname.mauiapp1/files/.__override__' or '<unavailable>'. Assuming this is part of Fast Deployment. Exiting...'
次は、プログラマにとって重要なスキルの一つであるBaiduGoogle検索を活用して、正しい答えを見つけられるかどうかが鍵となります。
筆者は少し知識があったようで、類似のケースをGoogleで見つけました:https://stackoverflow.com/questions/42336546/xamarin-android-application-crashed-after-clear-data-in-settings
興味があれば深掘りしてみてください。ここではxamarinの解決策としてUse Fast Deploymentをオフにすることが挙げられています。
プロジェクト設定の変更

プロパティ設定ファイルを詳細に確認した結果、この設定はstackoverflowで言及されているUse Fast Deploymentをオフにする設定と非常に似ていることに気付きました。おそらくこれでしょう。その設定をオフにして、再度VSをデバッグモードで起動します。
今回は少し長い処理の後、Found device: 1234567890ABCDEFで止まってしまいました。

手動でAppを開いても何の効果もありませんでした。
Mauiapp1をアンインストールして再試行
前の手順で変更しても効果はありませんでしたが、これが正しいはずだと確信していたため、アプリをアンインストールして再度試し、妨害要因を排除することにしました。

Found device: 1234567890ABCDEF以降は止まることなく、デバイスにMauiapp1がインストールされ、自動的に起動しました。そしてクラッシュしませんでした!