1. ホーム
  2. アンドロイド

アンドロイド アルメアビ アルメアビ-v7a

2022-02-08 05:31:29

アンドロイドアルメアビ・アルメアビ-v7a


これから来る主なものをピックアップ。
理論的には、armeabiフォルダのsoファイルを生成するだけで、すべてのアームプロセッサのモデルで動作するので、ようやく権威ある情報を見つけることができました

以下の赤字のテキストは、その意味です。
armeabi-v7aではsoファイルを生成しませんが、このCPUタイプのマシンで実行すると、多くの奇妙な、原因不明の問題が発生します。
元記事はこちら
http://docs.xamarin.com/guides/android/advanced_topics/MultiCore_devices_XamarinAndroid/

armeabiフォルダにsoファイルを生成するだけで、すべてのarmeabi携帯で動作するはずだったのですが、一部の携帯ではエラーが報告され、ほとんどがSony携帯と一部のSamsung携帯です。
<スパン 回避策
  1) C/C++のコードを自分で書く場合、Application.mkファイル内に 
   APP_ABI := armeabi armeabi-v7a x86 Recompile the C code and it will automatically generate the corresponding folder and so file under libs

 2) If you are using someone else's so file, you can simply copy the so file to the armeabi-v7a, x86 folder to solve the problem

 The first method is recommended, after all it is efficient to compile so files for different CPUs. x86 is optional, if you want to be compatible with x86 platform you need to add it.



.apk


armeabi


<スパン マルチコアデバイスとXamarin.Android

オフラインで使用するためのPDFです。
関連記事
関連SDKをご紹介します。

Androidは、いくつかの異なるコンピュータ・アーキテクチャ上で動作します。このドキュメントでは、Xamarin .Netに採用される可能性のあるさまざまなCPUアーキテクチャについて説明します。Android アプリケーションに採用される可能性のあるさまざまな CPU アーキテクチャについて説明します。また、このドキュメントでは、異なる CPU アーキテクチャをサポートするために Android アプリケーションがどのようにパッケージ化されるかを説明します。バイナリ インターフェイス (ABI) を紹介し、Xamarin.Android アプリケーションでどの ABI を使用するかについてのガイダンスを提供します。

概要

Android では、ファット・バイナリを作成することができます。  armeabi  このファイルには、複数の異なる CPU アーキテクチャをサポートするマシンコードが含まれています。これは、各マシンコードに  アプリケーションバイナリインターフェース . ABIは、与えられたハードウェアデバイス上でどのマシンコードが実行されるかを制御するために使用されます。例えば、Android アプリケーションを x86 デバイスで実行するには、x86 ABI サポートをコンパイル時に含めることが必要です。

具体的には、各Androidアプリケーションは、少なくとも1つの  組み込みアプリケーション・バイナリ・インターフェース  (EABI)といいます。EABIは、組込みソフトウェアプログラムに特有の規約です。典型的なEABIは、次のようなことを記述します。

  • CPUの命令セット。
  • 実行時のメモリストアとロードのエンディアン。
  • オブジェクトファイルやプログラムライブラリのバイナリ形式、およびこれらのファイルやライブラリで許可またはサポートされているコンテンツの種類。 アプリケーションコードとシステム間のデータ受け渡しに使用される様々な規約(例:関数呼び出し時のレジスタやスタックの使用方法、アライメント制約など)。
  • 列挙型、構造体、フィールド、配列のアライメントとサイズの制約。
  • 実行時にマシンコードが使用できる関数シンボルのリストで、通常、非常に特殊なライブラリの中から選択されます。

アルミアビとスレッドセーフ

アプリケーション・バイナリ・インターフェースについては後ほど詳しく述べますが armeabi-v7a  Xamarin.Androidが使用するランタイムは  スレッドセーフではない . を持つアプリケーションの場合  armeabi  にデプロイされます。  armeabi-v7a  のデバイスでは、多くの奇妙で説明のつかない例外が発生します。

Android 4.0.0, 4.0.1, 4.0.2, 4.0.3 のバグにより、ネイティブライブラリのピックアップは  armeabi-v7a ディレクトリがあるにもかかわらず  .so  ディレクトリが存在し、デバイスが  libgcc.a  デバイスになります。

注:Xamarin.Androidは、以下のことを保証します。  armeabi  このバグは、Xamarin.Androidのユーザーにとって問題にはならないはずです。

ABIの説明

Androidがサポートする各ABIは、一意の名前で識別されます。

アルメアビ

少なくともARMv5TE命令セットをサポートするARM系CPUのためのEABIの名称です。Androidは、以下のドキュメントに記載されているリトルエンディアンのARM GNU/LinuxのABIに準拠しています。 http://www.codesourcery.com/gnu_toolchains/arm/arm_gnu_linux_abi.pdf .

このABIは、ハードウェア支援による浮動小数点演算をサポートしていません。すべてのFP演算はソフトウェアヘルパー関数によって行われ、コンパイラの  armeabi  SMPデバイスは  armeabi-v7a . 注意してください。  Xamarin.Androidの  aremabi  のコードはスレッドセーフではないので、マルチCPUの場合は使用しないでください。  armeabi-v7a デバイス(後述)。使用方法  armeabi  のコードは、シングルコアの  armeabi-v7a  のデバイスは安全です。

