もっふもふの電子回路

備忘録的なあれ

Visual Studio 2017 + Xamarinでクロスプラットフォーム開発(1)

背景

クロスプラットフォームアプリを作りたくて環境構築にひたすら手間取った話。

環境:
・windows10 Pro
Visual Studio 2017
・Xamarin 4.4
mac Sierra 10.12.4
Xcode 8.3.2
・Xamarin Studio 6.3(build 863) <-成功
Visual Studio for Mac <-失敗

Windowsメインで、macエミュレーターを起動させました。

ゴール

前回の環境でWindowsのVisual Studio2017にてテストアプリビルドによるAndroidエミュレータ起動まで確認できました。
今回はiOSエミュ起動がゴールです。

発生した問題

Visual StudioのXamarinクロスプラットフォーム アプリテンプレートのバグ

mac OSおよびXcodeを最新にし、Visual Studio for Macをインストール
Visual Studio for Macにてテストアプリがビルド&iOSエミュが立ち上がることを確認し、今度はWindows側でテストアプリにてビルドできるか確認。
しかしビルド時にいくつかの画像ファイルが読み込めないトラブルが発生した。
プロジェクトディレクトリ内のアプリ名.iOS/Resources 内にあるテンプレートからコピーされるはずの画像類、例えば「Default-568h@2x.png」など。
エラーメッセージから該当パスを確認するとブランク(真っ黒)になった画像ファイルが見つかった。

理由は不明だが、テンプレートからコピーする際にバイナリが壊れる模様。何度か試しても同様の結果になった。ちなみにテンプレートの大本の画像は無事だった。

仕方なくテンプレートをXamarin関係の別のものを使うことにし、人気順で一番上にきた「Prism Template Pack」を使用。
Prism Template Pack - Visual Studio Marketplace

インストール後に新規追加されたテンプレートを試すと上記問題は解消した。
f:id:gadgetcat:20170422192454p:plain


Xamarinのテンプレートは試験運用中ということで覚悟はしていたがこんな問題が起こるとは想定外だった。
ちなみにAutofacとかDrylocとかなにそれ怖い知らない。これも覚えた方がいいのかなぁ

iOS.exe conflicts with another assembly

続いてビルドしたところ、アプリ名+iOS.exeが競合しているというエラーが出現。
エラーメッセージで調べてもごく最近起こっている問題のようで、明確な解決策を見つけることができなかった。
もちろんMac側のビルドキャッシュを削除したり、該当ディレクトリに異常はないかはチェックした。

途方にくれていたがふとVisual Studio for Macはプレビュー版だったことを思い出し、いったんアンインストール
Xamarin Studioを入れた。
インストール後すぐにXamarin Studioの更新通知が。Xamarinで使うSDKを更新するぜ!という内容だったが、これが効いたのか無事Visual Studio 2017側からビルド成功、エミュレータが立ち上がることを確認した。


上記問題等により1日潰れてしまったが、エミュレータが立ち上がった時は震えた。
(そもそもMacで開発すればいいのでは?と思われるかもしれないが、自分は生粋のwindowerであるため却下)

次はIsolatedStorageあたりを使ってアプリ領域内にストレージを確保する処理を作りたい。
ちなみに自分はWPFアプリは開発経験があるが、iOSAndroidアプリはさっぱりなので大変苦労すると思う。

以上

XamarinとAndroid Studioの共存

背景

環境:
Windows 10
Visual Studio Community 2017

Xamarinでアプリを作ろうとしてインストールしたけどベースにしたいアプリがAndroid Studioで組まれたものだったので、とりあえずXamarin入れた後にAndroid Studio入れて、SDKはXamarinで入れたものを使おうとしたらパスにスペースが入ってたらあかんで!って言われてどうにかSDKを共存させようとした話。
SDKサイズ大きいのでね、節約したいですよね。

Xamarin側のSDKパスを変更

ツール->オプション->Xamarin->Androidの設定
よりパスをAndroid Studioで入れたものに変更
デフォルトだと C:\Users\xxxx\AppData\Local\Android\sdk

SDK ManagerのGUIが上がらない

上記パスに変更したらGUIが立ち上がらなくなった。
いろいろ調べても解決しなかったので途方に暮れていたらSDKディレクトリ内のSDK Readme.txtに書いてあった。

解決

To start the SDK Manager, please execute the program "SDK Manager.exe".

From the command-line you can also directly trigger an update by
executing:
  tools\android.bat update sdk --no-ui

…つまりあれか、Android Studioで入れたやつは勝手に"--no-ui"オプションをつけて立ち上げているのでは?と思い試しにXamarinで入れたSDKディレクトリ内のandroid.batをAndroid Studioで入れたSDK内に上書きした。
(.batの差分とったけどそれっぽい違いがあった。Android Studioから起動するSDK Managerは専用のGUIっぽいしね。)

f:id:gadgetcat:20170421121403p:plain
立ち上がったやんけ!

SDKAndroid Studioですでに入れたものがちゃんと出ている。

あーでも、Android StudioSDK Manager上げたらおかしくなるんじゃないの?と思って立ち上げてみたけどぱっと見問題なし。



とりあえずこれで無駄にディスク容量食わずに開発できそうです。
ただNDKはXamarinとAndroid Studioで要求バージョン違うので、とりあえず別個に入れてます。(あとで統一するかも)

注意点として

・XamarinでインストールしたSDK Managerは直接削除せずに「プログラムと機能」から削除すべき
Visual StudioインストーラーにてXamarinが入った状態で「変更」をクリックすると勝手にSDKが復活するので押さないこと(なんだこのクソ仕様)
(追記)
Android SDKディレクトリ内のadb.exeがVisual Studioを終了しても落ちない。VS落とした後に再度Androidをビルドしようとするとうまくいかなくなるかもしれないので都度落とした方がいいかも

以上