Xamarinが無償化したのでさっそくアプリ開発をしていたのですが、Debugビルド時には動くのにReleaseビルド時アプリ起動直後にエラーログすら出さずに落ちるという事態に遭遇したので、暫定的に対処した方法を載せておきます(もし、解決法やこの場合のエラーログの表示のしかたを知っている方がいたらコメントお願いします)
追記)設定を少し弄ったらエラーの一部だけ見えるようになり、もう少しマシな暫定的な対処法を見つけたので記事の下のほうに追加しておきました
ソリューション構成
すべてC#プロジェクトで
- Blank App(Android)
- クラスライブラリ(iOS、Android、Windowsのポータブル)
- コンソールアプリケーション
Blank App(Android)とコンソールアプリケーションがクラスライブラリ(iOS、Android、Windowsのポータブル)を参照に追加しているという形です(コンソールアプリケーションはテスト用なのでこの場合は関係ないかと思います)
Nuget
- ReactiveProperty
- Xamarin.Android.Support.v7.AppCompat
- Xamarin.Android.Support.v7.CardView
と、これらが依存しているものを使用しています
原因探し
とりあえずぐーぐる大先生に聞いてみたところXamarin.AndroidでReleaseビルドの時のみSystem.Servicemodel.ChannelFactoryでエラーが出た。を発見しました
似たような内容っぽかったのでこれで直せると思い、さっそくリンカーファイルを弄ったのですがそれでも変わらず…
他の記事がないかと探しているとaxilis.blog - Android release build MissingMethodException with Xamarin 4 upgradeというものが出てきたのですが、これも違いました…
ここで、どうやらリンカー関連でなにかあるとわかったのでプロジェクトのプロパティを見てみることにしました
まず最初にLinkingをSdk Assemblies OnlyからSdk and User Assembliesに変更、これでも変わらず。
そのままじっと眺めていると
ここのLinkerの設定がDebugとReleaseで分けられていることに気づきました
そしてReleaseビルドはSdk Assemblies OnlyだったのですがDebugビルドはNoneでした。ここにDebugとReleaseの違いがあったのでReleaseビルドのLinkingをNoneにしたところちゃんと動きました!!!
原因
やはりリンカー関連でしたがリンクすると落ちるとは
ここの通りにしていたのでアプリの容量減らすためにReleaseビルドはリンクするものと思ってたのですがしなくてもいいみたいですね(アプリ容量は2倍になったけど)
暫定的な対処法1
Releaseビルド時アプリ起動直後で落ちて解決法がわからなかったらLinkerのLinkingをNoneにするとアプリ容量は増えますが動くようになります
暫定的な対処法2
リンクしないとアプリ容量が大きくなってしまうのでどうにかならないかなぁと頑張っていたら、デバックモードでのプロジェクトのAndroid OptionsのUse Shared Runtimeをオフにしたらほんの少しですがエラーメッセージが表示されました
これがView.FindViewByIdメソッドのとこで出てたんですが詳細なメッセージはどこに…
(FindViewByIdをコメントアウトして動かすとエラーメッセージ出してくれなくなるのでこれだけを頼りにすることにしました)
ということなので、FindViewByIdのあるアセンブリMono.Androidをリンクから外したらなぜか動きました
(Mono.Androidのリンクが失敗しているのかリンク自体が失敗しているけど実際に使用しているのはMono.Androidだけなのかどっちなんでしょうかね?)
対処法をまとめると
- LinkingをSdk Assemblies Onlyに(Sdk and User Assembliesだと落ちました)
- Skip Linking AssembliesにMono.Androidを追記
これでLinking:Noneから8MBぐらい削れました