アルメアビ-v7a

を拡張した、もう一つのARM系CPUの命令セットです。  armeabi-v7a  上記のEABI。  armeabi  EABIは、ハードウェア浮動小数点演算とマルチCPU(SMP)デバイスをサポートしています。  armeabi-v7a  を使用するアプリケーションと比較して、大幅な性能向上が期待できます。 MIPS32r1 .

備考  :  micromips  ARMv5デバイスでは、マシンコードは実行されません。

x86

という名前の命令セットをサポートするCPUのためのABIの名前です。  x86  または  IA-32 . この ABI は、MMX、SSE、SSE2、および SSE3 命令セットを含む Pentium Pro 命令セットの命令に対応するものです。その他のオプションのIA-32命令セットの拡張は含まれていません。

  • MOVBE 命令。
  • Supplemental SSE3 extension (SSSE3)。
  • SSE4 の任意のバリエーション。
 Google TVは、x86で動作しますが、AndroidのNDKやXamarin.Androidではサポートされていません。

ミップス

MIPSベースのCPUのうち、少なくとも  .zip  MIPS 16も  .apk  はAndroidでサポートされています。

 MIPSデバイスは現在Xamarin.Androidでサポートされていませんが、将来のリリースでサポートされる予定です。

APKファイル形式

Android Application Packageは、Androidアプリケーションに必要なコード、アセット、リソース、証明書のすべてを保持するファイル形式です。これは  .apk  ファイルですが  .apk  ファイル名の拡張子です。展開すると  AndroidManifest.xml  Xamarin.Androidで作成したものは、以下のスクリーンショットで見ることができます。

の中身を簡単に説明すると  dex  ファイルを作成します。

  • AndroidManifest.xml  - これは  .apk  ファイルをバイナリ XML 形式で提供します。
  • <スパン classes.dex  - これには、アプリケーション・コードをコンパイルして  armeabi-v7a  ファイル形式で、Dalvik VMで使用されます。
  • resources.arsc  - このファイルには、アプリケーションのプリコンパイルされたすべてのリソースが含まれています。
  • リブ  - このディレクトリは、各ABIのコンパイル済みコードを保持します。前のセクションで説明したABIごとに1つのサブフォルダが含まれます。上のスクリーンショットでは  x86  の両方のネイティブ・ライブラリが含まれています。  resources.arsc  と  libmonodroid.so .
  • META-INF  - このディレクトリ(存在する場合)は、署名情報、パッケージ、および拡張機能の設定データを格納するために使用されます。
  • レジ  - にコンパイルされなかったリソースを格納するディレクトリです。  armeabi .
備考  ファイル  armeabi-v7a  は、すべてのXamarin.Androidアプリケーションで必要とされるネイティブライブラリです。

Android端末のABI対応

各Androidデバイスは、最大2つのABIでネイティブコードの実行をサポートしています。

  • <スパン プライマリABI  - システムイメージで使用されているマシンコードに相当します。
  • <スパン セカンダリABI  - システムイメージでもサポートされているオプションのABIです。

例えば、典型的な ARMv5TE デバイスでは、プライマリ ABI のみが  armeabi 一方、ARMv7 デバイスでは、プライマリ ABI を次のように指定します。  x86  とセカンダリABIの  .apk . 一般的な x86 デバイスでは、プライマリ ABI のみを指定します。  /data/data/<package-name>/lib .

Android Nativeライブラリのインストール

パッケージのインストール時、ネイティブライブラリは  $APP/lib  は、アプリのネイティブライブラリディレクトリに展開され、通常は  .apk と呼ばれ、以後は  armeabi-v7a .

Androidのネイティブライブラリのインストール動作は、Androidのバージョンによって大きく異なります。

ネイティブライブラリのインストール Android 4.0以前

4.0 Ice Cream Sandwich 以前の Android では、ネイティブ・ライブラリの抽出は  単一ABI  の中で  .apk, . このヴィンテージのAndroidアプリは、まずプライマリABIのすべてのネイティブライブラリを抽出しようとし、そのようなライブラリが存在しない場合、Androidは次にセカンダリABIのすべてのネイティブライブラリを抽出することになります。マージは行われません。

例えば、あるアプリケーションを  armeabi  というデバイスがあります。  armeabi-v7a  の両方をサポートする  lib  と  lib/armeabi/libone.so lib/armeabi/libtwo.so lib/armeabi-v7a/libtwo.so は、以下のABIを持っています。  $APP/lib/libtwo.so # from the armeabi-v7a directory in the apk  ディレクトリとその中にあるファイルです。

1 2 3
libone.so

インストール後、ネイティブライブラリディレクトリに含まれます。

1
libone.so

言い換えれば、ノー  .apk  という問題が発生します。  lib/armeabi/libone.so lib/armeabi/libtwo.so lib/armeabi-v7a/libone.so lib/armeabi-v7a/libtwo.so  この動作は予期せぬものでしたが、バグとして記録され、"に再分類されました。 意図したとおりに動作する . "

