ラベル Xamarin の投稿を表示しています。 すべての投稿を表示
ラベル Xamarin の投稿を表示しています。 すべての投稿を表示

2019年11月25日月曜日

近況

最近開発に没頭していたので、更新が滞ってます。
販売しているAndroidアプリに新機能を搭載することにしたので、そのための調査とコーディングが大変なのです。
XamarinのプロジェクトにJavaソースを加えて、C#からJavaをコールする方法(Managed Callable Wrapper、通称MCWが必要)や、C++ソースを加えてJNIで呼び出す方法など、色々勉強になりました。
C++のライブラリ(.SO)側でSignalを発行するような致命的エラーが発生した場合に、これをAndroidのVM側で検知する方法がまだわかりません(エラーと同時にアプリも落ちてしまう)。
C++側でSignalハンドラをフックして、Javaの例外に変換する方法があるようなのですが、JavaVM自体はSignalハンドラを利用して色々やっているらしく、ハンドラをフックするとハングアップするなど、うまくいきません。
平日は2時間くらいしか時間が取れず、土日も色々忙しいので…。

2019年11月9日土曜日

Xamarin デバッガーが動かなくなる

Xamarinのデバッガーが動かなくなった…。
メッセージは以下の通り。
デバッガーに接続できませんでした。詳細については Xamarin 診断出力を、例外の詳細についてはログをご覧ください。
色々ググってプロジェクトプロパティ→Androidオプション→共有ランタイムの使用のチェックを外したら動いた。
設定→アプリで、Mono Shared RuntimeとXamarin.Android API-28 Supportをアンインストールしたら、「共有ランタイムの使用」「Fast Deployment」を戻しても大丈夫になった。時間を1時間ほど浪費した。
最近Xamarinに悩まされることが減りましたが、久々にやられました。
疲れた。

2019年11月2日土曜日

XamarinでTargetSdkVersion28対応


11月に入ったので、GooglePlayの要件で今後のバージョンアップ時はAndroid9対応(TargetSdkVersion=28)にしないとアップロードできなくなります。
ということで先送りし続けてきた対応作業に入ります。
ネットで検索した限りでは、9からはフォアグラウンドサービスを使用するアプリには、新たにパーミッションが必要とのこと。デンジャラスパーミッションではないので、マニフェストで宣言するだけで終了です。



まずはアプリケーションのターゲットフレームワークをAndroid9に変更。こちらはXamarinの設定になります。
これでAndroidマニフェスト設定画面に新しいパーミッションが表示されるようになります。ちなみにAndroidのTargetSdkVersionと同じにしないとXA1008のWarningが出ます。

こちらが本命の設定。
さっそく再コンパイルしてAndroid9のエミュレータでアプリを起動してみます。

…あっさり動きました。

あれっ。こんなに簡単に終わるんだっけ。Android8.0のXPERIA実機でも問題なく動きました。もうちょっとAndorid9の変更点を確認してみます。


2019年10月21日月曜日

Xamarin Android App Bundle エラー

Xamarinがコンソールレベルで、Androidの新しいアプリ公開パッケージ方式であるAndroid App Bundleに対応しているので試してみました。

ココを参考にさせてもらって、aabファイルが出来たまでは良かったのですが、いざPlay Consoleで登録して公開後、手持ちのスマホでダウンロードしてみたら、インストールはできたものの、起動直後に「問題が発生したため、XXXXを終了します。」となってアプリが起動しない。

先週公開されたXamarin 10.1 preview releaseでは、ようやくIDEがAndroid App Bundleに対応し、アーカイブ機能も対応したようです。もうちょっと待とうかな。10月中にAndroid App Bundleでバージョンアップ版を公開したいのですが…。

Android9対応期限である11月1日の前にバージョンアップ版を公開したいので原因調査してなんとか対応させることにしました。まずはVisual Studioを16.3.5にアップデートし、Xamarinを10.0に。Androidオプションにaapt2の設定が出現しました。
csprojでAndroidPackageFormatをaabに設定すれば、強制的にaapt2がtrueに設定されるらしいのですが。
ということで、再度msbuildを実行。aabファイルができましたが、これまでより若干サイズが大きい。さっそくPlay Consoleにアップロード。今度はいけるか?


