앵하니의 더 나은 보안

Android 11 버전 이상에서의 apk 사이닝 본문

보안 기술/Android

Android 11 버전 이상에서의 apk 사이닝

앵한 2022. 7. 18. 22:47
기존에 apk 사이닝 하던 것처럼 해서 밀어 넣으려니 아래와 같은 에러가 발생
adb: failed to install RT_zip.apk: Failure [-124: Failed parse during installPackageLI: Targeting R+ (version 30 and above) requires the resources.arsc of installed APKs to be stored uncompressed and aligned on a 4-byte boundary
 
그래서 찾아봤더니, android 11 이상 부터는 사이닝할때 v2의 포맷을 따라야한다고 한다.
그래서 사이닝할 때 쓰던 기존 signapk.jar는 쓸모가 없어졌음

 

apksign.jar 파일을 써서 사이닝 할 수 있는데, 그럴려면 jks 파일 만들어야 하고, 그럴려면 또 그 전에 zipalign으로 4-byte boundary 작업을 해줘야한다.

 

4-byte boundary 작업은 아래 명령어를 통해 진행할 수 있다.(zipalign은 보통 android sdk가 설치돼있다면, 찾을 수 있다.
C:\Users\[유저명]\AppData\Local\Android\Sdk\build-tools\34.0.0\zipalign.exe)
zipalign -f -p 4 test.apk test_zip.apk

 

그리고 keytool을 사용해 test.keystore 파일 생성(keytool도 jdk가 설치 돼 있는 환경이면 바로 찾을 수 있다.)
이때 test.keystore 생성하면서 작성한 패스워드는 기억해뒀다가 마지막으로 사이닝을 수행할 때 한번 더 입력해야 한다.
"C:\Program Files\Java\jdk-11.0.12\bin\keytool.exe" -genkeypair -v -keystore test.keystore -alias test -keyalg RSA -keysize 4096 -validity 10000

 

생성한 test.keystore 파일 및 apksigner.exe 파일을 사용해 apk파일 사이닝
java -jar C:\Users\[유저명]\AppData\Local\Android\Sdk\build-tools\32.0.0\lib\apksigner.jar sign --ks test.keystore -v2-signing-enabled true --ks-key-alias test --in test_zip.apk --out test_signed.apk

 

위 과정을 따라오면 리패키징한 apk파일을 사이닝한 상태의 apk가 test_signed.apk라는 이름을 가지고 떨어진다.

근데 또 테스트하는 우리 입장에서는 매번 저 과정을 진행하는건 번거롭고, 명령어도 길어서 외우기 힘드니, 그냥 android 11버전 이상에서도 사용할 수 있는 사이닝 batch 툴을 만들었다.

app_signer.zip
1.24MB

위 zip 파일 안에, zipalign이든 apksigner든 keystore든 다 있으니 리패키징 후 사이닝을 하고자 한다면 단순히 apk파일을 같은 경로에 두고 해당 apk 파일을 batch파일에 드래그 앤 드롭하면 사이닝이 수행 된 apk 파일이 떨어진다.

물론 커맨드로도 사이닝을 수행할 수 있다.

signer_aos_v11+.bat test_repackage.apk

 

Comments