web-dev-qa-db-ja.com

Android Architecture usage?

かなり大きく、アプリケーションのバイナリサイズが肥大化するネイティブライブラリがいくつかあります。 APK splitting を調べましたが、複数のAPKを維持およびQAすることは、私がやりたいことではありません。

したがって、ndk.abiFilters Gradleプロパティを使用して、リリースビルドフレーバーの未使用のアーキテクチャを除外したいと思います。 (x86でHAXMアクセラレータエミュレータを実行できるように、デバッグビルドはそのままにしておきます)。

リリースフレーバーにarmeabi-v7aとarm64-v8aを含めることを考えていましたが、ドロップする他のアーキテクチャの市場シェアを心配する価値があるかどうかはわかりません。よく見て回った後、ARMv6(armeabi)、MIPS、x86、またはx86_64の市場シェアへの参照が見つかりません。私の直感では、後者の3つはほとんど存在しないと言っていますが、ARMv6についてはわかりません。

フォーラムのこのリンク には、さまざまなアーキテクチャを使用する電話のリストがあります。どこかにもっと信頼できるものがありますか? Androidバージョンダッシュボードに似たユーザーの割合で?

Armeabi-v7aおよびarm64-v8a(またはarmeabi、armeabi-v7a、arm64-v8a)のネイティブライブラリをビルドするだけで、他に見逃すことはありますか?

39
kos

まず、バイナリサイズが心配な場合は、arm64-v8aは必要ありません。これらのデバイスはすべてarmeabi-v7aバイナリを正常に実行できます。最後の追加のパフォーマンスを本当に詰め込む必要がある場合にのみ、価値があるかもしれません。

ArmeabiとARMv6については、 Android以来、それ自体は公式にサポートしていません。Android 4.4(2013年10月)-以降、Android 4.0あまり一般的ではないはずです(そのバージョンから、AOSPソースはまだARMv6向けにビルドするために変更が必要です)。

また、x86の場合。これらのデバイスの多くは、アームバイナリの驚くほどまともなエミュレーションを備えて出荷されているため、armeabi-v7aバージョンでも問題なく管理できます。

38
mstorsjo

app bundles を使用する場合、追加のアーキテクチャを含めてもバイナリサイズに影響はありません。その場合、Google Playは各デバイスにその特定のデバイスに適用されるバイナリのみを提供します。それだけでなく、アプリケーションの更新もずっと小さくて高速になります。

アプリバンドルをまだ使用していないプロジェクトの以前の情報を残す:

  • 残念ながら、 Androidダッシュボード は、それだけで便利ですが、アーキテクチャ情報もGoogle Analyticsも提供しません。

  • nity statistics は、 アーキテクチャおよびCPU機能ごとの統計 を提供するために使用されます。ただし、これらは一般的な統計ではなく、Unityアプリケーション/ゲームのユーザーのみを対象としています。情報は公開リンクで利用できなくなっているようですので、直接リンクをarchive.orgの最新のスナップショットに置き換えました。

30
Jose Gómez

Mapbox を使用するとこの問題が発生し、この article が非常に便利であることがわかりました。

必要な下の写真のベースarmeabi-v7aおよびx86およびベースon JoseGómez answerarmeabi-v7aを追加するだけで、まったく問題ありません。

app.gradleにこの行を追加してください

Android {
 defaultConfig {
        //other configs
        ndk {
            abiFilters "armeabi-v7a"
        }
    }
}

それでもまだ2%から3%が心配な場合は、ASUS ZenFonelenovo電話などのx86アーキテクチャを使用する必要がありますapp.gradleのこの行

ndk {
    abiFilters "armeabi-v7a", "x86"
}

enter image description here

12
Radesh

@mstorsjoの回答を読んだとき、非常にシンプルで簡単ですが、実際には1つ(または2つ)のネイティブライブラリを実際に使用する方法が少し混乱していました。したがって、ここで例といくつかの説明を行います(私のさらなる研究に基づく)。

サポートされているアーキテクチャごとに、jniLibsフォルダーに特定のフォルダーを作成し、そこに.soファイルをドロップする必要があります。例として、armeabi-v7a(32bit)およびarm64-v8a(64bit)をサポートする場合:

|--app
|--|--src
|--|--|--main 
|--|--|--|--jniLibs 
|--|--|--|--|--armeabi-v7a 
|--|--|--|--|--|--.so Files 
|--|--|--|--|--arm64-v8a 
|--|--|--|--|--|--.so Files 

armeabi-v7aを使用すると、使用可能なデバイスの90%以上をサポートしますが、32ビットアーキテクチャであるため、64ビットデバイスで実行するとパフォーマンスが低下します(20-30 %) {1} 。特定のケースごとに、サポートされているデバイスの実際の量を確認することは非常に便利です。これは、フィルターとしてABIを指定して、リリース管理>デバイスカタログセクションのGoogle Playコンソール内で実行できます。

注意

すべてのアーキテクチャにバイナリを追加しない場合、次のことに注意する必要があります。

アプリに他のネイティブライブラリが含まれている場合は、それらの同じバージョンのみを持っていることを確認する必要があります。これはAndroidロードされたすべてのネイティブライブラリを同じアーキテクチャ用に構築することを要求するためです。たとえば、最初にロードされたネイティブライブラリがarmeabi-v7a、Androidは、[〜#〜] only [〜#〜]のようになりますarmeabi-v7aその後のすべてのSystem.loadLibrary()呼び出しのライブラリ。その正確なアーキテクチャが見つからない場合、Java.lang.UnsatisfiedLinkError例外がスローされます。 {1 }

依存関係の一部がネイティブライブラリを使用しているため、armeabi-v7aをロードできなくなったため、この問題に遭遇しました。

3
goemic