そのため、Android 4.0以前のバージョンをターゲットとする場合、Android 4.0に対応するために  すべて  のネイティブ・ライブラリです。  アプリケーションがサポートするABI、つまり  .apk  が含まれている必要があります。

1 2 3 4
lib/armeabi/libone.so lib/armeabi/libtwo.so lib/armeabi-v7a/libtwo.so

ネイティブライブラリのインストール。Android 4.0 - Android 4.0.3

Android 4.0 Ice Cream Sandwichでは、抽出ロジックが変更されています。すべてのネイティブ ライブラリを列挙し、ファイルのベースネームがすでに展開されているかどうかを確認します。 すべてのネイティブ ライブラリを列挙し、ファイルのベースネームがすでに展開されているかどうかを確認し、次の両方の条件を満たす場合、ライブラリが展開されます。

  • まだ展開されていない
  • ネイティブライブラリのABIがターゲットのプライマリまたはセカンダリのABIと一致する。

これらの条件を満たすことで、quot;merging"動作が可能になります。  $APP/lib/libone.so $APP/lib/libtwo.so  を以下のような内容で作成します。

1 2 3
.apk

そして、インストール後のネイティブライブラリディレクトリに含まれます。

1 2
armeabi

残念ながら、この動作は以下の文書にあるように順序に依存します -。  問題24321。armeabi と armeabi-v7a の両方が apk に含まれている場合、Galaxy Nexus 4.0.2 は armeabi ネイティブコードを使用する .

ネイティブライブラリは "順に処理され" (例えば unzip でリストされるように)、そして  最初に一致する  が抽出されます。  armeabi-v7a  には  libtwo.so  と  armeabi  のバージョンがあります。  armeabi であり、また  armeabi-v7a  が最初に表示されると、それは  $APP/lib/libone.so # armeabi $APP/lib/libtwo.so # armeabi, NOT armeabi-v7a!  のバージョンが抽出されます。  ではなく  その  armeabi  のバージョンです。

1 2
armeabi-v7a

さらに、仮に両方の  csproj  と  armeabi libmonodroid.so  ABIが指定されています(後述のセクション サポートされるABIの宣言 )、Xamarin.Androidは.NET Frameworkの中に以下の要素を作成します。 .apk :

1
<アンドロイド対応キャビ アルメアビ,アルメアビV7A

その結果 

armeabi
libmonodroid.so
 の中で最初に見つかります。  armeabi-v7a libmonodroid.so であり
armeabi
 が抽出されることになります。 
.apk
 という不明瞭なランタイムエラーが発生することもあります。  lib/armeabi/libone.so lib/armeabi/libtwo.so lib/armeabi-v7a/libtwo.so  はSMPセーフではありません。

ネイティブライブラリのインストール。Android 4.0.4 以降

Android 4.0.4 では、抽出ロジックが変更されました。すべてのネイティブ ライブラリを列挙してファイルのベースネームを読み取り、プライマリ ABI バージョン (存在する場合) またはセカンダリ ABI (存在する場合) を抽出します。これにより、quot;merging"動作が可能になります。  $APP/lib/libone.so # from armeabi $APP/lib/libtwo.so # from armeabi-v7a  で、以下のような内容です。

1 2 3
armeabi armeabi-v7a x86

そして、インストール後のネイティブライブラリディレクトリに格納されます。

1 2
mips.

Xamarin.AndroidとABI

Xamarin.Androidは現在、以下のアーキテクチャをサポートしています。

  • armeabi-v7a
    

現在、Xamarin.Androidでは、以下のサポートは提供されていません。

armeabi-v7a

サポートするABIの宣言

デフォルトでは、Xamarin.Androidは以下のようになります。  x86  に対して  リリース  ビルドに、そして  x86  と  armeabi-v7a  に対して デバッグ  をビルドします。

異なるABIのサポートは、Xamarin.Androidプロジェクトのプロジェクトオプションで設定することができます。Visual Studioの場合、この設定は  プロジェクト オプション をクリックすると  アプリケーション  タブの下にある  <スパン サポートされるアーキテクチャ をクリックすると、次のスクリーンショットが表示されます。

Xamarin Studioでは、サポートされているアーキテクチャを  プロジェクトオプション  ダイアログの ビルド ... Androidビルド  を搭載しています。  <スパン 高度な  タブをクリックすると、次のスクリーンショットが表示されます。

以下のような場合、ABIサポートを追加で宣言する必要がある場合があります。

  • アプリケーションのデプロイ先  armeabi-v7a  デバイスを使用します。
  • アプリケーションのデプロイ先  armeabi  デバイスを使用して、スレッドの安全性を確保します。

概要

このドキュメントでは、Android アプリケーションが実行される可能性のあるさまざまな CPU アーキテクチャについて説明しました。さらに、Xamarin.Android アプリケーションで ABI サポートを指定する方法と、Xamarin.Android アプリケーションで ABI サポートを指定する方法について説明し、Xamarin.Android アプリケーションの使用時に発生する問題点を強調しました。  armeabi-v7a  のみを対象としたデバイスです。  armeabi .