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

2023年8月18日金曜日

Xamarinプロジェクトのエラーを解決してみた!

数年前に作成したVisual Studio 2019のXamarinプロジェクトを、まっさらなパソコンでビルドしたところ、いくつかエラーが発生しました。その解決メモです。

.NETのインストール


まず、下記のエラーが発生し、プロジェクトが「アンロード済み」となり、読み込まれませんでした。


error  : プロジェクト ファイルを開けません。 
.NET SDK バージョン 7.0.304 では、MSBuild バージョン 17.4.0 以上が必要です。
現在利用可能な MSBuild のバージョンは 16.11.2.50704 です。
global.json で指定した .NET SDK を、現在利用可能な MSBuild バージョンが求められる古いバージョンに変更します。


プロジェクトのターゲットフレームワークは「.NET Standard 2.0」です。
下記のサイトに


netstandard がターゲットの既存のコードの場合は、TFM を net5.0 から net6.0 に変更する必要はありません。
 .NET 5 と .NET 6 により、.NET Standard 2.1 以前が実装されます。

と書かれています。

Visual Studio 2019では、.NET 6以降は正式にサポートされていないため、(すでにサポートは終了していますが).NET 5をインストールする必要があります。Visual Studio Installerを使ってはうまくインストールできなかったため、.NET 5のダウンロードサイトからダウンロードし、インストールしました。

ちなみに、エラー内容にある「.NET SDK バージョン 7.0.304」は、Visual Studio 2022のインストールで「.NETマルチプラットフォームアプリのUI開発」をチェックした際に、インストールされたSDKです。

JDKのインストール


次に、Xamarin.Androidプロジェクトをビルドすると、下記のエラーが発生しました。


$(TargetFrameworkVersion) v12.0 を使用するときには、Java SDK 11.0 以上が必要です。


まっさらな環境なので、JDKもインストールしていません。
下記のダウンロードページからOpenJDK 11をダウンロードし、インストールします。


そして、[ツール] > [オプション] > [Xamarin] > [Android 設定]の「Java Development Kit の位置情報」から「JDK 構成」を開き、インストールしたJDK11のパスを指定します。


残念なことに、VS2019の仕様なのかバグなのか、VS2019を終了するとこの設定は元に戻ってしまい、起動するたびに再設定しなくてはなりません。。。

Android SDKのインストール


ビルドすると、まだエラーが発生します。


API レベル 31 の android .jar が見つかりませんでした。
これは、API レベル 31 の Android SDK プラットフォームがインストールされていないことを意味します。Android SDK マネージャー ([ツール] > [Android] > [Android SDK マネージャー...]) にインストールするか、インストールされている API バージョンを対象とする Xamarin.Android プロジェクトを変更します。(C:\Program Files (x86)\Android\android-sdk\platforms\android-31\android.jar がありません。)


API レベル 31、つまりAndroid 12が必要です。
ところが、Android SDK マネージャーを開いても、Android 12が表示されません。


下部の歯車アイコンを押下し、[リポジトリ] > [Google(サポート対象外)]の方を選択すると、「Android 12.0」が表示されるので、チェックしてインストールします。
これで無事にビルドすることができました。


またいつか、どこかで。

2020年10月2日金曜日

AndroidアプリのDBファイルを取り出してみた!

Xamarin.Formsでモバイルアプリを開発しています。
デバッグしているAndroid端末からSQLiteのデータベースファイルを取り出す方法のメモです。

まず、DBファイルの場所を確認します。
Visual Studioの「ツール」-「Android」から「Android Adb コマンド プロンプト」を起動します。
シェルを起動し、パッケージ名を指定してrun-asコマンドを実行します。


> adb shell
(デバイス名):/ $ run-as jp.co.aimek.xxxxx


リリースビルドされたアプリでは


(デバイス名):/ $ run-as jp.co.aimek.xxxxx
run-as: package not debuggable: jp.co.aimek.xxxxx


となるので、デバッグ版が必要です。

アプリのフォルダを確認します。


(デバイス名):/data/data/jp.co.aimek.xxxxx $ ls
cache code_cache files shared_prefs


filesフォルダの中に入ります。


(デバイス名):/data/data/jp.co.aimek.xxxxx $ cd files
(デバイス名):/data/data/jp.co.aimek.xxxxx/files $ ls -a
. .. .__override__ .config .local


.localの中をさらにたどっていくと、DBファイルが見つかりました。


(デバイス名):/data/data/jp.co.aimek.xxxxx/files $ cd .local
(デバイス名):/data/data/jp.co.aimek.xxxxx/files/.local $ ls
share

(デバイス名):/data/data/jp.co.aimek.xxxxx/files/.local $ cd share
(デバイス名):/data/data/jp.co.aimek.xxxxx/files/.local/share $ ls
XXXXX.db3