ダメでした。
---
その後、クラッシュレポートのスタックトレースにヒントを発見。
resources/rawフォルダ内のファイルに対して、NotFoundExceptionが発生しているので、とりあえずrawフォルダとリソースを参照するロジックをカット。これでエラーは回避できましたが、さらに広告絡みのエラーが出ました。インストール後の初回起動時のみエラーが発生するという不可解な現象ですが、ネットで事例がチラホラ。
com.google.android.gms.measurement.AppMeasurementInstallReferrerReceiver
のClassNotFoundExceptionです。
こちらはAndroidの不要コードを削除する機能(ProGuard)の問題で、当該クラスの削除抑制を指示することで対応可能なようです。configに追加オプションを書けばいいらしいのですが、R8を指定している場合も、互換があるので同じで良さそうです。
以下のオプションを追記します。

-keep class com.google.android.gms.** { *; }
-keep class com.google.firebase.** { *; } 

Xamarinの場合はAndroidSDKのフォルダにある..\tools\proguard\proguard-android.txtに追記してやれば良いみたいです。

諦めかけましたが、何とかApp Bundle対応できてよかった。
ということで次はAndroid9(minSdkVersion=28)対応です。
SupportLibraryからAndroidXへの移行はどうしようかな…。

2019年5月27日月曜日

Xamarin.Androidでアプリ 64bit対応

Googleからメールが来ました。
公開しているアプリを8月1日までに64bit対応版もリリースするように!
という通告です。
Xamarin.Androidで対応するには?

オプションで「サポートされているアーキテクチャ」に「arm64-v8a」を加えるだけでいいんでしょうか?

→いいようです。

2019年4月8日月曜日

VS2019でXamarinのエラー

プロジェクトのプロパティのうち、「ビルド」「ビルドイベント」「参照パス」を開こうとすると以下のようなエラーが…。
==
ページの読み込み中にエラーが発生しました。
ファイルまたはアセンブリ'Microsoft.VSDesigner, Version=16.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'、またはその依存関係の1つが読み込めませんでした。指定されたファイルが見つかりません。
==


なんのことやらさっぱりわかりません。
VS2019のメニューから、ヘルプ→フィードバックの送信→問題の報告で、キーワード「Microsoft.VSDesigner」を検索すると何やら出てきました。
どうもインストール時にXamarinだけではダメなようで、.Netデスクトップ開発のパッケージ群も必要のようです。

インストーラを起動して.Netデスクトップ開発を選択。オプションは最低限の.NetCore2.1開発ツールのみで、追加インストールしたところ、エラーは出なくなりました。
この追加インストールによって、Xamarinの画面デザイナーのエラーも解消し、正常に表示されるようになりました。依存関係があるなら、インストール時にナビゲートしてくれないと。
→その後またエラーで表示されなくなっちゃいました。
→Version 16.0.1に更新したら表示されました。これで直ったかな?



2019年4月6日土曜日

Xamarin.Android Visual Studio 2019 Community

Visual Studio 2019は起動がとても速くなりました。
メモリの使用量も4分の1になったらしいです。
Xamarin.Androidで開発しているアプリですが、既存プロジェクトではデザイナーがうまく動かないのかなぁと思い、スケルトンプロジェクトを作成してみました。
Xamarin.Androidで空のアプリを作成してみたところ、

こんな感じでいきなりエラーだらけになります。でもソリューションを一旦閉じて開くとエラーはなくなります。
なんでしょうね。CPUとディスクが高速過ぎるので、プロジェクト作成後のコンパイル時に参照ライブラリの解決とコンパイルの同期がうまくとれないとか?
Xamarin.Essentialsが使われたコードになっているのもどうしてなのでしょう?
iOSとかでも動くクロスプラットフォーム用のAPIですよねぇ。
VS2017でもソリューションを作ってみましたが、Essentialのコードは入りません。
テンプレートのバグ?

2019年4月4日木曜日

Visual Studio 2019 CommunityでXamarin

本日Visual Studio 2019の正式版がリリースされました。
無償版のCommunityも同時ということで、さっそくXamarinを2017から2019へ更新です。


インストーラのメニューからXamarinのみを選択。
オプションのAndroid SDK セットアップのチェックは外して、後から既存のAndroid SDKインストールフォルダを指定しました。
5分くらいでインストールは完了。
起動すると2017のソリューションが自動で表示されるので、ソリューションを開いてみました。
最初にAndroid SDKがないよ的なエラーが出たので、ダブルクリックでSDKのフォルダを指定。何故かエラーがなくならない。


とりあえずAndroid SDK Managerを確認して、Android Build Toolsをインストールしてみる。


