Study/Mobile

Smali vs Dalvik: 차이점

imaginefuture-1 2025. 2. 20. 08:36

📌 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을 사람이 수정할 수 있게 변환한 중간 언어야! 🛠🔥