web-dev-qa-db-ja.com

32ビットと64ビットの両方のアーキテクチャをサポートするAndroidアプリの作成方法

Google Playからのニュースレター 来年以降、ストアは「新しいアプリとネイティブライブラリを使用したアプリの更新には、32ビットバージョン」。

まだ読んでいない人のために、次のように述べています。

2019年の64ビットサポート要件

64ビットアーキテクチャのプラットフォームサポートは、Android 5.0で導入されました。現在、オンラインになっているAndroidデバイスの40%以上が64ビットをサポートしていますが、32ビットの互換性は維持されています。ネイティブライブラリを使用するアプリの場合、64ビットコードは通常、追加のレジスタと新しい命令により、パフォーマンスが大幅に向上します。

64ビットコードのみをサポートする将来のAndroidデバイスを見越して、Playコンソールでは、ネイティブライブラリを使用した新しいアプリとアプリの更新で、32ビットバージョンに加えて64ビットバージョンを提供する必要があります。これは、単一のAPK内、または公開された複数のAPKの1つとして使用できます。

32ビットサポートは削除されません。 Google Playは32ビットのアプリとデバイスを引き続きサポートします。ネイティブコードを含まないアプリは影響を受けません。

この変更は2019年8月に有効になります。64ビットをまだサポートしていない開発者が移行を計画するための十分な時間を確保するために、本日事前通知を提供しています。今後の投稿では、Androidでの64ビットネイティブライブラリのパフォーマンス上の利点について詳しく見ていきます。詳細については、NDKのCPUおよびアーキテクチャガイドをご覧ください。

該当する場合、この新しい要件に完全に準拠するには、どのような実用的な変更が必要ですか?

21
JorgeAmVF

Google Playチームから送信された公式メールによると、必要なアクションは次のとおりです。

まだお持ちでない場合は、できるだけ早く64ビット要件の作業を開始することをお勧めします。多くのアプリは完全に非ネイティブコード(たとえば、Javaプログラミング言語またはKotlin)で記述されており、コードの変更は不要です。

32ビットサポートに関するポリシーは変更していないことに注意してください。 Google Playは、32ビットネイティブコードのアプリを32ビットデバイスに引き続き提供します。この要件は、これらのアプリにも64ビットバージョンが必要であることを意味します。

移行を支援するために、アプリが既に64ビットをサポートしているかどうかを確認する方法と、64ビットに準拠する方法について documentation を用意しました。

また、以下で高レベルのタイムラインを提供しています。

そのため、リンクされたドキュメントでは次のことが説明されています。

アプリがJavaプログラミング言語またはKotlinで記述されたコード(ライブラリまたはSDKを含む)のみを使用する場合、アプリは既に64ビットデバイスに対応しています。アプリがネイティブコードを使用している場合、またはネイティブコードを使用しているかどうか不明な場合は、アプリを評価してアクションを実行する必要があります。

[...]

64ビットライブラリをチェックする最も簡単な方法は、APKファイルの構造を調べることです。ビルドされると、APKはアプリに必要なネイティブライブラリとともにパッケージ化されます。ネイティブライブラリは、ABIに基づいてさまざまなフォルダーに格納されます。すべての64ビットアーキテクチャをサポートする必要はありませんが、サポートするネイティブ32ビットアーキテクチャごとに、対応する64ビットアーキテクチャを含める必要があります。

ARMアーキテクチャの場合、32ビットライブラリはarmeabi-v7aにあります。対応する64ビットはarm64-v8aです。

X86アーキテクチャの場合、32ビットのx86および64ビットのx86_64を探します。

最初に行うことは、これらのフォルダーの両方にネイティブライブラリがあることを確認することです。[...]

また、64ビットライブラリを構築するには、基本的に以下の手順に従う必要があります。

ほとんどのAndroid St​​udioプロジェクトは、基礎となるビルドシステムとしてGradleを使用するため、このセクションは両方の場合に適用されます。ネイティブコードのビルドを有効にするには、サポートするアーキテクチャに応じて、アプリの「build.gradle」ファイルのndk.abiFilters設定にarm64-v8aまたはx86_64を追加するだけです。