これでもダメだったので、Visual Studioを再起動したらエラーが消えました。
Build toolsは入れなくても良かったのかもしれませんが、エラーがなくなったのでいいか。
さっそくプロジェクトを再コンパイルしてXperiaにデプロイしてみましたが、あっさり動きました。
コード補完でAIが支援してくれるらしいです。まだコーディングしていないのでどんな感じかよくわかりませんが。
Xamarin.Andoridの実行コードも少し早くなっているとかいないとか。
無茶苦茶重くてすぐエラーが出るGUIのデザイナーは、かなり進化したらしいですが、私のアプリの複雑な画面はやはりエラーでまともに表示できませんでした。

2018年1月16日火曜日

Xamarin デバッグ実行時エラーでハマる

プログラムに問題がないのに、何故かデバック実行時に謎のエラーが発生する。
Classが見つからないというエラーが多い気がしますが、そういう場合はクリーンを実行すると直ったりします。
デバッグを高速にするFast Deployment機能が影響しているのかもしれません。
この謎のエラーで4,5時間デバッグして、諦めかけた頃にこれに気付きました。
何か問題が起きたら、慌てずにまずはクリーンで一時ファイルを削除してから実行する習慣をつけた方がいいです。

2018年1月2日火曜日

Xamarin ProGuradでハマる

Xamarinで開発したAndroidアプリをGooglePlayで公開する場合には、パッケージ(APKファイル)を最小サイズにするために、ProGuardというJavaのツールを使って、使用しているクラスだけに絞る最適化を行います。
ところがVisualStudio2017Community+Xamarinで開発したアプリを、ProGuardを有効にしてAPKを作って実機で実行すると起動時にエラーで落ちたり、真っ暗な画面で起動しなかったりで苦労しました。
XamarinのProGuardは、プロジェクトプロパティのAndroidオプション画面で指定するのですが、ProGuardを有効にする場合には、同じ画面の他のオプションにも注意が必要らしいです。
まずProGuradはリリースコンパイルの時にのみONにすればいい機能なので、ビルド構成をReleaseにします。
で、ProGuard以外のパッケージプロパティは全OFF(メソッド数が65535を超える場合は要Multi-Dex。※KitKatでは注意が必要らしい)。で、リンカープロパティは、「SDKよびユーザーアセンブリ」にしておく必要があるらしい。
この状態でビルドすると、確かにAPKは小さくなるが実機で動かない。
どのくらい小さくなるかというと、リンカープロパティでリンクなしにすると50MBくらい→7MBくらい。
小さくなって動かないのじゃ仕方ない。デバイスログを見たり色々したのですが原因不明で数時間調べたのですが、ProGuardオプションをOFFにしてビルドしたら、数百バイト大きなAPKができて何故か正常に動いた。さっぱり原因がわからん。
という感じで元旦からプログラミングしてます。




2017年12月19日火曜日

Xamarin+Visualstudio2017 NuGetでハマる

自作音楽プレイヤーの演奏用ライブラリを最新のExoPlayerV2に変えてみようかと、NuGetで探してみると、Xamarinで簡単に使えるようにするプラグインがありました。
Xam.Plugins.Android.ExoPlayer
ExoPlayerはJerryBean(4.1)以降で使えるJavaライブラリなので、うちのXperiaZL2のKitKat(Android4.4)でも使えるはずなので、本体ライブラリをダウンロードしてみました。
ところがライブラリが依存しているXam.Plugins.Android.ExoPlayer.Dashが、Xamarin.Android.Support.Core.Utilsの少し高いバージョンを要求しており、プロジェクトの追加がエラーに。
そしてこれを機にXamarin.Android.Support.Core.Utilsがプロジェクトから削除され、コンパイルエラーでビルド不能な状態になってしまいました。
再インストールすればいいやーと、NuGetでインストールを指示したらなんとエラー。バージョンがダメだと。慌てずにバックアップを戻してコンパイルするとこれもエラー。設定はブロジェクトごとのはずなのに何故?
VS2017を再インストールしてもダメ。数時間格闘して結局
アプリで参照しているSupport.V4ライブラリのインストール時に、どのバージョンを入れるにしてもXamarinのライブラリは最新のandroid(現在だとv8.0のOreo)になっていないとインストールできないようにNuGet用の設定ファイル(template.nuspec)に書いてあるのです。こんな感じで。

<file src="support-v4/nuget/Xamarin.Android.Support.v4.targets" target="build/MonoAndroid80" />



