안드로이드 앱에 관한 문제를 풀다보면 리패키징이 필요할 때가 있다.
몇 가지 툴들을 사용하여 리패키징을 수행할 수 있다.
1. jadx
리패키징에 직접적으로 필요한 건 아니지만 분석하는데 유용하다.
개인적으로 모바일 계의 IDA 같은 친구가 아닌가 싶다.
jadx-gui를 활용하면 gui상에서 디컴파일 된 코드를 확인하고 분석할 수 있다.
(현재 최신 버전은 1.4.7)
https://github.com/skylot/jadx/releases/tag/v1.4.7
2. apktool
apktool을 이용하면 apk 파일을 디컴파일하거나 빌드할 수 있다.
디컴파일해서 smali 파일 코드를 수정한 뒤 빌드하는 방식으로 apk를 코드 패치할 수 있다.
# apk decompile
$ apktool d </path/to/apk>
# apk build
$ apktool b </path/to/decompiled_apk> -o </path/to/output_apk>
3. jarsigner
apktool을 이용해 apk 파일을 빌드했다면 서명을 해줘야한다.
keytool로 서명을 생성할 수 있고, jarsigner로 apk에 서명을 수행할 수 있다.
keytool -genkey -v -keystore <keystore_name>.keystore -alias <alias_name> -keyalg RSA -keysize 2048
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore <keystore_name>.keystore </path/to/apk> <alias_name>
하지만 jarsigner는 APK Signature Scheme v1에서만 유효하다.
APK Signature Scheme v2에선 다른 방식의 서명이 필요하다.
(jarsigner 서명만 수행하면 apk가 설치되지 않음)
여기서 zipalign과 apksigner 툴이 사용되는데,
안드로이드 스튜디오를 설치하면 관련 디렉토리에 존재한다.
필자의 경우 m1 맥북을 사용 중이며 경로는 다음과 같았다.
/Users/<username>/Library/Android/sdk/build-tools/<version>
4. zipalign
서명하기 전 zipalign을 선행해야 한다.
</path/to/zipalign> -f -v 4 </path/to/before_zipalign_apk> </path/to/after_zipalign_apk>
5. apksigner
zipalign을 했다면 이제 apksigner로 서명을 하면 된다.
apksigner가 있는 디렉토리를 확인해준 뒤 다음의 명령어를 실행한다.
</path/to/apksigner> sign -v --out </path/to/output_apk> --ks </path/to/keystore> --ks-key-alias <alias_name> </path/to/input_apk>
서명이 잘 되었으면 안드로이드 스튜디오에서 설치가 가능할 것이다.
레퍼런스
https://domdom.tistory.com/287
https://liapp.lockincomp.com/ko/blog/blog-Post/tech-apk-signature-scheme-v2-with-apksigner