【Xamarin】【Android】Releaseビルドでクラッシュする

みなさんどうもこんにちは.それともこんばんはかな?まぁそんなことはどうでもいいんですけどね
ちょっと最近Androidアプリを作ってて,Debugビルドでは実行できたのにReleaseビルドで実行しようとするとcrashするっていう問題に直面したのでその解決法をば

環境

筆者の環境はこんな感じです

  • Visual Studio for mac
  • Xamarin.Android
  • Xamarin.Android.Support.v7
  • Xamarin.Android.Support.Design

エラー内容

冒頭で書いたように、Debugでは動いていたのにReleaseではcashしてしまいました。
「ははーん?これは最適化に殺されてるな???」と思い最適化オプションを消してみるもダメ、proguardを無効化してもダメで、デバッグ情報を有効化してログを見てみると次のような出力が….(一部抜粋)

[oa.info.awesom] JIT profile information will not be recorded: profile file does not exits.
[chatty] uid=10480(com.milkcocoa.info.awesome) identical 2 lines
[oa.info.awesom] JIT profile information will not be recorded: profile file does not exits.
[Perf] Connecting to perf service.
[MultiDex] VM with version 2.1.0 has multidex support
[MultiDex] install
[MultiDex] VM has multidex support, MultiDex support library is disabled.
[monodroid] Using runtime path: /data/app/com.milkcocoa.info.awesome-i5L0m72RdBtkn1HaS4JBbg==/lib/arm64
[monodroid-gc] GREF GC Threshold: 46080
[MonoDroid] UNHANDLED EXCEPTION:
[MonoDroid] Java.Lang.Exception: Binary XML file line #17: Binary XML file line #17: Error inflating class android.support.v7.widget.FitWindowsLinearLayout ---> Java.Lang.Exception: Binary XML file line #17: Error inflating class android.support.v7.widget.FitWindowsLinearLayout ---> Java.Lang.ClassNotFoundException: Didn't find class "android.support.v7.widget.FitWindowsLinearLayout" on path: DexPathList[[zip file "/data/app/com.milkcocoa.info.awesome-i5L0m72RdBtkn1HaS4JBbg==/base.apk", zip file "/data/app/com.milkcocoa.info.awesome-i5L0m72RdBtkn1HaS4JBbg==/split_config.arm64_v8a.apk", zip file "/data/app/com.milkcocoa.info.awesome-i5L0m72RdBtkn1HaS4JBbg==/split_config.en.apk", zip file "/data/app/com.milkcocoa.info.awesome-i5L0m72RdBtkn1HaS4JBbg==/split_config.ja.apk", zip file "/data/app/com.milkcocoa.info.awesome-i5L0m72RdBtkn1HaS4JBbg==/split_config.xxhdpi.apk"],nativeLibraryDirectories=[/data/app/com.milkcocoa.info.awesome-i5L0m72RdBtkn1HaS4JBbg==/lib/arm64, /data/app/com.milkcocoa.info.awesome-i5L0m72RdBtkn1HaS4JB
[MonoDroid]    --- End of inner exception stack trace ---
[MonoDroid]    --- End of inner exception stack trace ---
[MonoDroid]   at Java.Interop.JniEnvironment+InstanceMethods.CallNonvirtualVoidMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniObjectReference type, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x00089] in <37191630a9c74e2ab3c5c7bfb52d8068>:0 
[MonoDroid]   at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeVirtualVoidMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x0005d] in <37191630a9c74e2ab3c5c7bfb52d8068>:0 
[MonoDroid]   at Android.App.Activity.SetContentView (System.Int32 layoutResID) [0x00022] in :0 
[MonoDroid]   at awesome.MainActivity.OnCreate (Android.OS.Bundle savedInstanceState) [0x0000e] in <951e60f1a02b47e7813fb005e32cb74d>:0 
[MonoDroid]   at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (System.IntPtr jnienv, System.IntPtr native__this, System.IntPtr native_savedInstanceState) [0x00011] in :0 
[MonoDroid]   at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.3(intptr,intptr,intptr)
[MonoDroid]   --- End of managed Java.Lang.Exception stack trace ---
[MonoDroid] android.view.InflateException: Binary XML file line #17: Binary XML file line #17: Error inflating class android.support.v7.widget.FitWindowsLinearLayout
[MonoDroid] Caused by: android.view.InflateException: Binary XML file line #17: Error inflating class android.support.v7.widget.FitWindowsLinearLayout
[MonoDroid] Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v7.widget.FitWindowsLinearLayout" on path: DexPathList[[zip file "/data/app/com.milkcocoa.info.awesome-i5L0m72RdBtkn1HaS4JBbg==/base.apk", zip file "/data/app/com.milkcocoa.info.awesome-i5L0m72RdBtkn1HaS4JBbg==/split_config.arm64_v8a.apk", zip file "/data/app/com.milkcocoa.info.awesome-i5L0m72RdBtkn1HaS4JBbg==/split_config.en.apk", zip file "/data/app/com.milkcocoa.info.awesome-i5L0m72RdBtkn1HaS4JBbg==/split_config.ja.apk", zip file "/data/app/com.milkcocoa.info.awesome-i5L0m72RdBtkn1HaS4JBbg==/split_config.xxhdpi.apk"],nativeLibraryDirectories=[/data/app/com.milkcocoa.info.awesome-i5L0m72RdBtkn1HaS4JBbg==/lib/arm64, /data/app/com.milkcocoa.info.awesome-i5L0m72RdBtkn1HaS4JBbg==/base.apk!/lib/arm64-v8a, /data/app/com.milkcocoa.info.awesome-i5L0m72RdBtkn1HaS4JBbg==/split_config.arm64_v8a.apk!/lib/arm64-v8a, /data/app/com.milkcocoa.info.awesome-i5L0m72RdBtkn1HaS4JBbg==/split_config.en.apk!/lib/arm64-v8a, /data/app/com.milkcocoa.info
[MonoDroid]     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
[MonoDroid]     at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
[MonoDroid]     at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
[MonoDroid]     at android.view.LayoutInflater.createView(LayoutInflater.java:606)
[MonoDroid]     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790)
[MonoDroid]     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
[MonoDroid]     at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
[MonoDroid]     at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
[MonoDroid]     at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
[MonoDroid]     at android.support.v7.app.AppCompatDelegateImpl.createSubDecor(Unknown Source:220)
[MonoDroid]     at android.support.v7.app.AppCompatDelegateImpl.ensureSubDecor(Unknown Source:4)
[MonoDroid]     at android.support.v7.app.AppCompatDelegateImpl.setContentView(Unknown Source:0)
[MonoDroid]     at android.support.v7.app.AppCompatActivity.setContentView(Unknown Source:4)
[MonoDroid]     at md54708142af6964262d7e5e35f9b072f37.MainActivity.n_onCreate(Native Method)
[MonoDroid]     at md54708142af6964262d7e5e35f9b072f37.MainActivity.onCreate(Unknown Source:0)
[MonoDroid]     at android.app.Activity.performCreate(Activity.java:7136)
[MonoDroid]     at android.app.Activity.performCreate(Activity.java:7127)
[MonoDroid]     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1272)
[MonoDroid]     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2899)
[MonoDroid]     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3054)
[MonoDroid]     at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
[MonoDroid]     at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
[MonoDroid]     at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
[MonoDroid]     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1814)
[MonoDroid]     at android.os.Handler.dispatchMessage(Handler.java:106)
[MonoDroid]     at android.os.Looper.loop(Looper.java:280)
[MonoDroid]     at android.app.ActivityThread.main(ActivityThread.java:6706)
[MonoDroid]     at java.lang.reflect.Method.invoke(Native Method)
[MonoDroid]     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
[MonoDroid]     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
[MonoDroid]     Suppressed: java.io.IOException: No original dex files found for dex location /data/app/com.milkcocoa.info.awesome-i5L0m72RdBtkn1HaS4JBbg==/split_config.arm64_v8a.apk
[MonoDroid]         at dalvik.system.DexFile.openDexFileNative(Native Method)
[MonoDroid]         at dalvik.system.DexFile.openDexFile(DexFile.java:354)
[MonoDroid]         at dalvik.system.DexFile.(DexFile.java:101)
[MonoDroid]         at dalvik.system.DexFile.(DexFile.java:75)
[MonoDroid]         at dalvik.system.DexPathList.loadDexFile(DexPathList.java:394)
[MonoDroid]         at dalvik.system.DexPathList.makeDexElements(DexPathList.java:354)
[MonoDroid]         at dalvik.system.DexPathList.(DexPathList.java:164)
[MonoDroid]         at dalvik.system.BaseDexClassLoader.(BaseDexClassLoader.java:74)
[MonoDroid]         at dalvik.system.BaseDexClassLoader.(BaseDexClassLoader.java:65)
[MonoDroid]         at dalvik.system.PathClassLoader.(PathClassLoader.java:64)
[MonoDroid]         at com.android.internal.os.ClassLoaderFactory.createClassLoader(ClassLoaderFactory.java:73)
[MonoDroid]         at com.android.internal.os.ClassLoaderFactory.createClassLoader(ClassLoaderFactory.java:88)
[MonoDroid]         at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:74)
[MonoDroid]         at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:40)
[MonoDroid]         at android.app.LoadedApk.createOrUpdateClassLoaderLocked(LoadedApk.java:732)
[MonoDroid]         at android.app.LoadedApk.getClassLoader(LoadedApk.java:815)
[MonoDroid]         at android.app.LoadedApk.getResources(LoadedApk.java:1037)
[MonoDroid]         at android.app.ContextImpl.createAppContext(ContextImpl.java:2345)
[MonoDroid]         at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5773)
[MonoDroid]         at android.app.ActivityThread.access$1100(ActivityThread.java:205)
[MonoDroid]         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656)
[MonoDroid]         … 6 more