で、これがXamarinの指定とあっていないダメってことですが、リストにOreo8.0がない。ここに出すには、VS2017のツール→Android→Android SDK Manager..でツールを起動し、8.0をインストールしてやる必要があります。


そうすると、やっと8.0が選べます。



この状態でXamarin.Android.Support.Core.Utilsの再インストールができると思いきや、まだ落とし穴が。VS2017が変更を認識してくれない。
仕方がないので一旦VS0217を終了。プロジェクトフォルダ内の以下のフォルダを全て削除して再起動。
.vs
Packages
obj
bin
これでやっと再インストールができるようになりました。複雑過ぎる。ここに書いとかないと絶対また忘れる。
で、KitKat4.4に戻さずにコンパイルすると、
obj\Debug\android\bin\packaged_resourcesが無いというエラーが出ます。
なんでかわからん。
Xamarin.Android.Support.V4を使うために入れているのですが、v25.1.0にしています。このバージョンはandroid70が必要と書いてあるのですが、v4.4でも警告が出るものの使えます。XperiaZL2の実機でも動くので気にしませんけど、そろそろ真面目にAndroidバージョンを意識して開発しないと…。



2017年12月12日火曜日

Xamarin文字化け&VS2015Community起動不能

先日マイクロSDカードを取り替えたら、自作のスマホ音楽プレーヤーアプリが動かなくなったので(ダメじゃん)、久しぶりに開発環境を起動してデバッグしました。
半年以上自分の書いたプログラムを見ないと、まるで他人が書いたプログラムにみたいに忘れてます。
で、新たにBluetoothリモコンでアプリが使えるようにしようかと改良を始めたのですが、以前発生していたデバッグ開始時にハングアップする不具合が何故か再発。

おかしくなったらバージョンアップ!の法則でXamarinを更新。最新のベータ版にしたことが災いしたのか、更新後にXamarinに関するメニューの日本語部分が文字化けしてしまいました。
一応使えてはいたので我慢しておけばよかったのですが、なんか気になってしまい、VS2015の修復インストールをしてしまったのが運の尽き、VS2015が起動しなくなってしまいました。正確に言うと起動はするのですが、ウィンドウが表示された後すぐに終了してしまうのです。エラーも出ない。
devenv /log filename
でログを出してみましたが、特にエラーは起きておらず原因不明。
あ~あ、やめとけば良かったなぁ、と思いつつも気を取り直して回復作業。

修復インストールに失敗したら、再インストールするの法則です。
XamarinとVS2015、一緒に入ったもの達をバンバンとアンインストール。
VisualStudioは2017にバージョンアップしてた。この際なので、最新環境にしちゃいます。
VS2017はXamarinが統合されたようで、インストーラでチェックして変更ボタンを押せば入っちゃいました。簡単。NuGetがないので、個別コンポーネントで追加して終了。
元々の文字化けは直りましたが、デバッグ開始時のハングアップはどうかな?



2017年2月27日月曜日

FragmentActivity.SupportFragmentManagerでハマる

Androidの厄介な仕様の1つが、アクティビティのライフサイクルです。
本体を回転させた時や、戻るボタンを押したりすると、何故かアクティビティのインスタンスが破棄され、再作成が起こります。
例えばアプリ内で途中のページを見ている時に画面を回転すると、起動直後のように最初のページに戻るというイライラする動きになります。元のページが表示された状態にするには、わざわざ復元するコードを書く必要があります。
で、今のアプリは、Android.Support.V4ライブラリのFragmentActivity,ViewPagerを使っているのですが、再作成が発生した後にViewPagerの開いていたページに飛ばすと、中身の表示がおかしくなるバグの原因がわからず苦労しました。
ViewPagerのページは、Xamarinの場合CurrentItemプロパティで参照・設定するのですが、ページに割り付けたフラグメントは、SupportFragmentManager.FragmentsのList順序と一致するものと思っていたのです。ところがアクティビティのOnCreateで、CurrentItemを途中のページ(0以外)にするとList順序が変わってしまうのです。ということで、リストのインデックスを使わずにFragmentのインスタンスにタグをつけて検索するようにしたところ、再作成時に途中のページを表示することができました。あぁ面倒くさい。


2017年2月23日木曜日

androidプログラミング