// Your app's build.gradle
apply plugin: 'com.Android.app'

Android {
   compileSdkVersion 27
   defaultConfig {
       appId "com.google.example.64bit"
       minSdkVersion 15
       targetSdkVersion 28
       versionCode 1
       versionName "1.0"
       ndk.abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
// ...

最後に、簡単なメモ:

アプリの64ビットバージョンは、32ビットバージョンと同じ品質と機能セットを提供する必要があります。

ちなみに、 この公式ビデオ について少し話しています。

16
JorgeAmVF

ネイティブ(NDK)コードがない場合、つまりJava/Dexコードのみを記述している場合は、何もする必要はありません。

ネイティブコード(またはライブラリ)がある場合は、64ビットバージョンを提供する必要があります。

8
Nick Fortescue

ドキュメント here に従って、アプリがネイティブコードまたは外部ライブラリ、たとえばネイティブに基づくレルム(下図)を使用している場合、64ビットのサポートを提供する必要があります。 C/C++(ネイティブ)を使用するアプリの外部ライブラリのいずれかが32ビットと64ビットの両方のアーキテクチャをサポートする必要がある場合は、ライブラリの所有者に連絡する必要があります。 Android St​​udioでは、ビルド> APKの分析で両方のアーキテクチャのバージョンが利用可能かどうかを確認でき、次のウィンドウが表示されます。

Android Studio tab showing avaiable architectures

NDKを使用してネイティブコードを作成している場合、次のようにgradleに登録することにより、両方のアーキテクチャのサポートを提供する必要があります。

defaultConfig {  
   ndk.abiFilters = 'armeabi-v7a' 'arm64-v8a' 'x86' 'x86_64'
   }
4
Irfan Ul Haq

Android AP​​Kに64ビットサポートが含まれていない場合、心配する必要はありません。 Android St​​udioで[ビルド]-> [APKの分析]に移動します。 APKの構造を確認できます。 libでarmeabi-v7aライブラリが表示され、arm64-v8aまたはx86_64ライブラリがない場合、APKは64ビットアーキテクチャをサポートしていません。

アプリレベルbuild.gradleに移動し、次のようにabiFiltersの下にNDKでdefaultConfigを追加します。

ndk {
    abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64'
}
3
sagarchavan
  • オプション1-APKからlibを削除します。
    • ステップ1-APKをZipに変換し、libフォルダーを見つけます。 libフォルダーがある場合は、ライブラリーの依存関係を参照してください。
    • ステップ2-ビルドGradleから依存関係を削除します。
  • オプション2-64ビットと32ビットのJARファイルをダウンロードし、アプリとビルドのlibフォルダーに追加します。
1

ネイティブコード:は、実行中のコンピューターのCPU命令に直接コンパイルされた実行可能プログラムを指します。

非ネイティブコード:は、1970年代および1980年代後半の元のタンデムアーキテクチャのCPU命令にコンパイルされた実行可能プログラムを指します。このようなプログラムが実行されると、実行中のコンピューターのCPUで直接実行することはできません。 NonStopオペレーティングシステムには、そのような非ネイティブコードの実行に使用される、元のタンデムアーキテクチャ用のインタープリターが含まれています。

アプリがJavaプログラミング言語またはKotlinで記述されたコード(ライブラリまたはSDKを含む)のみを使用する場合、アプリは既に64ビットデバイスに対応しています。アプリがネイティブコードを使用している場合、またはネイティブコードを使用しているかどうか不明な場合は、アプリを評価してアクションを実行する必要があります。

アプリはネイティブコードを使用していますか?

最初に行うことは、アプリがネイティブコードを使用しているかどうかを確認することです。次の場合、アプリはネイティブコードを使用します。

  • アプリでC/C++(ネイティブ)コードを使用します。
  • サードパーティのネイティブライブラリとリンクします。
  • ネイティブライブラリを使用するサードパーティのアプリビルダーによって構築されます。

詳細については、 ドキュメントをご覧ください

1

追加中

ndk {
    abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64'
} 

DefaultConfigの下のbuild.Gradleファイル内。 Push to Playストアの64ビット要件が近づいていることに注意してください。

0