ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Apple Slicon(M1, M2)에서 로제타 없이 안드로이드 NDK빌드
    Unix Linux Like 2022. 12. 21. 16:25

    Android Studio 안정버전 Dolphin 2021.3.1 Patch1기준 NDK를 사용시 로제타 없이 빌드가 안됩니다.

    이유는 기본 NDK툴들이 아직 x86_64만 지원하고 있기 때문입니다.

    로제타 없이 x86_64용 앱 또는 실행파일을 실행하려고 하면 다음과 같은 에러가 뜹니다.

     

    error=86, Bad CPU type in executable

     

    로제타는 유용하긴 하지만 아무래도 네이티브 보다 느질수 밖에 없고,

    메모리가 부족한 환경에서는 쓰지 않는게 더 쾌적했던 개인적인 경험으로

    로제타 없이 안드로이드 NDK 빌드 및 디버깅을 위한 시행착오를 기록합니다.

     

    NDK 버전

    NDK 24버전 부터 M1을 지원하고 있습니다.

    NDK23c에 백포팅 되었으며 둘중 하나의 버전을 사용하면 됩니다.

    별도로 버전을 지정하지 않으면  AGP(Android Gradle Plugin)에서 사용하는 기본 버전을 사용하므로

    다음과 같이 ndk를 추가 후 앱 또는 라이브러리의 Build.gradle에 버전을 입력합니다.

    android {
        ndkVersion "25.1.8937393"
    }

     

    CMake 버전

    cmake 3.22.1 버전부터 universal binary 지원하고 있습니다.

    ndk와 같이 버전을 지정해야 합니다.

    android {
        externalNativeBuild {
            cmake {
                path "src/main/cpp/CMakeLists.txt"
                version "3.22.1"
            }
        }
    
        ndkVersion "25.1.8937393"
    }

     

    디버깅

    Android Studio Dolphin | 2021.3.1 Patch 1 기준  디버거 동작시 LLDBFrontend 및 몇몇 툴들이 universal binary 가 아닙니다.

    그래서 디버깅을 하려고 하면 다음과 같이 에러가 발생합니다.

    Error while starting native debug session: com.intellij.execution.process.ProcessNotCreatedException: Cannot run program "/private/var/folders/gg/2rwy3jyj31db0mbqj3qpcb5c0000gn/T/AppTranslocation/0A5813D0-CFE2-4048-B921-E45F6BFF304D/d/Android Studio.app/Contents/plugins/android-ndk/resources/lldb/bin/LLDBFrontend": error=86, Bad CPU type in executable

     

    해당 LLDBFrontend를 바꾸려면 Canary 버전인 Flamingo | 2022.2.1 를 사용 해야하는데

    아직 안정버전은 아니라 버그가 많을 수 있습니다.

     

    universal binary 확인 방법

    universal binary이 아니경우

    % file cmake/3.18.1/bin/cmake
    cmake/3.18.1/bin/cmake: Mach-O 64-bit executable x86_64

    universal binary 라이브러리 인 경우

    % file cmake/3.22.1/bin/cmake
    cmake/3.22.1/bin/cmake: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64
    - Mach-O 64-bit executable x86_64] [arm64]
    cmake/3.22.1/bin/cmake (for architecture x86_64):	Mach-O 64-bit executable x86_64
    cmake/3.22.1/bin/cmake (for architecture arm64):	Mach-O 64-bit executable arm64

     

    참조

    - AGP별 NDK 기본 버전

    htps://developer.android.com/studio/projects/install-ndk#default-ndk-per-agp

     

    - Android NDK Apple SiliconM1 run into: Unknown host CPU architecture arm64

    https://stackoverflow.com/questions/69540688/android-ndk-apple-siliconm1-run-into-unknown-host-cpu-architecture-arm64/69540773#69540773

     

     

    728x90
    반응형

    댓글

Designed by Tistory.