Android アーキテクチャ アーキテクチャと CPU ABI - NDK

デバイスのアーキテクチャを表示する

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    }

おすすめ

転載: blog.csdn.net/qq_42015021/article/details/132558370