안드로이드의 Platform key로 App을 Signing하면 플랫폼에서만 허용가능한 퍼미션을 얻을 수 있습니다.
예를 들어, 아래와 같이 안드로이드 시스템에서 선언한 퍼미션들을 얻으려면 동일한 key로 앱이 서명되어야 합니다.
<!-- Allows applications to call into AccountAuthenticators.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.ACCOUNT_MANAGER"
android:protectionLevel="signature" />
또는, 다음과 같이 자신의 앱을 안드로이드 시스템과 동일한 sharedUserId로 설정할 수 있습니다.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="my.app"
android:sharedUserId="android.uid.system"
다만 여기서 소개하는 platform key로 서명하는 방식은 에뮬레이터에서만 사용이 가능한 방법입니다. 시장에서 판매되는 안드로이드 디바이스에는 적용이 안됩니다.
서명을 하려면 AOSP의 /build/target/product/security
경로에서 다음 두개의 파일이 필요합니다.
- platform.x509.pem
- platform.pk8
이 두개의 파일로 서명하는 방법은 다음과 같이 두가지가 있습니다.
- apk를 직접 서명하는 방법
- jks 파일을 만들어 안드로이드 스튜디오에서 서명하는 방법
Apk를 직접 서명
platform.pk8
와 app-debug.apk
파일을 구했다면, 그 다음 필요한 것은 Apk Sign라는 툴을 다운받는 것입니다.
이 링크에서 중간쯤 보시면 signapk.jar
를 다운받는 링크가 있습니다.
그럼, 다음 명령어로 "app-unsigned.apk"
파일을 플랫폼 키로 signing을 할 수 있습니다. 서명된 apk는 "app-signed.apk"
로 생성됩니다.
$ java -jar signapk.jar platform.x509.pem platform.pk8 app-unsigned.apk app-signed.apk
jks 파일을 만들어 안드로이드 스튜디오에서 서명
platform.pk8
와 app-debug.apk
파일이 준비된 상태에서 다음 명령어를 입력하면 platform.jks
라는 파일이 생성됩니다.
$ openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.pem
$ openssl pkcs12 -export -in platform.x509.pem -inkey platform.pem -out platform.p12 -password pass:android -name platform
$ keytool -importkeystore -deststorepass android -destkeystore platform.jks -srcstoretype PKCS12 -srcstorepass android -srckeystore
Android Studio에서 이 파일을 키로 등록하여 앱을 서명할 수 있습니다.
위의 명령어에서 alias와 password 등을 다음과 같이 정하였습니다. 이 부분은 변경이 가능한 부분입니다.
key store password: android
key alias: platform
key password: android
주의할 점은 이 키는 AOSP를 빌드하여 만든 이미지에만 적용이 됩니다. 안드로이드 스튜디오에서 에뮬레이터에게 제공하는 이미지는 키가 달라서 적용이 안됩니다.
참고
Recommended Posts:
- AIDEGen으로 IDE에서 Android Framework 개발
- Android - adb shell input 명령어 사용 방법
- Android - App VersionCode, VersionName 등 설치 정보 확인
- Android - Call Stack 출력하는 방법
- Android 앱의 SQLite DB 테이블 확인
- Java 코드를 DEX로 변환, 안드로이드 디바이스에서 실행
- Android - adb로 실행 중인 프로세스, 쓰레드 리스트 & 메모리 정보 확인
- Android - PlayStore 앱 설치(다운로드) 화면으로 이동하는 방법
- Android - 파일의 MimeType(확장자) 가져오는 방법
- Mockito cannot mock/spy final class 에러 해결 방법
- Android Studio에서 Google Test로 C++ unit 테스트 작성
- Android - Native(C++)에서 Call stack 출력하는 방법
- Android Emulator에서 adb remount 하는 방법 (Writable)