구글 플레이 스토어에 출시된 앱을 디컴파일 해서 다른사람에게 공유하는 건 불법입니다.
하지만 다른 회사 앱에서는 어떤 라이브러리, 기술을 쓰고 있는지 궁금할 때 공부할 필요는 있기 때문에 디컴파일 할 일도 자주 있습니다.
Mac 용 디컴파일 스크립트:
사용법:
> ./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 결과물 압축을 해제한 파일
'Android' 카테고리의 다른 글
[Kotlin] livedata를 떠나보내고 코틀린 stateflow 나 sharedflow를 써야 할까요? (0) | 2021.01.23 |
---|---|
안드로이드 스튜디오, 최근 열었던 파일 목록을 내용 5줄과 함께 보기 (0) | 2020.05.05 |
[펌] Blocking vs Non-blocking / Synchronous vs Asynchronous (0) | 2020.01.30 |
Kotlin coroutine - Job or Deferred? (0) | 2019.12.25 |
sdkman: Android studio, 커맨드라인으로 gradle 빌드하기 (0) | 2019.11.05 |