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ライブラリがないことを発見すると、エラーが発生します.
    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の暇な時間の書くストーリ