Android ABIの浅い分析
3501 ワード
Android ABIのコンセプト
ABIのフルネーム:Application binary interface(アプリケーションバイナリインタフェース)は、コンパイルされたバイナリターゲットコードがABIに互換性のあるすべてのオペレーティングシステムで変更せずに実行できるようにするルールを定義しています.
異なるAndroid携帯電話は異なるCPUを使用するため、対応するバイナリインタフェースインタラクションルール(すなわち対応するABIファイル)を提供してこそインタラクションを行うことができる.
一部のCPUでは,複数のインタラクションルールをサポートできるが,これは性能を犠牲にした互換性である.
主流のABIアーキテクチャ armeabiv-v 7 a:第7世代以上のARMプロセッサ.2011年以降に生産されたAndroidデバイスの大部分が使用されています. arm 64-v 8 a:第8世代、64ビットARMプロセッサ、少ないデバイス、サムスンGalaxy S 6はその1つです. armeabi:第5世代、第6世代のARMプロセッサは、初期の携帯電話用が多かった. x 86:平板、シミュレータが多く使われています. x86_64:64ビットのタブレット.
ABIとCPUの関係
1つのアプリケーションがデバイスにインストール場合、そのデバイスがサポートするCPUアーキテクチャのみが対応する.soファイルがインストールされ、複数のABIアーキテクチャがサポートされている場合は優先順位に従います.
具体的なサポートタイプは以下の通りです.
ARMv5(CPU):armeabi(ABI) ARMv7:armeabi,armeabi-v7a ARMv8:armeabi,armeabi-v7a,arm64-v8a MIPS:mips MIPS64:mips,mips64 x86:x86(1),armeabi(2),armeabi-v7a(3) x86_64:armeabi,x86,x86_64
CPUの多くは前方互換性があることが分かるが,ABIを選択すると優先度がある.
例えばX 86型のCPUは、x 86ディレクトリの下のものを優先的に選択する.soパッケージは、存在する場合、他のサポートされているABIアーキテクチャはインストールされません.x 86ディレクトリがない場合、armeabi-v 7 aディレクトリの下を選択する.so,最後にarmeabiディレクトリの下を選択する.soファイル.
ps:X 86デバイスはarmeabiの下のsoライブラリを実行できるが、性能を損なう可能性があり、crashが必ず発生しないことを保証することはできない.特に小さな会社が生産したsoライブラリがある.
使用中の問題
.soファイル、優先度の低いABIディレクトリを入れた
デバイスCPUアーキテクチャはARMv 7であり、ABIファイルはarmeabi-v 7 aであるが、armeabiディレクトリに格納されている
1.プロジェクトにarmeabi-v 7 aディレクトリがあり、ディレクトリの下にsoライブラリがない場合、ARMv 7はarmeabi-v 7 aディレクトリを優先的にロードし、対応するsoライブラリがないことを発見すると、エラーが発生します.
2.プロジェクトの中でarmeabiのディレクトリだけあって、ARMv 7はarmeabiのディレクトリをロードして、同時にディレクトリの下のsoライブラリをロードして、1つのarmeabiの規則のsoライブラリをロードすることに相当して、前向きに互換する特性のため、間違いを報告しないで、運行することができて、しかし性能は損失することができます.
.soファイルは優先度の高いABIディレクトリに入れる
デバイスCPUアーキテクチャはARMv 7であり、ABIファイルはarmeabiであるが、armeabi-v 7 aディレクトリの下に置かれている.
ロードできますが、使用できますか?私も確信していません.armeabiのsoライブラリはarmeabi-v 7 aが定めたインタフェースインタラクティブルールをサポートするとは限らないからである.
複数のサードパーティのSDKでABIファイルの優先度が異なります.
2つのサードパーティのSDKでABIファイルの優先度が異なり、携帯電話のロードが実行されると、優先度の低いライブラリがロードできなくなります
私の携帯電話cpuアーキテクチャはARMv 7で、プロジェクトの中で2つの第三者SDKを使用します:企業Aと企業B
企業A:ABIファイルはarmeabi-v 7 aであり、armeabi-v 7 aディレクトリに格納されます.企業B:ABIファイルはarmeabi-v 5 teで、armeabiディレクトリに格納されます.
実行時に、実行後のcrashが表示され、次のlog情報が表示されます.
これは,優先度の低い企業Bのsoパッケージがロードされていないため,正常に使用できないため,エラーが発生するためである.
解決策:
1、同じ優先度のABIファイルを使用し、ABIファイルは同じ優先度のABIディレクトリを入れる
企業A:ABIファイルはarmeabi-v 5 teで、armeabiディレクトリに入れます.企業B:ABIファイルはarmeabi-v 5 teで、armeabiディレクトリに格納されます.または
企業A:ABIファイルはarmeabi-v 7 aであり、armeabi-v 7 aディレクトリに格納されます.企業B:ABIファイルはarmeabi-v 7 aであり、armeabi-v 7 aディレクトリに格納されます.
2、異なる優先度のABIファイルを使用し、ABIファイルは同じ優先度のABIディレクトリに入れる.一般的にはそうすることをお勧めしません.
企業A:ABIファイルはarmeabi-v 7 aですが、armeabiディレクトリに入れます.企業B:ABIファイルはarmeabi-v 5 teで、armeabiディレクトリに格納されます.または
企業A:ABIファイルはarmeabi-v 7 aであり、armeabi-v 7 aディレクトリに格納されます.企業B:ABIファイルはarmeabi-v 5 teですが、armeabi-v 7 aディレクトリに入れます.
soファイルの重要な法則
处理soファイルには簡単だが知られていない重要な法則がある.ABIごとに最適化されたものをできるだけ提供するべきです.soファイル
NDKの互換性
NDKを使用する場合は、NDKは後方互換性があるため、appのminsdkValerson対応のコンパイルプラットフォームを選択します.
注意事項
すべてのABIフォルダが提供するsoは一貫性を保つ
我々のアプリケーションが複数のABIをサポートすることを選択した場合、ABIごとにsoがサポートされているが、すべてサポートされているか、サポートされていないかに注意してください.混合して使用すべきではなく、ABIディレクトリごとに対応するものを提供すべきである.soファイル.
参考記事
Androidアプリをパッケージ化する際にarmeabiと互換性が必要ですかAndroidのso ABIとCPUの関係の難病Android ABIの概念について話します
さらに
個人的なgithubの暇な時間の書くストーリ
ABIのフルネーム:Application binary interface(アプリケーションバイナリインタフェース)は、コンパイルされたバイナリターゲットコードがABIに互換性のあるすべてのオペレーティングシステムで変更せずに実行できるようにするルールを定義しています.
異なるAndroid携帯電話は異なるCPUを使用するため、対応するバイナリインタフェースインタラクションルール(すなわち対応するABIファイル)を提供してこそインタラクションを行うことができる.
一部のCPUでは,複数のインタラクションルールをサポートできるが,これは性能を犠牲にした互換性である.
主流のABIアーキテクチャ
ABIとCPUの関係
1つのアプリケーションがデバイスにインストール場合、そのデバイスがサポートするCPUアーキテクチャのみが対応する.soファイルがインストールされ、複数のABIアーキテクチャがサポートされている場合は優先順位に従います.
具体的なサポートタイプは以下の通りです.
ARMv5(CPU):armeabi(ABI) ARMv7:armeabi,armeabi-v7a ARMv8:armeabi,armeabi-v7a,arm64-v8a MIPS:mips MIPS64:mips,mips64 x86:x86(1),armeabi(2),armeabi-v7a(3) x86_64:armeabi,x86,x86_64
CPUの多くは前方互換性があることが分かるが,ABIを選択すると優先度がある.
例えばX 86型のCPUは、x 86ディレクトリの下のものを優先的に選択する.soパッケージは、存在する場合、他のサポートされているABIアーキテクチャはインストールされません.x 86ディレクトリがない場合、armeabi-v 7 aディレクトリの下を選択する.so,最後にarmeabiディレクトリの下を選択する.soファイル.
ps:X 86デバイスはarmeabiの下のsoライブラリを実行できるが、性能を損なう可能性があり、crashが必ず発生しないことを保証することはできない.特に小さな会社が生産したsoライブラリがある.
使用中の問題
.soファイル、優先度の低いABIディレクトリを入れた
デバイスCPUアーキテクチャはARMv 7であり、ABIファイルはarmeabi-v 7 aであるが、armeabiディレクトリに格納されている
1.プロジェクトにarmeabi-v 7 aディレクトリがあり、ディレクトリの下にsoライブラリがない場合、ARMv 7はarmeabi-v 7 aディレクトリを優先的にロードし、対応するsoライブラリがないことを発見すると、エラーが発生します.
Caused by: java.lang.UnsatisfiedLinkError
2.プロジェクトの中でarmeabiのディレクトリだけあって、ARMv 7はarmeabiのディレクトリをロードして、同時にディレクトリの下のsoライブラリをロードして、1つのarmeabiの規則のsoライブラリをロードすることに相当して、前向きに互換する特性のため、間違いを報告しないで、運行することができて、しかし性能は損失することができます.
.soファイルは優先度の高いABIディレクトリに入れる
デバイスCPUアーキテクチャはARMv 7であり、ABIファイルはarmeabiであるが、armeabi-v 7 aディレクトリの下に置かれている.
ロードできますが、使用できますか?私も確信していません.armeabiのsoライブラリはarmeabi-v 7 aが定めたインタフェースインタラクティブルールをサポートするとは限らないからである.
複数のサードパーティのSDKでABIファイルの優先度が異なります.
2つのサードパーティのSDKでABIファイルの優先度が異なり、携帯電話のロードが実行されると、優先度の低いライブラリがロードできなくなります
私の携帯電話cpuアーキテクチャはARMv 7で、プロジェクトの中で2つの第三者SDKを使用します:企業Aと企業B
企業A:ABIファイルはarmeabi-v 7 aであり、armeabi-v 7 aディレクトリに格納されます.企業B:ABIファイルはarmeabi-v 5 teで、armeabiディレクトリに格納されます.
実行時に、実行後のcrashが表示され、次のlog情報が表示されます.
Caused by: java.lang.UnsatisfiedLinkError
これは,優先度の低い企業Bのsoパッケージがロードされていないため,正常に使用できないため,エラーが発生するためである.
解決策:
1、同じ優先度のABIファイルを使用し、ABIファイルは同じ優先度のABIディレクトリを入れる
企業A:ABIファイルはarmeabi-v 5 teで、armeabiディレクトリに入れます.企業B:ABIファイルはarmeabi-v 5 teで、armeabiディレクトリに格納されます.または
企業A:ABIファイルはarmeabi-v 7 aであり、armeabi-v 7 aディレクトリに格納されます.企業B:ABIファイルはarmeabi-v 7 aであり、armeabi-v 7 aディレクトリに格納されます.
2、異なる優先度のABIファイルを使用し、ABIファイルは同じ優先度のABIディレクトリに入れる.一般的にはそうすることをお勧めしません.
企業A:ABIファイルはarmeabi-v 7 aですが、armeabiディレクトリに入れます.企業B:ABIファイルはarmeabi-v 5 teで、armeabiディレクトリに格納されます.または
企業A:ABIファイルはarmeabi-v 7 aであり、armeabi-v 7 aディレクトリに格納されます.企業B:ABIファイルはarmeabi-v 5 teですが、armeabi-v 7 aディレクトリに入れます.
soファイルの重要な法則
处理soファイルには簡単だが知られていない重要な法則がある.ABIごとに最適化されたものをできるだけ提供するべきです.soファイル
NDKの互換性
NDKを使用する場合は、NDKは後方互換性があるため、appのminsdkValerson対応のコンパイルプラットフォームを選択します.
注意事項
すべてのABIフォルダが提供するsoは一貫性を保つ
我々のアプリケーションが複数のABIをサポートすることを選択した場合、ABIごとにsoがサポートされているが、すべてサポートされているか、サポートされていないかに注意してください.混合して使用すべきではなく、ABIディレクトリごとに対応するものを提供すべきである.soファイル.
参考記事
Androidアプリをパッケージ化する際にarmeabiと互換性が必要ですかAndroidのso ABIとCPUの関係の難病Android ABIの概念について話します
さらに
個人的なgithubの暇な時間の書くストーリ