Android에서 CPU 아키텍쳐(ABI) 구분 방법

지프치프·2024년 11월 15일
0

Android

목록 보기
87/89
post-thumbnail

“Android 로봇은 Google에서 제작하여 공유한 저작물을 복제하거나 수정한 것으로 Creative Commons 3.0 저작자 표시 라이선스의 약관에 따라 사용되었습니다.”


개요

일반적으로 잘 사용하지 않을 수 있지만 CPU의 아키텍쳐가 필요할 때가 있다. Android에서는 ABI (Application Binary Interface)를 이용하여 CPU의 아키텍쳐를 유추해볼 수 있다.

ABI (Application Binary Interface)

Android Devloper 문서에는 ABI의 내용을 아래와 같이 안내하고 있다.

쉽게 말하면 명령어 셋트를 포함하는 CPU 아키텍쳐라고 보면 될 것 같다.

아키텍쳐 종류 대해서 간단히 분류하자면 아래와 같다.

  • CISC
    PC에서 주로 쓰이는 CPU (AMD, Intel) 들을 생각하면 된다.

    1. x86
    2. x86_64
    3. i686
  • RISC
    모바일에서 주로 사용되는 ARM 프로세서들을 생각하면 된다.

    1. AArch32
    2. AArch64

ABI의 종류는 아래와 같다.

  • armeabi-v7a (32비트 RISC 아키텍쳐)
    지원 명령어 셋트
    1. armeabi
    2. Thumb-2
    3. 네온
  • arm64-v8a (64비트 RISC 아키텍쳐)
    지원 명령어 셋트
    1. AArch64
  • x86 (32비트 CISC 아키텍쳐)
    지원 명령어 셋트
    1. x86(IA-32)
    2. MMX
    3. SSE/2/3
    4. SSSE3
  • x86_64 (64비트 CISC 아키텍쳐)

가져오는 방법

System.getProperty("os.arch")

Java 라이브러리에서 가져오는 함수를 지원한다.
System.getProperty("os.arch") 함수를 사용하면 JVM으로부터 아키텍쳐를 가져올 수 있다.

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }
        
        // os.arch 값 출력
        MaterialAlertDialogBuilder(this)
            .setMessage("""
                os.arch : ${System.getProperty("os.arch")}
            """.trimIndent())
            .setPositiveButton("확인", null)
            .show()
    }

위 샘플 소스를 실행시켜 Dialog에 아키텍쳐를 출력해본다.

갤럭시 S24 플러스에서 실행한 사진

PC에서 실행한 사진

갤럭시S24 플러스의 경우 ARM 기반 퀄컴 프로세서가 탑재되어 'AArch64'가 출력되었고

PC의 경우 AMD CPU 프로세서가 탑재되어 'x86_64'가 출력되었다.

ABI

하지만 System.getProperty("os.arch")를 사용한 방법에는 맹점이 있다. JVM에서 아키텍쳐를 가져오기 때문에 NDK 사용을 위해 build.gradle에서 ABI를 별도로 설정한 상황이라면
설정된 ABI를 그대로 반환하기 때문에 의도한 동작이 되지 않을 수 있다.

이럴때는 Build.SUPPORTED_ABIS 를 사용하는 것이 좋다.
Build.SUPPORTED_ABIS는 단말기에서 지원하는 모든 ABI를 반환하기 때문이다.

        MaterialAlertDialogBuilder(this)
            .setMessage("""
                os.arch : ${System.getProperty("os.arch")}
                ABIS    : ${Build.SUPPORTED_ABIS.toList()}
            """.trimIndent())
            .setPositiveButton("확인", null)
            .show()

최우선 ~ 호환되는 순서대로 ABI를 반환하므로
배열 내에 첫번째 요소를 가져온다면 CPU 아키텍쳐를 체크할 수 있다.

요약

프로젝트의 build.gradle에 ABI 설정이 되어있다면
-> Build.SUPPORTED_ABIS 를 사용해야 한다.
ABI 설정이 되어있지 않다면
-> System.getProperty("os.arch")를 사용해도 무방하다.

개인적으로 공부했던 것을 바탕으로 작성하다보니
잘못된 정보가 있을수도 있습니다.
인지하게 되면 추후 수정하겠습니다.
피드백은 언제나 환영합니다.
읽어주셔서 감사합니다.

profile
지프처럼 거침없는 개발을 하고싶은 개발자

0개의 댓글