質問: ### 前提・実現したいこと Unityでゲームを作っています。 多くの機種で正常に動きますが、何種類かの機種で以下のエラーメッセージが発生し、アプリが起動しません。 私は今回が初の開発なのでandroidの知識が浅く、何によってエラーが出ているか分からない状態です。 ゲーム作成中のエラーは実機で試しながら行えたのですが、これはFirebaseで得られたログです。 その後同じ機種をFirebaseのTestLabやAWSのDeviceFarmで試した結果、エラーが出ていることは確認できています。(その時のLogcatの見方が分からず、どこでエラーが出ているか分かりませんでした。(Errorは多くあったのですが、すべてが「アプリが起動しない」に直結するErrorではないため)) 以下エラーメッセージの原因が分かる方がいれば、教えて欲しいです。 よろしくお願いいたします。 ### 発生している問題・エラーメッセージ ``` Fatal Exception: java.lang.Error: FATAL EXCEPTION [main] Unity version : 2019.3.14f1 Device model : samsung SM-A505U1 Device fingerprint: samsung/a50ue/a50:9/PPR1.180610.011/A505U1UEU2ASH6:user/release-keys Caused by java.lang.Error: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** Version '2019.3.14f1 (2b330bf6d2d8)', Build type 'Release', Scripting Backend 'il2cpp', CPU 'arm64-v8a' Build fingerprint: 'samsung/a50ue/a50:9/PPR1.180610.011/A505U1UEU2ASH6:user/release-keys' Revision: '10' ABI: 'arm64' Timestamp: 2021-02-28 17:20:45+0900 pid: 5318, tid: 5495, name: Vulkan Submissi >>> 「ゲーム名」<<< uid: 12217 signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 Cause: null pointer dereference x0 0000007752d74ce8 x1 00000076ce000000 x2 ffffff8932000000 x3 000000775ceee1dc x4 00000076dadb9f80 x5 00000076de2f16c0 x6 0000000000000100 x7 0000000000000006 x8 0000000000000000 x9 ffffff8932000000 x10 000000000087c040 x11 0000000000000000 x12 0000000000000100 x13 0000000000000006 x14 0000000000000000 x15 0000000000000002 x16 000000775299da78 x17 00000077f209dcf0 x18 0000000000000038 x19 ffffff8932000000 x20 00000076ce000000 x21 0000000000000000 x22 0000000000000006 x23 0000000000000000 x24 00000076de2f15f0 x25 0000000000000028 x26 0000007752d74690 x27 ffffff8932000000 x28 00000076eb3e1908 x29 00000076eb779238 sp 00000076e71fb260 lr 000000775ceee2f0 pc 000000775d154438 backtrace: 00 pc 000000000070f438 /vendor/lib64/egl/libGLES_mali.so (BuildId: 4eb6cc22350e545f73f0ae424a8499b6) 01 pc 00000000004a92ec /vendor/lib64/egl/libGLES_mali.so (BuildId: 4eb6cc22350e545f73f0ae424a8499b6) 02 pc 00000000004a91f0 /vendor/lib64/egl/libGLES_mali.so (vkFlushMappedMemoryRanges+20) (BuildId: 4eb6cc22350e545f73f0ae424a8499b6) 03 pc 000000000073f50c /data/app/「ゲーム名」-1e6xwERrV29wlkDZJROczA==/lib/arm64/libunity.so (BuildId: 532d8d524ea517bb96c77e9bf471ec218a2a798d) 04 pc 000000000073e530 /data/app/「ゲーム名」-1e6xwERrV29wlkDZJROczA==/lib/arm64/libunity.so (BuildId: 532d8d524ea517bb96c77e9bf471ec218a2a798d) 05 pc 000000000073d6c0 /data/app/「ゲーム名」- at libGLES_mali.0x70f438() at libGLES_mali.0x4a92ec() at libGLES_mali.vkFlushMappedMemoryRanges(vkFlushMappedMemoryRanges:20) at libunity.0x73f50c() at libunity.0x73e530() at libunity.0x73d6c0() at libunity.0x586900() at libc.__pthread_start(void*)(__pthread_start:196) at libc.__start_thread(__start_thread:68) ```
回答: とりあえずスタックトレースからわかることは、 `vkFlushMappedMemoryRanges`の呼び出しにおいて、Mali のVulkanドライバの内部でnull pointer dereferenceによりsegfaultしている、ということですが、 Unityのエンジン部分のソースコードがないので、 * 何かVulkanのデバイスメモリ関連の仕様違反があり未定義動作に頼っていたのが一部のデバイスで問題が顕在化しているのか、 * または単純にMaliのVulkanドライバにバグがあるのか、 というのを判断するのが難しい所はあると思います. 挙げられている端末は皆Maliを積んでいるもののようですが、Adrenoの端末では起きていないということでしょうか? ただ一般論として、Android端末の、特に7.0とかでVulkan 1.0の対応がし始められた頃の端末に入っているVulkanドライバの実装は割とバグが多くなかなか信用ならんことで有名で、 更にAndroid端末のグラフィクスドライバが更新される、ということがなかなか難しいこともあり、 (GPUのベンダが更新し、端末の製造会社が対応し、キャリアがAndroidアップデートと一緒に配信する、が全部起こる必要があるため) 自社エンジンを使っているような大手の開発会社によるアプリでも、例えばAndroid 7.1の端末から、だとかVulkan 1.1対応の端末から、のように制限をしてVulkanを有効にし、 当てはまらない場合はGLES3を使う、のようにしていることもある[roblox-graphics-apis-2019]、というのが現状です. 特にGalaxy S6はかなり古いですよね. また同じ機種でも、使用者のアップデートの状況によって、Vulkanドライバのバージョンが異なることも考えられると思います. Unityに詳しくないのですが、今回のゲームはVulkanを使用しないとダメなものでしょうか? バックエンドのグラフィクスAPIをGLES3のみ、としてAPKを作る、というわけにはいかないでしょうか? どうしてもVulkanでいきたい!の場合は、端末やそのAndroidバージョンによって配信を制限する必要が出てくるかと思います.