📌 Smali vs Dalvik: 차이점 정리
🔹 Dalvik: 안드로이드에서 실행되는 바이트코드 (기계어에 가까움)
🔹 Smali: Dalvik 바이트코드를 사람이 읽고 수정할 수 있도록 변환한 중간 언어
즉, Dalvik 바이트코드는 기계가 실행하는 코드이고, Smali는 사람이 이해하고 수정할 수 있도록 표현한 코드야.
1️⃣ Dalvik 바이트코드란?
Dalvik 바이트코드는 Java 바이트코드를 Dalvik 가상 머신(DVM)이 이해할 수 있도록 변환한 것이야.
🔹 특징
- .dex 파일로 저장됨 (Android 앱의 실행 코드)
- Dalvik 가상 머신(DVM) 또는 ART(Android Runtime)에서 실행됨
- 레지스터 기반(Register-based) 구조 → Java의 스택 기반(Stack-based)과 다름
💡 비유:
Dalvik 바이트코드는 "CPU가 직접 읽는 기계어에 가까운 코드"야.
(예를 들어, 공장에서 "코딩된 로봇이 실행할 설계도" 같은 느낌)
2️⃣ Smali 코드란?
Smali는 Dalvik 바이트코드를 사람이 읽고 수정할 수 있도록 변환한 것이야.
🔹 특징
- Smali는 Dalvik 바이트코드와 1:1 매칭됨
- .smali 확장자로 저장됨
- apktool로 APK를 디컴파일할 때 Smali 코드가 생성됨
- Dalvik보다 사람이 이해하기 쉬운 문법 제공
- Smali 코드를 수정하면 APK의 동작을 변경할 수 있음
💡 비유:
Smali는 "어렵지만 사람이 이해할 수 있는 기술 문서" 같은 느낌.
(예를 들면, 공장 로봇을 직접 조작하는 엔지니어의 메뉴얼 같은 것)
3️⃣ Smali 코드 vs Dalvik 바이트코드 예제
예를 들어, Java에서 아래처럼 작성했다고 해보자.
public int add(int a, int b) {
return a + b;
}
🔹 Dalvik 바이트코드
바이트코드는 기계가 해석하기 어려운 형태로 변환됨.
0000: 12 04 00 00
0004: 22 05 00 01
0008: 0A 06 04 05
000C: 0F 00 06
(이런 식으로 사람이 읽기 어려운 코드 형태)
🔹 Smali 코드
Dalvik 바이트코드를 사람이 이해할 수 있도록 변환한 것.
.method public add(II)I
.registers 3
add-int v0, p1, p2
return v0
.end method
- .registers 3 → 레지스터 3개 사용
- add-int v0, p1, p2 → p1과 p2 값을 더해서 v0에 저장
- return v0 → 결과 반환
➡ Smali는 Dalvik과 1:1 대응하지만, 사람이 읽고 수정할 수 있는 형태! 🚀
4️⃣ Dalvik vs Smali 정리
구분 Dalvik 바이트코드 Smali 코드
목적 | 실행을 위한 코드 | 수정 및 분석을 위한 코드 |
파일 형태 | .dex | .smali |
문법 난이도 | 기계어에 가까움 (어려움) | 사람이 이해 가능 (조금 어려움) |
수정 가능 여부 | 직접 수정 불가 | 직접 수정 가능 |
디컴파일 가능 여부 | JD-GUI에서 디컴파일 불가 | apktool로 Smali 변환 가능 |
✅ 한마디로:
Dalvik 바이트코드는 안드로이드가 실행하는 코드고,
Smali는 Dalvik을 사람이 수정할 수 있게 변환한 중간 언어야! 🛠🔥