요즘 나오는 앱들은 AAB(Android App Bundle) 형태로 배포된다.
구글 정책 때문이긴 한데 AAB 형태로 배포할 경우 앱 크기를 줄일 수 있는 장점이 있다.기존 APK 형태로 배포된 앱은
base.apk
안에 라이브러리 파일이나 설정 파일들이 전부 짬뽕으로 들어가 있지만 AAB 형태로 배포된 앱은base.apk
과 더불어splits
,lib
폴더 안에 나뉘어져있다.이러한 앱은
adb install-multiple base.apk split_config.arm64_v8a.apk
와 같은 명령어로 설치가 가능한데, 보통MOD
는 하나의 설치 파일로 존재한다. (핵쟁이들의 앱 변조 및 배포의 편의성 때문이 아닐까..??)실제 핵툴 사이트에서 분할된 APK를 다시 하나의 APK로 합치는 방법을 알려주고 있는데 이번 포스팅에서 따라해볼 예정이다.
우선 분할된 APK 파일은 두 가지 형태로 존재한다.
그럼 합치기 쉬운 것부터 레스기릿 해보자.
1. 먼저 base.apk
파일을 디컴파일한다.
> java -jar apktool.jar d base.apk -o base
2. lib
폴더가 있는 split_config.arm64_v8a.apk
파일을 가져와서 압축을 풀고 base
폴더에 lib
폴더를 넣어준다.
3. base
폴더에 있는 AndroidManifest.xml
파일에서 android:isSplitRequired="true"
부분을 찾아 해당 옵션을 삭제해준다.
<application ... android:isSplitRequired="true" ...>
4. 다시 리패키징 해준다.
> java -jar apktool.jar b base -o non_split.apk
5. 기호에 맞게 재서명하고 설치하면 된다.
> zipalign -p -f -v 4 non_split.apk non_split_aligned.apk
> apksigner sign --ks KEYSTORE --ks-pass pass:PASSWORD non_split_aligned.apk
> apk install non_split_aligned.apk
1. 분할된 APK 파일을 모두 디컴파일한다.
> java -jar apktool.jar d base.apk
> java -jar apktool.jar d split_config.arm64_v8a.apk
> java -jar apktool.jar d split_config.ko.apk
> java -jar apktool.jar d split_config.xxhdpi.apk
2. split_config
폴더에 있는 lib
또는 res
폴더를 base
폴더에 넣어준다. 이때 기존에 존재하는 파일이 있을 경우 덮어쓰기하지 않는다.
3. base
폴더에 있는 AndroidManifest.xml
파일에서 android:isSplitRequired="true"
부분을 찾아 해당 옵션을 삭제해준다.
<application ... android:isSplitRequired="true" ...>
4. base
폴더에 있는 apktool.yml
파일에서 doNotCompress
태그를 찾아 아까 넣은 폴더 이름을 모두 추가해준다. 일부 게임에서는 해당 과정을 생략해도 된다고 한다.
doNotCompress:
...
- res/values
- res/values-ko
- drawable-anydpi
- drawable-hdpi
- drawable-ldrtl-xxhdpi
- drawable-sw600dp-xhdpi
- drawable-xhdpi
- drawable-xxhdpi
- values-hdpi
5. 리패키징 해준다.
> java -jar apktool.jar b base -o non_split.apk
5-1. 이때 apktool
에러가 발생한다면 먼저 AndroidManifest.xml
파일에서 android:localeConfig="@xml/locales_config"
부분을 찾아 해당 옵션을 삭제해준다.
<application ... android:localeConfig="@xml/locales_config" ...>
5-2. 다음 res/xml/locales_config.xml
파일을 삭제한다.
5-3. 마지막으로 res/values/public.xml
파일에서 <public type="xml" name="locales_config" id="0xXXXXXXXX" />
부분을 찾아 해당 부분을 삭제해준다.
<resouces>
...
<public type="xml" name="locales_config" id="0x7f170010" />
...
</resouces>
6. 리패키징이 정상적으로 되었다면 재서명 후 설치하면 된다.
> apksigner sign --ks KEYSTORE --ks-pass pass:PASSWORD non_split_aligned.apk
> apk install non_split_aligned.apk
물론 설치는 되겠지만 실행되지 않을 가능성이 굉장히 높다. 보통 앱에서 위변조 검증을 하는데 리패키징 하면서 무결성이 깨지기 때문이다.
위 방법으로 리패키징 빌드 하나 만들어서 안티 디버깅과 무결성 검증 로직을 분석하고 우회하고 있는데 상당히 빡빡하다...
그래도 좋은 날 오겠지? 열심히 하자..
https://platinmods.com/threads/how-to-turn-a-split-apk-into-a-normal-non-split-apk.76683/
https://lightrun.com/answers/ibotpeaches-apktool-bug-androidlocaleconfig-in-manifest