일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- HOS
- randtbl
- fastbin
- canary leak
- PLT
- JOP
- windows
- sgerrand
- pwndbg
- house of force
- WinDBG
- ntwritefile
- brop
- kaslr
- 계산기
- libc.so
- return to libraty
- cmake
- SCP
- frida-dump
- libc-database
- elf 헤더
- patchelf
- dangling pointer
- windows kernel
- ioploaddrivers
- top chunk
- Android
- kernel debug
- RAO
- Today
- Total
sh711 님의 블로그
Dalvik & ART 본문
Dalvik과 ART는 안드로이드의 런타임 환경을 의미한다.
원래는 앱 개발 시 Java를 활용하여 개발하였고 JVM 환경이 아닌 Dalvik VM이라는 환경을 사용하였지만 현재는 ART에서 실행된다.
Dalvik
Dalvik VM은 안드로이드 Api 2.1 ~ 5.1 까지 사용된 런타임 환경이다.
JIT(Just In Time) 컴파일러를 사용하였으며 이 방식은 실행되는 시점에서 당장 필요한 부분만 컴파일 하여 앱 자체가 느려지는 단점이 있다.
ART
ART는 안드로이드 Api 4.4 ~ 현재까지 사용되는 런타임 환경이다.
AOT(Ahead of Time) 컴파일러를 사용하며 이 방식은 설치되는 시점에 코드를 컴파일 하고 미리 캐시하여 실행하는 방식으로 JIT에 비해 실행 속도가 빠르다.
dex2oat 도구를 사용하여 앱을 컴파일하며 앱 설치 시 모든 코드를 기계어로 컴파일(AOT 파일) 하여 앱 패키지 안에 저장한다.
현재
안드로이드 누가 Nougat (7.0) 버전 부터는 JIT와 AOT를 같이 사용
최초 설치시 JIT를 사용하여 설치시간과 용량을 적게 소모하고, 나중에 기기가 충전 중이거나 사용되지 않을 때 컴파일을 조금씩 하여 앱을 AOT 방식으로 전환
DEX(Dalvik Excutable)
1. APK 파일 생성 시 작성된 코드가 컴파일 되어 자바 바이트코드(.class)로 변환 => DEX 파일
2. 이러한 자바 파이트코드 파일들을 하나로 합쳐서 .dex 파일로 변환
3. .dex 파일과 리소스 파일을 합쳐서 APK 파일 생성
JNI (JAVA Native Interface)
JNI는 C/C++을 통한 연산 및 작업 과정을 자바에선 jvm 환경, 안드로이드에선 dalvik/art 환경에서 상호작용할 수 있게 해주는 표준 인터페이스이다.
따라서, 특정 작업을 진행할 때 성능 최적화 등의 이유로 C나 C++을 사용할 수 있다. (게임 엔진, 고성능 연산 등)
주요 파일 형식
- DEX => 앱의 자바 코드가 변환된 바이트코드
- ODex => DEX 파일이 최적화되어 Dalvik 또는 ART 환경에서 빠르게 실행될 수 있도록 변환된 파일 => 실행 가능 포맷 아님
- OAT => ART에서 사용되는 최적화된 네이티브 코드 파일, 앱 설치 시 AOT 방식으로 컴파일되어 생성
ART에 올라가 구동되기까지 과정
1. Kotlin 코드 작성
- 개발자는 코틀린으로 Android 애플리케이션을 작성
- 코틀린은 JVM 언어로 설계되었기 때문에, Java와 동일하게 바이트코드(bytecode)로 컴파일
2. 코틀린 코드 컴파일
- kotlin 컴파일러를 통해 바이트 코드 (.class)로 변환
- 컴파일 된 .class 파일은 jvm에서 실행 가능한 코드
3. D8/Dalvik 변환
- 생성된 .class 파일은 Android 빌드 시스템(gradle)에 의해 Dex(dlavilk executable) 파일로 변환
- dex 파일은 Dalvik VM 및 ART가 이해할 수 있는 실행 파일 포맷
D8: Android용 최신 DEX 컴파일러로, .class(바이트 코드) 파일을 .dex 파일로 변환
4. APK 생성
- dex 파일, 리소스 파일 (이미지, xml 등), 네이티브 라이브러리 등이 하나로 묶여 APK 파일 생성됨
5. 서명 및 배포
- apk는 반드시 디지털 서명이 필요
개발 단계 : 디버그 키로 서명
배포 단계 : 릴리스 키로 서명
6. Android Runtime(ART)에서 실행 준비
- 이제 apk를 설치하면 apk 파일에서 .dex파일과 리소스를 추출
- .dex 파일을 /data/dalvik-cache/ 에 저장
- 네이티브 라이브러리 및 리소스 파일을 적절한 경로에 배치
7. AOT(Ahead of time) 컴파일
- ART는 AOT 컴파일을 수행
- .dex 파일을 기계어(machine code)로 미리 변환하여 저장
- 변환된 코드는 OAT 파일 형식으로 저장되며, 위치는 /data/dalvik-cache/
8. ART에서 애플리케이션 실행
- 사용자가 앱 실행
- 앱마다 별도의 Linux 프로세스 생성 ⇒ 각 프로세스는 ART 인스턴스를 통해 실행
- 메모리 공간할당 ⇒ ART는 앱을 위한 독립적인 힙 메모리 영역 설정
9. ART에서 코드 실행
- AOT 컴파일로 생성된 OAT(Odexed ART file) 파일 실행 =⇒ OAT 파일은 ART에서 실행가능한 포멧
'Study > Android' 카테고리의 다른 글
frida 라이브러리 덤프 (0) | 2025.03.12 |
---|