본문 바로가기

Android

안드로이드 APK 디컴파일하기

구글 플레이 스토어에 출시된 앱을 디컴파일 해서 다른사람에게 공유하는 건 불법입니다.

 

하지만 다른 회사 앱에서는 어떤 라이브러리, 기술을 쓰고 있는지 궁금할 때 공부할 필요는 있기 때문에 디컴파일 할 일도 자주 있습니다.

 

Mac 용 디컴파일 스크립트:

decompile.zip
5.39MB

 

사용법: 

> ./decompile.sh [APK파일 명. 스크립트와 동일한 폴더에 있어야 함][해당 앱의 패키지 명]

 

예:

> ./decompile.sh app-debug.apk com.stanleykou.hello

 

디컴파일 중:

 

설명:

이 스크립트는 먼저 enjarify (https://github.com/google/enjarify) 를 이용하여 apk를 jar로 만듭니다.

 

jar는 zip과 같은 것이기 때문에 압축을 풀어주고, 앱의 패키지명에 해당되는 부분만 따로 복사합니다. (라이브러리까지 디컴파일 하는 것을 방지하기 위해) 그러면 앱의 소스에 해당되는 부분 class 파일만 남습니다.

 

그 다음 fernflower (https://github.com/fesh0r/fernflower) 를 이용하여 그 class를 java 파일로 만듭니다.

 

추가로, 코틀린으로 앱을 만들었을 때는 수많은 람다가 $ 기호와 함께 생성되는데 앱의 구조를 분석할 때는 방해되기도 합니다. 그래서 $가 붙은 파일만 제거하여 별도의 폴더에 옮겨놓습니다.

 

결과물:

app-debug 폴더: apk 이름과 동일한 폴더, 결과물이 생성됨.

- app-debug-enjarify.jar: enjarify 결과물

- app-debug.apk: 디컴파일 대상 apk

- decompiled: 디컴파일 결과물 java 파일

- decompiled_no$: 디컴파일 결과물 java 파일에서 $ 이 이름에 들어간 파일을 삭제한 결과물

- unzipped: enjarify 결과물 압축을 해제한 파일 중 해당 앱의 패키지만을 따로 복사해 놓은 폴더

- unzipped_all: enjarify 결과물 압축을 해제한 파일