web-dev-qa-db-ja.com

Androidアプリバンドル-> apkには必要なネイティブライブラリが含まれていません

新しいアプリバンドル形式(aab)を使用してアプリを公開しています。このアプリには、armeabi-v7a用のネイティブライブラリがいくつか含まれています。 Google Playを介してarm64-v8aアーキテクチャにアプリをインストールすると、arm64-v8asoファイルがないネイティブライブラリが含まれません。

これ https://stackoverflow.com/a/39622499/534471 によると、armeabi-v7aライブラリはarm64-v8aデバイスで実行する必要があります(およびadbを介してインストールすると正常に動作するため、実際に動作します)。

Google Playコンソールには、アーキテクチャ、画面密度などによってさまざまなapkが表示されます。apkのサイズから、ネイティブライブラリが含まれていないapkが明確にわかります。また、ネイティブライブラリモニターアプリを使用してインストールされたapkを分析しますが、必要なネイティブライブラリが明らかに含まれていません(アプリにarm64-v8a soファイルがある場合はarm64-v8aネイティブライブラリが含まれますが、armeabiしかない場合は含まれません) -v7aバージョン)。

私のgradleビルドファイルには、バンドル構成用の次の小さなコードが含まれています。

    bundle {
        language {
            enableSplit = false
        }
        density {
            enableSplit = true
        }
        abi {
            enableSplit = true
//            include 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
        }
    }

ここに私の質問があります:ビルドツールに各apkに「次善の」ネイティブライブラリを含めるように指示する方法はありますか?次善は特定のアーキテクチャで実行される最も近いバージョンです。

PS:abiにenableSplit = falseを設定すると、ネイティブライブラリが含まれます(予想どおり)が、残念ながら、x86を含むすべてのプラットフォームで20MBの大きさです...

Google Playがアプリバンドルをapkに分割する方法をまだ見ていない人のために、スクリーンショットを次に示します: enter image description here

7

次善の策を提供するようにツールに指示する必要はありません。それは自動的に行われる必要があります。デバイスがarmeabi-v7aもサポートしていると報告した場合、デバイスはそれを含むAPKを受信する必要があります。

編集:

スクリーンショットを考えると、アプリはarm64-v8aアーキテクチャのネイティブライブラリを提供しているようです。そのため、arm64-v8aライブラリではなくarmeabi-v7aライブラリが提供されます。

また、1つのデバイスが同じアプリの異なるアーキテクチャからライブラリをロードできないことにも注意してください。つまり、一部のライブラリが64ビットでロードされ、他のライブラリが32ビットでロードされることは期待できません。すべてのABIを含む「ファット」APKでも、Androidプラットフォームはアプリのインストール時に1つのABIのみを選択し、他のすべてのファイルを破棄するため、少なくとも1つのライブラリを提供した瞬間からarm64-v8aの場合、armeabi-v7aライブラリはいずれもarm64-v8aデバイスにロードされません。

編集

そのアーキテクチャに必要なネイティブライブラリを提供できない場合は、アプリから一部のABIを除外することを検討する必要があります。これは、gradleconfigのabiFiltersブロックを使用して実現できます。

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

6
Pierre