[flutter] Androidのクラッシュ解決で沼った話

flutterアプリを開発している際にAndroidのクラッシュ解決で沼ったので備忘録として残します。

## 症状
Androidでビルドすると１瞬立ち上がり、アプリがクラッシュする（iOSは問題なし）


## 原因探索
まずは　`flutter run -v` で実行するがここから進まない。
>[   +1 ms] Waiting for VM Service port to be available...

次にAndroid Studioからエミュレータを再作成して実行。

結果、変わらず。

次にChatGPTに聞いてみる。
>Logcatの取得:これにより、デバイスのすべてのログがlog.txtファイルに保存されます。特にエラーメッセージや例外が発生している箇所を探します。
>```log.sh
>adb logcat -d > log.txt

やってみて実際に得られたLogがこれです。
```log.text
06-20 10:24:54.852  7017  7017 E AndroidRuntime: ******************************************************************************
06-20 10:24:54.852  7017  7017 E AndroidRuntime: * Missing application ID. AdMob publishers should follow the instructions    *
06-20 10:24:54.852  7017  7017 E AndroidRuntime: * here:                                                                      *
06-20 10:24:54.852  7017  7017 E AndroidRuntime: * https://googlemobileadssdk.page.link/admob-android-update-manifest         *
06-20 10:24:54.852  7017  7017 E AndroidRuntime: * to add a valid App ID inside the AndroidManifest.                          *
06-20 10:24:54.852  7017  7017 E AndroidRuntime: * Google Ad Manager publishers should follow instructions here:              *
06-20 10:24:54.852  7017  7017 E AndroidRuntime: * https://googlemobileadssdk.page.link/ad-manager-android-update-manifest.   *
06-20 10:24:54.852  7017  7017 E AndroidRuntime: ******************************************************************************
06-20 10:24:54.852  7017  7017 E AndroidRuntime: 
06-20 10:24:54.852  7017  7017 E AndroidRuntime: 
06-20 10:24:54.852  7017  7017 E AndroidRuntime: 	at com.google.android.gms.ads.internal.client.zzek.attachInfo(com.google.android.gms:play-services-ads-lite@@23.1.0:26)
06-20 10:24:54.852  7017  7017 E AndroidRuntime: 	at com.google.android.gms.ads.MobileAdsInitProvider.attachInfo(com.google.android.gms:play-services-ads-lite@@23.1.0:1)
06-20 10:24:54.852  7017  7017 E AndroidRuntime: 	at android.app.ActivityThread.installProvider(ActivityThread.java:7459)
```
どうやらapplication IDが抜けているのが原因でクラッシュしているよう。（公式にも抜けているとクラッシュすると記載あり）でも`AndroidManifest.xml`に`meta-data`の記述はしてあるし[xmlvalidation](https://www.xmlvalidation.com/)で確認しても構文にも問題なさそうだ。

ここから沼りました。紆余曲折ありAdmobの導入に立ち返って[公式ドキュメント](https://developers.google.com/admob/flutter/quick-start?hl=ja)を確認してすると
```AndroidMainfest.xml
<manifest>
    <application>
        <!-- Sample AdMob app ID: ca-app-pub-3940256099942544~3347511713 -->
        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy"/>
    <application>
<manifest>
```
自分が書いていたものが以下です。なんか階層ちがくない？・・・

```AndroidMainfest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application
        android:label="XXXXXXXX"
        android:name="${applicationName}"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <meta-data
              android:name="io.flutter.embedding.android.NormalTheme"
              android:resource="@style/NormalTheme"
              />
            <meta-data
              android:name="com.google.android.gms.ads.APPLICATION_ID"
              android:value="ca-app-pub-XXXXXXXXX~XXXXXX"
            />

            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
```
ってことで公式のように`<application>`の次に記述位置を変更。

ビルドに成功しました。クラッシュも起きません。やっと解決できた（ここまで２日）

## まとめ
公式ドキュメントはよく読みましょう。そしてLog確認まじ大事。

今回デバイスのログを確認できることがわかって勉強になりました。はじめから正しくAdmob導入してたらこのLog確認には出会わなかったと思います。

エラー解決がエンジニアの成長になると感じた1件でしたw