“Android 로봇은 Google에서 제작하여 공유한 저작물을 복제하거나 수정한 것으로 Creative Commons 3.0 저작자 표시 라이선스의 약관에 따라 사용되었습니다.”
일반적으로 잘 사용하지 않을 수 있지만 CPU의 아키텍쳐가 필요할 때가 있다. Android에서는 ABI (Application Binary Interface)를 이용하여 CPU의 아키텍쳐를 유추해볼 수 있다.
Android Devloper 문서에는 ABI의 내용을 아래와 같이 안내하고 있다.
쉽게 말하면 명령어 셋트를 포함하는 CPU 아키텍쳐라고 보면 될 것 같다.
아키텍쳐 종류 대해서 간단히 분류하자면 아래와 같다.
CISC
PC에서 주로 쓰이는 CPU (AMD, Intel) 들을 생각하면 된다.
RISC
모바일에서 주로 사용되는 ARM 프로세서들을 생각하면 된다.
ABI의 종류는 아래와 같다.
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'가 출력되었다.
하지만 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")
를 사용해도 무방하다.
개인적으로 공부했던 것을 바탕으로 작성하다보니
잘못된 정보가 있을수도 있습니다.
인지하게 되면 추후 수정하겠습니다.
피드백은 언제나 환영합니다.
읽어주셔서 감사합니다.