今回はAndroidのアプリを起動したら即クラッシュした際の調査方法を記載していきます。
今回のパターンはjerkinsを用いたビルド時とローカル環境でビルドした場合になります。
※必ずこれで解決するよという物ではないですが。。。
アプリ開発をしていた際にリモートプッシュ通知を入れる必要がありFirebaseのCloudMessaging(FCM)のプラグインをUnity Package Manager(UPM)を使いプライグインを追加しました。
※UPMについては割愛します。
またFiebase以外にも要件によって他のプライグインを入れる事があるかと思います。今回ハマったのはまさにそういう状況の時に発生しました。
プッシュ通知に必要なgoogle-services.jsonも用意しjerkinsでAndroidビルドを行い無事apkファイルが作成
その後起動確認をおこなったのですが起動してすぐクラッシュするという事態になりました。
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/cloudmessaging/Rpc:
~
java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.cloudmessaging.Rpc"
~
とAndroidのアプリ開発をしていれば一度は目にした事があるであろうエラー文が飛び込んできます。
またかと。。。
このエラーはそんなクラスないよと言われています。
これが出た場合は大体が難読化に引っかかっておかしくなってるんだなと思うはずです。
なので
proguard-user.txtに
-keep class com.google.android.gms.cloudmessaging.** { *; }
と記載して再度確認
↓
変わらず
なので今度は必要なプライグインだけ入れたアプリをローカル環境で作成 -> 起動してみました。
開発が進むとリソースが増えて一回当たりのビルド時間も増えるので必要な物だけを入れた最小プロジェクトを作って調査を行ったりします。
すると普通に起動しました。解せぬ
ただ作れる事はわかったのでここからはローカル環境で作ったアプリとクラッシュしたアプリの差分を見ていく工程になります。
その際使用するのはAndroidStudioを使用します。
Fire => profile or Debug APKを選択しローカル環境で作ったアプリを選択します。
こんな感じでアプリの中身が確認する事が出来ます。
同じようにクラッシュしたアプリを選択し別Windowで表示します。
後は2つのアプリの差分を見ていく作業をしていきます。
・まず確認するのは○○.propertiesファイルを見ていきます。
これはプライグインのバージョンが記載されているファイルになるのでこのファイルに記載されているバージョンが2つのアプリで同じかどうかを見ていきます。
・次に確認するのはローカル環境で作ったアプリにあるのにクラッシュしたアプリにはない○○.propertiesがあるかを探します。
上記2つどちらか当てはまる場合プライグインが正しく入っていない可能性が高いです。
バージョンが合っていないライブラリと入っていないライブラリを追加するように記載していく作業を行います。
launcherTemplate.gradle
mainTemplate.gradle
の
dependencies内に当てはまる○○.propertiesの物を記載していきます。
記載する名称がわからない場合は○○.propertiesに記載されているclient=の箇所で検索エンジンで検索をすると引っ掛かるのでそれを元に記載していきます。
後はこれの繰り返しで必要な物を全部書いていきます。