ART와 Dalvik을 비교하고 특징에 대해 공부하면서 어떤 문제 때문에 ART를 도입하고 ART에서 새로운 기능을 도입하였는지 알 수 있었습니다.
ART와 Dalvik 설명에 앞서서 DEX파일과 AOT 컴파일러와 JIT 컴파일러에 대해 가볍게 알아보겠습니다.
DEX 파일
Android에서 DEX 파일은 "Dalvik Executable" 파일을 의미합니다. 이 파일 형식은 자바 바이트코드(.class 파일)를 Dalvik 가상 머신이나 Android Runtime (ART)에서 실행할 수 있는 형태로 변환한 것입니다.
안드로이드 환경에서 동작되도록 최적화되어 있습니다.
AOT(Ahead Of Time) , JIT(Just In Time)
JIT 컴파일러가 바이트 코드를 런타임에 기계어로 바꾼다면 AOT는 실행 전에 바이트 코드를 기계어로 바꾸는 컴파일러
AOT는 실행 전에 바이트 코드를 기계어로 변환하기 때문에 설치 시간이 오래 걸리지만 기계어로 변환해두었기 때문에 실행 속도가 빠르다는 장점이 있습니다. 기계어로 변환해둔 파일 때문에 JIT 보다 파일 크기가 커진다는 단점이 있습니다.
JIT는 설치 시간은 빠르지만 최초 실행 시에는 실행하는 코드를 기계어로 컴파일 해야 되기 때문에 오버헤드가 발생할 수 있습니다. 실제 실행하는 코드만 컴파일하기 때문에 사용하지 않는 코드에 대한 메모리 절약이 가능하다는 장점이 있습니다.
Dalvik Virtual Machine
Java 라이선스 문제로 Java 언어로 작성된 코드를 실행하기 위해 개발되었습니다.
Dalvik이 도입되고 안드로이드 5.0 (롤리팝) 이전까지 사용되었습니다.
D8 빌드 도구를 통해 DEX 포맷으로 변경되고 DEX 파일을 Dalvik VM이 기계어로 변환합니다.
Dalvik은 JIT 컴파일러를 사용하기 때문에 런타임에 기계어로 변환하며 설치 시간이 빠르다는 장점이 있습니다.
Dalvik의 JIT 컴파일러는 자주 실행되는 코드 부분을 말하는 ‘핫스팟’을 식별하고 최적화합니다.
Android에서 Dalvik을 사용하면서 생겼던 문제가 있습니다. JIT 컴파일러를 사용하기 때문에 실행 시에 상당한 부하가 생겨 배터리 시간이 저하되었습니다. 실행 직전에 실행 부분 전체를 RAM에 올려놔야 했기 때문에 램 사용량도 많았습니다.
ART (Android Runtime)
Dalvik이 가진 문제를 해결하기 위해 ART는 안드로이드 5.0 (롤리팝)부터 도입되어, Dalvik 가상 머신을 대체하였습니다.
ART는 Android의 애플리케이션 및 일부 시스템 서비스에서 사용하는 관리형 런타임입니다.
AOT 컴파일러를 사용하고 Dalvik보다 설치 시간 확인이 엄격합니다. 가비지 컬렉션과 앱 개발, 디버깅을 개선했습니다.
ART는 AOT의 단점을 보완하기 위해 코드 프로파일링 기능이 있는 JIT 컴파일러를 포함하고 있습니다. JIT 컴파일러는 ART의 현재 AOT(ahead-of-time) 컴파일러를 보완하고 런타임 성능을 개선하며 저장공간을 절약하고 애플리케이션 및 시스템 업데이트를 가속화합니다. 자주 사용하는 코드만 AOT 컴파일러를 통해 기계어를 번역해두고 나머지 코드는 JIT 컴파일러를 통해 번역하고자 합니다.
ART의 기능
1. oat파일 (Android Optimized ART) 사용
oat 파일은 APK에 포함된 dex 파일이 안드로이드 장치에 설치될 때, AOT 컴파일 과정을 거쳐 생성되는 파일이며 최적화를 위해 사용됩니다.
2. DEX 파일의 용량 줄이기
위 사진은 안드로이드 상위 99개의 Dex 파일 평균 통계입니다.
가장 많이 차지하는 항목은 CodeItem 영역이며 이는 ART에서 사용하는 Dex 명령어가 포함되어있습니다.
두 번째는 StringData 영역으로 코드, 메서드 이름, 클래스 이름 및 필드 이름에서 로드된 문자열 리터럴이 포함되어있습니다.
두 영역을 합치면 약 64%나 차지하기 때문에 중요한 영역입니다.
구글에서는 이부분에 집중하여 메모리를 줄여낼 방법에 대해 고안했다고 합니다.
2.1 CompactDex 사용
P 버전부터 DEX 파일의 메모리 사용량을 줄이기 위해 CompactDex 파일을 도입했습니다.
더 빠르게 로드될 수 있도록 설계되었고 실행 시간을 최적화했습니다.
DEX 파일이 여러 개 일 경우, 메서드, 문자열 데이터에서 중복되는 경우가 많다는 문제가 있었고 이 중복을 줄이고자 했습니다.
AOT는 APK에서 DEX 파일을 추출해 VDex 컨테이너에 저장하게 됩니다.
CompactDex를 사용하지 않고 기존 Dex를 사용한다면 data section이 중복되는 경우가 생길 수 있습니다.
CompactDex 도입 후에는 중복된 data를 제거하고 shared data section을 통해 관리합니다. shared data section에서 가장 보기 쉬운 영역이 StringData입니다. 이를 통해 StringData 섹션을 줄일 수 있습니다.
헤더의 필드를 각각 4바이트로 축소하고 명령어의 수도 줄여냈습니다.
2.2 DEX 지역화로 레이아웃 최적화
N버전에서는 레이아웃 최적화 기술이 없었습니다.
O 버전에서는 지역성을 도입하여 실행 중에 자주 엑세스 하는 코드에 대해 함께 그룹화하는 레이아웃 최적화 기술을 도입하였습니다.
P 버전에서는 실행 중에 사용되는 코드를 함께 묶을 수 있는 보다 유연한 정보를 제공하여 더욱 최적화를 이뤄냈습니다. 필요한 경우가 아니면 메모리에 로드되지 않도록 해서 메모리 사용을 더 최적화하였습니다.
즉, 지역화를 통해 DEX 파일을 로드되는 부분을 줄여내 메모리 사용량을 줄여낼 수 있습니다.
3. Profile 사용
Profile은 ART 컴파일러가 설치 중에 중요한 경로를 기계어 코드로 사전 컴파일하는 데 사용하는 APK에 포함된 클래스 및 메서드 목록입니다. Profile은 앱이 실행되는 동안 어떤 메서드와 클래스가 가장 자주 사용되는지, 그리고 어떤 종류의 코드가 최적화가 필요한지에 대한 정보를 포함합니다. Profile은 앱이 시작을 최적화하고, 버벅거림을 줄이고, 최종 사용자가 경험하는 성능을 개선할 수 있도록 해 주는 일종의 프로필 기반 최적화(PGO)입니다.
Profile을 사용하면 포함된 코드 경로의 해석과 JIT컴파일 단계를 피하여 최초 실행 후 코드 실행 속도가 약 30% 향상됩니다.
앱을 자주 실행할수록 더 최적화되고 폰이 충전 중이거나 유휴 상태일 때 더욱 최적화합니다.
위 통계로 최적화를 통한 실행 시간 향상된 것을 볼 수 있습니다. 최적화 후 25% 빨라졌습니다.
4. Cloud Profile 사용
Cloud Profile을 사용하여 Profile 사용을 더욱 효과적으로 사용하고자 합니다. Cloud Profile은 29 이상 기기에서만 지원됩니다.
Cloud Profile 을 생각하게된 계기는
- 일반적으로 다수의 사용자와 장치 간에 공유되는 일반적으로 사용되는 코드 경로가 많이 있다는 것 (공통적으로 사용되는 코드가 많다는 의미인듯하다)
- 대부분의 앱 개발자는 알파/베타 버전부터 점진적으로 기능을 확장해감
이 2가지 이유였습니다.
위 통계는 Profile 집계 수에 따른 핵심 프로필 정보 양을 나타냅니다. 위 통계를 보면 20~40개만 있어도 정체된다는 것을 알 수 있습니다. 즉, Core Profile을 구축하는데 프로필 정보 개수가 20~40개 정도만 필요하다는 것을 나타냅니다.
그러므로 알파,베타 사용자로 충분한 코어 프로필을 구축할 수 있으며 이를 통해 최상의 경험을 누릴 수 있습니다.
즉, 초기 사용자 집합을 사용하여 나머지 사용자의 성능을 부트스트랩 하는 것입니다. 초기 사용자 집합이 확보되면 해당 기기에서 API에 대한 프로필 정보를 추출하고 이 정보들을 모아 Core Profile을 생성합니다. 새로운 기기에서 설치를 요청하면 Core Profile을 이용해 최적화를 수행할 수 있게 됩니다.
참고 링크 :
https://source.android.com/docs/core/runtime?hl=ko
https://medium.com/@logishudson0218/안드로이드-컴파일-방식-dalvikvm-art-b5d64350489f
https://www.youtube.com/watch?v=Yi9-BqUxsno
https://source.android.com/docs/core/runtime/jit-compiler?hl=ko
https://developer.android.com/topic/performance/baselineprofiles/overview?hl=ko
'Android > Android 지식' 카테고리의 다른 글
Android의 효과적인 메모리 관리 (1) | 2023.11.13 |
---|---|
viewModelScope는 어떤 쓰레드를 사용할까? (0) | 2022.07.06 |