まず初めに目に付いたのが,54行目で No original dex files found for dex locationって言われてるから,Multi-dexオプションがダメなのかなって思って無効化してみたけど相変わらずのcrash

で,11行目とか21行目とかで出てくるandroid.view.InflateException: Binary XML file line #17: Binary XML file line #17: Error inflating class android.support.v7.widget.FitWindowsLinearLayoutってエラーなんだけど,こんなレイアウト身に覚えがないんだよね.

このレイアウトを検索ワードに指定してみると、ソースコードからは見つからず、中間ビルドのディレクトリにあるxmlから見つかりました。
つまり、これは僕の書いたコードと無関係の部分でcrashしていることがわかりました。
いっけな〜い殺意殺意🎶って気分でしたね笑

解決法

なんか調べてみると同じことになってる人は沢山いるみたいです。日本人にはあんまおらんみたいですけど。

結論から言うと、以下のアセンブリをリンクするとクラッシュしてしまうみたいですね。

  • Xamarin.Android.Support.v4
  • Xamarin.Android.Support.v7

てことで、リンク対象からこいつらを外してやれば無事解決ってわけです。サポートライブラリってリンクしちゃいけないんですね。。。

てことで,リンカーのセクションをこんな感じに設定します.

こいつらを再インストールすれば治るとか言った情報もあるようなので一概にこれといった解決方法はないのかもしれませんが,気になったら試してみてください.

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です