컴파일과 디컴파일

💡 프로그래밍 언어, 특히 Java 언어에서 사용되는 Compile, Decompile에 대한 내용과 코틀린 코드를 자바 코드로 Decompile하는 과정을 실습하였습니다.

 

Compile?

  • 사람이 이해하는 언어를 컴퓨터가 이해하는 언어로 바꾸는 과정을 컴파일이라고 합니다.
  • 0과 1로 모든 명령어를 이해할 수 있는 컴퓨터에게 언어를 이해 시켜줄 수 있도록 번역해주는 과정을 거칩니다.
  • 또한 원시코드를 목적코드를 바꿔주는 과정을 컴파일이라 합니다.
    • 원시코드 : 인간이 알아볼 수 있는 코드 (.java..)
    • 목적코드 : 컴퓨터가 이해하는 코드, 기계어 (.class..)

컴파일 과정이 필요한 이유

  • JVM에서는 byte code(.class)를 실행할 때 compile 과정에서 진행한 일을 다시 진행하는 과정 없이 실행만 하게 됩니다.
  • 소스코드에 대한 문법검사를 진행하지 않고 불필요한 작업을 최소화하였기 때문에 매우 빠른 속도로 작업이 가능합니다.
  • 코드를 사람이 해석하기 어렵게 변환하여, 외부로부터 코드에 대한 자산을 지킬 수 있습니다.

Decompile?

  • 컴파일과 반대로, 컴파일 된 실행 파일을 소스코드로 되돌리는 작업입니다.
  • 목적코드를 원시코드로 변환하는 과정이며, 우리가 읽을 수 있는 언어로 변환해줍니다.
  • Reverse Engineering이라고도 불립니다.

Kotlin Decompile

  • Android Studio에서 Kotlin 플러그인을 설치하면, 실시간으로 Decompile이 가능합니다.
  • 내가 작성한 Kotlin 코드가 어떻게 Java 코드로 표현되는지 확인할 수 있으며, 자바와 마찬가지로 코틀린도 컴파일 언어로 .kt라는 확장자의 파일을 .class 파일을 만듭니다.
  • Android Studio Tools > Kotlin > Show Kotlin Bytecode > Decompile 과정을 통해서 Java 코드 확인이 가능합니다.

  • Decompile 된 Bytecode는 익숙하지 않지만, 어느정도 코드의 유추가 가능하긴 합니다..
  • Kotlin 디컴파일 과정을 통해서 개발자는 코드를 더 깊게 이해하고, 디버깅과 최적화 작업을 수행, 학습 목적으로 사용할 수 있습니다.

Kotlin Decompile을 통해 얻는 이점

  • [바이트 코드 분석] JVM 바이트코드로 변환 된 Java 코드를 확인하고, 어떻게 컴파일러가 코드를 변환하는지 이해할 수 있습니다.
    • 또한 예상치 못한 동작이나 성능 문제의 원인을 파악할 수 있습니다.
  • [런타임 오류 분석] 디컴파일된 코드를 통해 런타임 오류의 원인을 파악하는 데 도움을 줄 수 있습니다.
    • 스택 트레이스를 분석하여 오류를 명확하게 이해가 가능합니다.
  • [호환성 확인] Java와의 상호 운용성이나 리이브러리 호환성을 확인할 수 있습니다.
  • [최적화와 성능 튜닝] 코드 최적화와 불필요한 코드를 제거할 수 있습니다.
    • 불필요한 코드나 비효율적인 코드 패턴을 식별하고 개선할 수 있다는 장점이 있습니다.

Apk Decompile?

  • 안드로이드에서 생성한 APK 파일을 Decompile 할 수도 있습니다.
  • APK란 Android Pakage의 약자로, 안드로이드 운영체제에서 사용되는 애플리케이션 패키지 파일 형식입니다.
    • 안드로이드 앱 배포와 설치의 핵십 요소로, 개발자와 사용자에게 친숙하게 사용하는 형식입니다.
  • APK는 압축파일로 이루어져 있기 때문에 Apktool이라는 도구를 활용해서 압축을 해제하고, jar파일로 변환하는 과정이 가능합니다.

참고

https://spidyweb.tistory.com/473

https://thdev.tech/kotlin/2018/05/22/Android-Studio-Kotlin-Decompile/