HOME > kotlin > tips

Kotlin을 Java로 변환(decompile)하는 방법

JSFollow24 Mar 2019

코틀린은 바이트 코드인 .class파일로 빌드되고 JVM 위에서 실행됩니다. 그래서 코틀린 코드를 자바로 변환하는 방법은 .class파일을 Java로 decompile하면 됩니다. 이 글에서는 jadx와 IntelliJ를 이용하여 디컴파일하는 모두 알아보겠습니다.

  • jadx 라는 툴로 decompile
  • IntelliJ IDE로 decompile

IntelliJ IDE로 코틀린을 자바로 변환

아래 코드는 작업 디렉토리를 출력하는 코틀린 코드입니다. IntelliJ에서 프로젝트를 만들어 아래 코드가 동작하도록 만듭니다.

fun main(args: Array<String>) {
    val path = System.getProperty("user.dir")
    println("Working Directory = $path")
}

실행해보면 아래와 같이 출력이 됩니다.

Working Directory = /home/user/testcode/kotlin

이제 위의 코드를 자바로 변환해보겠습니다. IntelliJ에서 아래 메뉴를 따라 들어갑니다. [Tools] -> [Kotlin] -> [Show Kotlin bytecode]

show byte code in intellij

이 메뉴는 코틀린 코드를 바이트코드로 볼 수 있는 메뉴입니다. 스크린샷처럼 오른쪽에 탭이 생깁니다. 이 탭에서 Decompile버튼을 누르면 자바로 변환이 됩니다.

버튼을 누르면 변환된 자바 파일이 생성됩니다. 코드는 다음처럼 보일 것입니다.

import kotlin.Metadata;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;

@Metadata(
   mv = {1, 1, 13},
   bv = {1, 0, 3},
   k = 2,
   d1 = {"\u0000\u0014\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0010\u0011\n\u0002\u0010\u000e\n\u0002\b\u0002\u001a\u0019\u0010\u0000\u001a\u00020\u00012\f\u0010\u0002\u001a\b\u0012\u0004\u0012\u00020\u00040\u0003¢\u0006\u0002\u0010\u0005¨\u0006\u0006"},
   d2 = {"main", "", "args", "", "", "([Ljava/lang/String;)V", "kotlin"}
)
public final class Kotlin15Kt {
   public static final void main(@NotNull String[] args) {
      Intrinsics.checkParameterIsNotNull(args, "args");
      String path = System.getProperty("user.dir");
      String var2 = "Working Directory = " + path;
      System.out.println(var2);
   }
}

위의 자바 코드는 바이트 코드를 변환한 것이기 때문에 가독성이 좋지 않습니다. 하지만 코틀린이 어떻게 자바로 표현되는지 이해하는데 좋습니다.

Jadx 툴을 이용하여 코틀린을 자바로 변환

IntelliJ IDE를 설치하셨다면, 위의 방법으로 변환하시는 것이 좋습니다. 하지만 만약 IntelliJ를 설치하지 않았다면 다른 툴을 사용해서 변환할 수 있습니다. Jadx라는 툴은 바이트 코드를 자바 코드로 변환하는 기능을 제공합니다.

Jadx는 바이트 코드 외에 안드로이드의 Apk, 또는 Dex 파일도 변환해줍니다. 자세한 것은 'Android 앱(apk)을 decompile하는 방법'을 참고해주세요

Jadx 설치

Jadx는 Jadx-release에서 빌드된 파일을 다운받을 수 있습니다. Jadx는 command line과 GUI 툴을 모두 제공합니다.

툴을 다운받고 압축을 풉니다. bin 폴더를 보면 실행 파일이 있습니다. jadx는 command line 툴이고, jadx-gui는 GUI 툴입니다. 저는 command line을 사용하겠습니다. (Windows 사용자의 경우 jadx-gui.bat을 사용해야 합니다)

jadx-0.8.0$ ls
bin  lib  LICENSE  NOTICE  README.md
jadx-0.8.0$ ls bin
jadx  jadx.bat  jadx-gui  jadx-gui.bat

위와 마찬가지로 ~/.bashrc에 alias로 jadx를 등록하였습니다.

#jadx
alias jadx='/home/user/test/jadx-0.8.0/bin/jadx'

jadx를 실행해보면 설치가 잘 된 것을 확인할 수 있습니다.

$ jadx -h
jadx - dex to java decompiler, version: 0.8.0
usage: jadx [options] <input file> (.apk, .dex, .jar or .class)
...

Jadx로 디컴파일

Jadx는 바이트 코드를 자바로 변환해주는 툴입니다. 코틀린 코드는 설치하신 툴로 컴파일해주세요. 컴파일의 산출물을 보면 .class파일들이 생성되어있습니다. 이 파일들이 바이트 코드입니다.

Jadx를 이용하여 아래처럼 명령어를 입력하면 class파일이 Java로 변환됩니다.

$ jadx -d output Kotlin15Kt.class

output은 파일이 저장될 폴더 위치이고, Kotlin15Kt.class는 변환할 바이트코드 파일입니다.

변환된 파일을 보면 아래처럼 변환이 되었습니다.

package foo.main.kotlin;

import kotlin.Metadata;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;

@Metadata(bv = {1, 0, 3}, d1 = {"\u0000\u0014\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0010\u0011\n\u0002\u0010\u000e\n\u0002\b\u0002\u001a\u0019\u0010\u0000\u001a\u00020\u00012\f\u0010\u0002\u001a\b\u0012\u0004\u0012\u00020\u00040\u0003¢\u0006\u0002\u0010\u0005¨\u0006\u0006"}, d2 = {"main", "", "args", "", "", "([Ljava/lang/String;)V", "kotlin"}, k = 2, mv = {1, 1, 13})
/* compiled from: kotlin15.kt */
public final class Kotlin15Kt {
    public static final void main(@NotNull String[] args) {
        Intrinsics.checkParameterIsNotNull(args, "args");
        System.out.println("Working Directory = " + System.getProperty("user.dir"));
    }
}

정리

코틀린을 자바코드로 변환하는 방법에 대해서 알아보았습니다. IntelliJ IDE를 사용하시면 빠르게 확인해볼 수 있습니다. 가독성은 안좋지만, 디컴파일은 코틀린이 자바에서 어떻게 표현되는지 확인하는데 큰 도움이 됩니다.