デバイスのアーキテクチャを表示する
adb -s エミュレータ-5554 シェル getprop ro.product.cpu.abi
C:\Users\liyd>adb -s emulator-5554 shell getprop ro.product.cpu.abi
x86_64
C:\Users\liyd>adb -s 804c11f1 shell getprop ro.product.cpu.abi
arm64-v8a
ムームーエミュレータ12
C:\Users\liyd>adb -s 127.0.0.1:7555 shell getprop ro.product.cpu.abi
x86_64
アーキテクチャとCPU
ネイティブ コードを操作する場合、ハードウェアは重要です。NDK では ABI を選択できるため、正しいアーキテクチャと CPU に合わせてコンパイルできるようになります。
このセクションでは、ビルド時に特定のアーキテクチャと CPU をターゲットにする方法、ARM Neon 拡張命令セットの使用方法、実行時にオプション機能をクエリするための CPU 関数ライブラリの使用方法について説明します。
Android ABI - NDK
bookmark_border
異なる Android デバイスは異なる CPU を使用し、異なる CPU は異なる命令セットをサポートします。CPU と命令セットの各組み合わせには、独自のアプリケーション バイナリ インターフェイス (ABI) があります。ABI には次の情報が含まれています。
利用可能な CPU 命令セット (および拡張機能)。
実行時のメモリストアとロードのエンディアン。Android は常にリトルエンディアンです。
アプリケーションとシステムの間でデータを受け渡すための仕様。これには、アライメント制限や、関数を呼び出すときにシステムがスタックとレジスタを使用する方法が含まれます。
プログラムや共有ライブラリなどの実行可能バイナリの形式と、それらがサポートするコンテンツ タイプ。Android は常に ELF を使用します。詳細については、「ELF System V アプリケーション バイナリ インターフェイス」を参照してください。
C++ 名を管理する方法。詳細については、「汎用/Itanium C++ ABI」を参照してください。
このページでは、NDK でサポートされている ABI をリストし、各 ABI がどのように機能するかを説明します。
ABI は、プラットフォームでサポートされているネイティブ API を参照することもできます。32 ビット システムに影響を与えるこのような ABI の問題のリストについては、「32 ビット ABI のバグ」を参照してください。
サポートされている ABI
ZygoteInit.java
private static final String ABI_LIST_ARG = "--abi-list=";
private static final String SOCKET_NAME_ARG = "--socket-name=";
public static void main(String argv[]) {
566 try {
567 RuntimeInit.enableDdms();
568 // Start profiling the zygote initialization.
569 SamplingProfilerIntegration.start();
570
571 boolean startSystemServer = false;
572 String socketName = "zygote";
573 String abiList = null;
574 for (int i = 1; i < argv.length; i++) {
575 if ("start-system-server".equals(argv[i])) {
576 startSystemServer = true;
577 } else if (argv[i].startsWith(ABI_LIST_ARG)) {
578 abiList = argv[i].substring(ABI_LIST_ARG.length());
579 } else if (argv[i].startsWith(SOCKET_NAME_ARG)) {
580 socketName = argv[i].substring(SOCKET_NAME_ARG.length());
581 } else {
582 throw new RuntimeException("Unknown command line argument: " + argv[i]);
583 }
584 }
585
586 if (abiList == null) {
587 throw new RuntimeException("No ABI list supplied.");
588 }
589
590 registerZygoteSocket(socketName);
591 EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,
592 SystemClock.uptimeMillis());
593 preload();
594 EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,
595 SystemClock.uptimeMillis());
596
597 // Finish profiling the zygote initialization.
598 SamplingProfilerIntegration.writeZygoteSnapshot();
599
600 // Do an initial gc to clean up after startup
601 gcAndFinalize();
602
603 // Disable tracing so that forked processes do not inherit stale tracing tags from
604 // Zygote.
605 Trace.setTracingEnabled(false);
606
607 if (startSystemServer) {
608 startSystemServer(abiList, socketName);
609 }
610
611 Log.i(TAG, "Accepting command socket connections");
612 runSelectLoop(abiList);
613
614 closeServerSocket();
615 } catch (MethodAndArgsCaller caller) {
616 caller.run();
617 } catch (RuntimeException ex) {
618 Log.e(TAG, "Zygote died with exception", ex);
619 closeServerSocket();
620 throw ex;
621 }
622 }