はつねの日記

Kinect, Windows 10 UWP, Windows Azure, IoT, 電子工作

Xamarin.Androidで必要なXamarin.Android.Supportライブラリが大幅に少なくなった件

事の発端は、Xamarin.Forms 4.4だったXamarin.AndroidなプロジェクトをXamarin.Forms 4.6に上げたときにエラーが発生したことでした。

なお、Xamarin.iOSなプロジェクトはすんなりとXamarin.Forms 4.6にビルドエラーなく移行できておりましたので、本当になぞで2日ほど(途中、ACE COMBAT 7やWorld of Warshipなどをやりながら)かかりっきりでした。

そもそもとして、Xamarin.Forms 4.4まではTargetFrameworkとしてAndroid 8.1が指定できましたが、Xamarin.Forms 4.5以降ではTargetFrameworkの最小値がAndroid 9.0に変更になっていたため、もろもろの関係でしばらく上げられずにいたのですが、準備が整ったのでXamarin.Forms 4.6にnugetでさっと上げてみたのです。

するのなんということでしょう。さらに多くのライブラリを入れる必要を示唆されるではありませんか。

f:id:hatsune_a:20200531183731p:plain

でも必要だっていうのだから仕方がありませんね。[OK]を押して追加しましょう。

GItの機能を使って修正前の状態に何度も戻しながら試しました。

しかし。

クリーンしてからリビルドしてもビル度エラーは取れません。

Visual Studioを終了して、プロジェクト配下のbinフォルダとobjフォルダを削除してプロジェクトを再度開いてビルドしてもビル度エラーは取れません。

これは、TargetFrameworkをAndroid 9.0(ビルドエラー調査の途中で4.4のまま9.0にする分にはビルドエラーにならないことは発見)にするだけで、Xamarin.Formsは一生4.4で生きていくしかないのかとあきらめかけました。

しかしそんなとき、滝沢先生の「お前ら4.4か!4.4な人間なのか!いつ何をやるのもいい加減にして、一生4.4のまんま終わるのか!それでいいのか!お前らそれでも男か!悔しくないのか!」と叱咤される声が脳裏に響きました。

「くやしいです!」「よーし!何がんでも4.6にしてやるぞ!」「でもどうしたらいいだ」

そうだ、初心だ!。私たちにはVisual Studioの新規プロジェクト作成のテンプレートがあるじゃないか!

しかし、ここで問題が発生しました。Xamarin.Formsプロジェクトは共有プロジェクトとしてXamarin.iOSプロジェクトとXamarin.Androidプロジェクトから共有したかったのですが、Visual Studio 2019の新規プロジェクト作成では、以前はあったPCLプロジェクトか共有プロジェクトかの選択チェックボックスがありません。

f:id:hatsune_a:20200531191141p:plain

しかたがなしにこのまま進めると、Xamarin.Forms部分はPCLではなく.NET Standard 2.0プロジェクトとしてソリューションが作られます。

しかし、希望もありました。明らかにXamarin.Android.Support関連のライブラリが少ないのです。でも、油断は禁物です。もしかしたら、共有プロジェクトではないからそうなっているのかもしれません。

Xamarin.Formsなテンプレートではなく、Xamarin.Androidなテンプレートで作成し、後から共有プロジェクトとしてXamarin.Formsプロジェクトを確認してみましょう。

するとどうでしょう。あれだけあったXamarin.Android.Support関係のライブラリがたった2つだけになってしまったではありませんか。

Xamarin.Formsをいれても、たったの3つ。

最初、Xamarin.Forms 4.6に上げたときに要求された追加のライブラリも必要ありません。 

f:id:hatsune_a:20200531184442p:plain

もちろん、デザインによっては追加でnugetするものも増えるかもしれません。

しかし、Xamarin.Formsを使ってそれなりのデザインを作っていた元のソリューションに移植してみて実機動作を確認してみても、この3つだけで、きちんと実機で動作確認ができました。

意図せずnugetで取得必要なライブラリの整理もできて(つまり実行モジュールサイズが小さくなって)無事に意図したXamarin.Forms 4.6化も完了しました。

やはり、時々はミニマムサンプルで最新のお作法を振り返ってみる必要がありますね。

 

追記:

なお、重要なのは新しく作ったXamarin.Androidプロジェクトのcsprojファイルの内容を使うことになります。つまり、(既存と同名で別フォルダに)新しいXamarin.Androidプロジェクトを作成して、既存のXamarin.Androidプロジェクトから要素をコピーして新しい状態をつくり保存したら、csprojファイルを既存のプロジェクトフォルダの方の同名ファイルに上書き保存することです。