慣れの問題もあるかもしれませんが、ちょっとしたことを追加するにも、勝手が大分違うので大変です。
フェードインとフェードアウトは簡単に実装できましたが、クロスフェードが難しいです。コアロジックの作りを根本的に変えないと無理なので、どうしようか悩みます。他のアプリとの差別化には必要ですし、技術難易度が高いものに対応するのは結構好きなので、なんとか頑張ってるみようかなぁと思い始めてます。

2017年2月17日金曜日

一転不調に

快調にプログラミングを進めて、ジャンル別表示タブを追加したら謎のエラーが発生
デバッグでもとに戻すのに二日を要しました。
ライブラリ内でエラーが起きると原因究明が辛いです。

2017年2月15日水曜日

スマホアプリ製作快調

もう10年くらい使っているiPod Classicの代わりになる音楽プレーヤーを探しているのですが、欲しいものが未だにみつかりません。
奥さんがスマホを新調したことによってXperiaが自分専用になったので、スマホを音楽プレーヤーにしようとアプリを探したのですが使いたいと思うものがない…。
というわけで欲しいプレーヤーを自作することにしたわけです。
今はインターネットで開発ノウハウを検索できますが、かなり多岐に渡る技術を使うので調べものも大変です。日本語サイトだけでは情報が足りないので、海外サイトの情報も調べる必要があります。そもそもAndroidのマニュアルも詳細部分は全て英語ですし。
既にiPodで普段使っている機能は組み込んだので、毎日デバッグのため通勤時に使用しています。まだまだ欲しい機能があるので、しばらくは開発が続きそうです。
ギャップレス再生とクロスフェードの実装が難しそうです。

2017年2月10日金曜日

XamarinVS 4.3.0インストールエラー対応

デバッグの不具合がどうにもならないので、新しいベータ版を入れてみることにしました。アップデートの仕方がWebで見つからないので色々調べたら、VisualStudio2015のツール→オプションの中にありました。わかりにくい…。

で、現時点で最新の4.3.0 RCをダウンロード。800MB程度ですが何故か結構時間がかかります。インストールボタンを押してみたらエラー。

なんだか。
Tempフォルダ(Explorerのアドレス欄に%temp%で出てくる一時フォルダ)の中に、Xamarin-Install.batというファイルがあるので、その中を見るとダウンロードされたMSIの場所がわかります。MSIの起動オプションに記載されているフォルダが見つからないのが原因みたいです。ユーザー名が日本語だと駄目なのか!?とりあえずそのフォルダにあるMSIを直接起動すればいけるようです。これで直ればいいけど。
→なんか直ったっぽいです。リリースノートにMulti-process debuggingとか書いてあるので、デバッグの動作が改善されたのかも。これでまた開発が続けられそうです。


2017年2月9日木曜日

Xamarinがフリーズ

VisualStudio2015でXamarin 4.2.0を使っているのですが、最近IDEのハングアップ現象で困ってます。
実機のリモートデバッグを実行するとかなり高い頻度でVisualStudioがフリーズします。Start debugging Android application...の表示したままデバッグモードに入りません。


応答なしにはなっておらず、かといってCPU使用率も高くないのですが、10分待っても進みません。この状態でdevenv.exeプロセスを強制終了して、VisualStudioを再起動。プロジェクトを開き直してデバッグ実行するとすんなりデバッグモードに入ります。開発効率悪すぎ…。
どうもAndroid Support Libraryとか使いだすと駄目になるみたいです。これ使えないと新しいUIが使えないじゃん。
Xamarin for VisualStudio 4.3.0RCで直るようです。

アップデートで色々日本語になりました。

2017年2月6日月曜日

スマホアプリ製作

スマホアプリ開発に熱中するあまりブログの更新が止まってしまいました。
音楽プレーヤーはとりあえず自分で使えるようになって、毎日使っていますが、まだまだ実装したい機能があるので、開発は続きます。
とりあえず奥様のスマホにも入れてみましたが問題なく動作して一安心。
アプリ開発は大変で難しいですが非常に楽しいです。
ソフト製作は物理的なDIYなどの工作や料理とはまた違った達成感です。
任天堂スイッチまでは、アプリ開発で遊べそうです。

2017年1月26日木曜日

App2(エーピーピーツー)

今作ってる音楽プレーヤーアプリの名前です。
開発用ソフトが勝手につけた名前で、2個目に作ったアプリなのでApp2です。
1個目はよくわからんで作ったのでボツになりました。
正式な名前は何か考えないとなぁ。
ピコ太郎が忘れ去られたら何のこっちゃですので。