新しいアプリバンドル形式(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に分割する方法をまだ見ていない人のために、スクリーンショットを次に示します:
次善の策を提供するようにツールに指示する必要はありません。それは自動的に行われる必要があります。デバイスが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' }