シェルを終了し、adbコマンドでDBファイルを取り出します。


> adb exec-out run-as jp.co.aimek.xxxxx cat files/.local/share/XXXXX.db3 > XXXXX.db3


またいつか、どこかで。

2016年6月2日木曜日

XamarinでCocoapodsのライブラリを使う

iOSアプリを作る際、多くの場合Cocoapodsを使うかと思います。
Xcodeで開発する場合は以下のサイトが詳しいのでそちらを参考に。


※El Capitanの場合は以下


今回はXamarinでiOSアプリを開発する際に、CocoaPodsライブラリを使用する方法を紹介します。

1.Objective Sharpieインストール

XamarinのドキュメントサイトからObjective Sharpieをダウンロードしてインストールします。


2.Objective Sharpieでバインディング

Xamarin.iOSで作ったアプリ(C#)からObjective-Cで作られたライブラリを呼び出すには
バインディングの定義ファイルを作らないといけないのですが、Objective Sharpieを使うとバインディングの
定義ファイル、ライブラリ本体(lib*.aファイル)を自動で作ってくれます。


・CocoaPodsのサイトで使用したいライブラリを探します。


・ターミナルを起動し、任意のディレクトリで以下のコマンドを実行します。


$ sharpie pod init ios LGSideMenuController

※今回は「LGSideMenuController」を入れます。


成功すると↓のような感じになります。


Setup completed
** Searching for requested CocoaPods ...
** Working directory: 
**   - Writing Podfile ...
**   - Installing CocoaPods ...
**     (running `pod install --no-integrate --no-repo-update`)
[!] Unable to load a specification for the plugin `/Library/Ruby/Gems/2.0.0/gems/cocoapods-deintegrate-1.0.0`
Analyzing dependencies
Downloading dependencies
Installing LGSideMenuController (1.0.10)
Generating Pods project
Sending stats
Sending stats
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.

** 🍻  Success! You can now use other `sharpie pod` commands.



成功すると「Pods」ディレクトリができます。













ターゲットのiOSバージョンを変更する場合は、Podsディレクトリ以下のxcodeprojファイルを開いて
Deployment Targetを変更します。


















ターミナルを起動し、以下のコマンドを実行します。

$ sharpie pod bind


長々とログがでますが「Done.」と出てきたら成功です。

Binding Analysis:
  Automated binding is complete, but there are a few APIs which have been flagged with [Verify] attributes. While the entire binding should
  be audited for best API design practices, look more closely at APIs with the following Verify attribute hints:

  MethodToProperty (4 instances):
    An Objective-C method was bound as a C# property due to convention such as taking no parameters and returning a value (non-void return).
    Often methods like these should be bound as properties to surface a nicer API, but sometimes false-positives can occur and the binding
    should actually be a method.

  Once you have verified a Verify attribute, you should remove it from the binding source code. The presence of Verify attributes
  intentionally cause build failures.
  
  For more information about the Verify attribute hints above, consult the Objective Sharpie documentation by running 'sharpie docs' or
  visiting the following URL:

    http://xmn.io/sharpie-docs

Submitting usage data to Xamarin...
  Submitted - thank you for helping to improve Objective Sharpie!

Done.



成功するとライブラリ本体(lib*.a)とバインディング定義ファイルが作られます。























あとは出来上がったファイルを使ってXamarin StudioでBindings Libraryプロジェクトを作れば使えるようになります。

3.シミュレータで動作するライブラリを生成

前述までの手順で作ったライブラリは実機では動きますが、シミュレータでは動きません。

出来上がったライブラリをlipoコマンドで確認してみると対象アーキテクチャに「i386」が含まれていないことがわかります。
シミュレータで使えるようにするには「i386」が含まれている必要があります。




lipo -info libLGSideMenuController.a 

Architectures in the fat file: libLGSideMenuController.a are: armv7 arm64 




ですので、少々面倒くさいのですが、Podsディレクトリ以下のxcodeprojファイルを開いてシミュレータ用にライブラリを生成しなおします。















上記ショットの通り、「Build Active Architecture Only」を「No」にして「Valid Architecture」に「i386」を追加します。

あとはシミュレータを対象にビルドを実行すればシミュレータで動作するライブラリが出来上がります。









build/Debug-iphonesimulatorディレクトリ以下にライブラリが出力されてます。

lipoコマンドで確認すると対象アーキテクチャに「i386」が含まれていることがわかります。

lipo -info libLGSideMenuController.a 

Architectures in the fat file: libLGSideMenuController.a are: i386 x86_64 


シミュレータで実行する際はこのライブラリを使えば動きます!

しかしもうちょっとスマートなやりかたないんですかねー。
ご存知の方教えてくださいm(_ _)m



それじゃまた。