グレインの備忘録

プログラミング関係とかをつらつらと。

スクメロが起動しなくなった話

スクールガールストライカーズトゥインクルメロディーズ、通称「スクメロ」と呼ばれるゲームがある。

9月頭のメンテ直後に、全く起動することができなくなってしまった。

具体的には、タイトル画面でスタートするとデータダウンロードが入り、直後に落ちてしまうのである。

仕方がないので原因を調査してみる。

原因を調べる

apkの中身を見てみると、SmartBeatが搭載されていることが分かった。

f:id:grainrigi:20170910194742p:plain

SmartBeatというのはアプリのクラッシュを自動で報告するツールである。

SmartBeat スマホアプリのクラッシュ解析ツール

実はこのツール、ローカルにもクラッシュログを残すので、それを解析することで原因をつかめる可能性がある。

クラッシュログを見る

なお、クラッシュログを見るにはrootが必須となる。

格納場所は「/data/data/com.square_enix.android_googleplay.TwinkleMelodiesj/app_SmartBeat/dump_tmp/」である。

ダンプには二種類あって、バイナリとjson形式がある。

jsonの方を覗いてみると、ログが逐一記録されていた。

さて、例外が発生した付近のログは以下のようになっていた。

V/AudioManager(29685): isBluetoothA2dpOn...
I/Unity   (29685): UnauthorizedAccessException: Access to the path
"/storage/sdcard1/Android/data/com.square_enix.android_googleplay.TwinkleMelodiesj/files/nettemp/2o8rsp89.n51"
is denied.
I/Unity   (29685):   at System.IO.File.SetAttributes (System.String path, FileAttributes fileAttributes) [0x00000] in :0 
I/Unity   (29685):   at RQ.Network.RQ_NetworkManager.OnInitialize () [0x00000] in :0 
I/Unity   (29685):   at RQ.Common.SingletonBehaviour`1[T].RegisterInstance () [0x00000] in :0 
I/Unity   (29685):  
I/Unity   (29685): (Filename: currently not available on il2cpp Line: -1)
I/Unity   (29685): 
D/dalvikvm(29685): GC_CONCURRENT freed 6127K, 58% free 5286K/12380K, paused 3ms+9ms, total 48ms
D/dalvikvm(29685): WAIT_FOR_CONCURRENT_GC blocked 35ms
V/AudioManager(29685): isBluetoothA2dpOn...
D/dalvikvm(29685): GC_FOR_ALLOC freed 873K, 56% free 5454K/12380K, paused 21ms, total 21ms
I/dalvikvm-heap(29685): Grow heap (frag case) to 8.624MB for 369706-byte allocation
V/AudioManager(29685): isBluetoothA2dpOn...
V/AudioManager(29685): isBluetoothA2dpOn...
V/AudioManager(29685): isBluetoothA2dpOn...
V/AudioManager(29685): isBluetoothA2dpOn...
V/AudioManager(29685): isBluetoothA2dpOn...
V/AudioManager(29685): isBluetoothA2dpOn...
V/AudioManager(29685): isBluetoothA2dpOn...
V/AudioManager(29685): isBluetoothA2dpOn...
V/AudioManager(29685): isBluetoothA2dpOn...
V/AudioManager(29685): isBluetoothA2dpOn...
V/AudioManager(29685): isBluetoothA2dpOn...
V/AudioManager(29685): isBluetoothA2dpOn...
V/AudioManager(29685): isBluetoothA2dpOn...
V/AudioManager(29685): isBluetoothA2dpOn...
V/AudioManager(29685): isBluetoothA2dpOn...
V/AudioManager(29685): isBluetoothA2dpOn...
V/AudioManager(29685): isBluetoothA2dpOn...
V/AudioManager(29685): isBluetoothA2dpOn...
V/AudioManager(29685): isBluetoothA2dpOn...
V/AudioManager(29685): isBluetoothA2dpOn...
V/AudioManager(29685): isBluetoothA2dpOn...
V/AudioManager(29685): isBluetoothA2dpOn...
V/AudioManager(29685): isBluetoothA2dpOn...
V/AudioManager(29685): isBluetoothA2dpOn...
V/AudioManager(29685): isBluetoothA2dpOn...
V/AudioManager(29685): isBluetoothA2dpOn...
E/dalvikvm(29685): JNI ERROR (app bug): accessed stale local reference 0x1d200001 (index 0 in a table of size 0)
E/dalvikvm(29685): VM aborting
V/AudioManager(29685): isBluetoothA2dpOn...

発生しているのは「UnautorizedAccessException」、つまり非許可のファイル操作に関する例外である。

操作対象のファイルは「/%AppData%/files/nettemp/2o8rsp89.n51」である。

フォルダの名前からして一時ファイルであろう。

ファイルを消して再起動

試しにnettempフォルダ以下のファイルを消して再起動してみる。

すると、途中で落ちることなく正常に動作した

どうやらnettempフォルダ以下のファイル操作に瑕疵があるようだ。

解決策

スクメロが勝手に落ちるときには、「(ストレージ直下)/Android/data/com.square_enix.android_googleplay.TwinkleMelodiesj/files/nettemp」フォルダ以下のファイルを消してみるとよい、と思われる。