프로그래밍으로 APK 서명하기

2022. 4. 26. 18:02모바일프로그래밍

728x90
https://medium.com/@thedancercodes/signing-your-apks-the-pragmatic-way-396e316981ca
 

Signing your APK’s, the Pragmatic way

It is one thing to build an app and a totally different challenge to deploy & distribute your application to your users.

medium.com

첫 번째로, 앱을 빌드하는 것과 애플리케이션을 사용자에게 배치 및 배포하는 것은 완전히 다른 문제입니다.
Google Play 스토어에 배포하기 전에 모든 Android 패키지 파일(APK) 파일은 디지털 서명을 필요로 합니다.

이 게시물에서 우리는 APK에 서명하는 과정을 다룰 것이며 또 서명 프로세스의 내부 작업을 탐색하고 이해 해 볼 것입니다.

 

디버그 버전 용:

기본적으로 Android는 알려진 키를 사용하여 디버그 APK에 서명합니다. 이를 확인해보려면, 자바 keytool 명령을 사용할 수 있습니다.

키 저장소는 당신의 홈 디렉토리(윈도우는 %USERPROFILE%).android라는 하위 디렉토리에 있습니다. 키 저장소의 기본 이름은 android의 키 저장소 암호를 가지는 debug.keystore입니다.

JKS(Java Keystore)는 보안 인증서의 저장소입니다.


우리는 Java의 이 keytool 명령을 사용하여 인증서를 생성하고 Gradle 빌드 파일의 signingConfigs 블록을 이용해서 환경을 구성합니다. (이 게시물의 뒷부분에서 signingConfigs 에 대해 자세히 알아보겠습니다.)


다음은 기본 디버그 인증서를 나열 해주는 keytool 명령을 보여 주고 있습니다:

키 저장소 유형은 공개 및 개인 키에 사용되는 (Java KeyStore를 나타내는) JKS입니다.
Java는 또 다른 유형으로 JCEKS(Java Cryptography Extensions KeyStore)를  지원합니다. 이 유형은 공유 키에 사용할 수 있지만 Android 애플리케이션에는 사용되지 않습니다.

 

키 저장소에는 연결된 장치 또는 에뮬레이터에 배포될 때 디버그 APK에 서명하는 데 사용되는 androiddebugkey라는 별칭(alias)이 있는 자체 서명된 인증서를 가지고 있습니다.

 

참고: 항상 그런 것은 아니지만 형식의 차이에 대한 CLI 출력의 끝에 경고가 표시되는 경우(위 이미지 참조) 일반적으로 권장하는 keytool 명령을 실행하면 출력이 아래와 같이 표시됩니다.

💡 팁 💡: 디버그 키 저장소를 재설정하려면 그냥 debug.keystore 파일을 삭제하면 됩니다. 다음에 앱을 배포할 때 다시 생성 할 것입니다.

 

출시 버전:

서명할 때까지 앱의 릴리스 버전을 배포할 수 없습니다. 즉, 릴리스 키를 생성해야 합니다. 이것은 또한 keytool 유틸리티를 사용합니다.


시스템 홈 디렉터리에 keystores라는 디렉터리를 만들고 해당 디렉터리로 이동한 다음 아래 표시된 keytool 명령을 실행합니다.

 

참고: RSA 알고리즘은 SHA256 알고리즘으로 서명된 2K 크기의 공개/개인 키 쌍을 생성하는 데 사용되며 10,000일(27년 조금 넘음) 동안 유효합니다.

 

APK 서명:

In thebuild.gradle file, as a child of the android closure, add a signingConfigs block, as shown below:

build.gradle 파일에서 android 클로저의 자식으로 아래와 같이 signingConfigs 블록을 추가합니다.

💡 팁 💡: 빌드 파일에 하드코딩된 상수로 비밀번호를 넣는 것은 좋은 방법이 아닙니다.
더 나은 접근 방식은 VCS(버전 제어 시스템)의 일부가 아닌 별도의 파일에 저장하는 것입니다.

빌드 파일 서명 정보 제거 하기:

모듈의 build.gradle 파일에 일반 텍스트로 서명 정보를 추가하는 대신 다른 사람이 쉽게 액세스할 수 없도록 이 민감한 정보를 빌드 파일 밖으로 옮겨야 합니다.

보안 정보를 저장하고 빌드 파일에서 해당 파일을 참조하기 위해 별도의 속성 파일(keystores.properties)을 만들어 볼 것입니다.

keyAlias = your_project_key_alias
keyPassword = your_key_alias_password
storeFile = /path/to/your/.keystore # Example: /Users/thedancercodes/keystores/fastlane-droid.keystore
storePassword = your_keystore_password


이 파일은 프로젝트의 루트 디렉토리에 생성되어야 합니다. 👇


모듈의 build.gradle 파일에서 android {}블록 앞에 keystore.properties 파일을 로드하는 코드를 추가합니다.

keystoreProperties['propertyName'] 구문을 사용하여 keystoreProperties에 저장된 속성을 참조할 수 있습니다.

다음 구문을 사용하여 keystoreProperties에 저장된 서명 정보를 참조하도록 모듈 build.gradle 파일의 signingConfigs 블록을 수정 합니다:

 

SigningConfig에 대한 설명:


DSL 문서에서는 서명 구성 블록이 다음과 같이 일반적으로 사용되는 SigningConfig 클래스의 인스턴스에 다음 네 가지 속성을 위임한다고 설명합니다.

keyAlias: 특정 키에 서명할 때 keytool에서 사용되는 값입니다.
keyPassword: 서명 과정에서 사용되는 특정 키의 비밀번호입니다.
storeFile: keytool에서 생성한 키와 인증서가 포함된 디스크 파일입니다.
storePassword: 키 저장소 자체에 사용되는 비밀번호입니다.

참고: storeType 속성(기본값은 JKS)도 있지만 거의 사용되지 않습니다.

 

릴리스 빌드 유형에 서명 구성 속성 추가

아래에서는 릴리스 빌드에서 signing config 를 사용하는 방법을 보여줍니다.


다음은 전체 build.gradle 설정입니다.

apply plugin: 'com.android.application'

...

// Create a variable called keystorePropertiesFile, and initialize it to your
// keystore.properties file, in the rootProject folder.
def keystorePropertiesFile = rootProject.file("keystore.properties")

// Initialize a new Properties() object called keystoreProperties.
def keystoreProperties = new Properties()

// Load your keystore.properties file into the keystoreProperties object.
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

android {
    ...

    signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                
             // Using a signing config in a release build
             signingConfig signingConfigs.release
        }
    }
}

dependencies {
        // Your dependencies go here.
}

 

릴리스 APK 생성:

이제 빌드가 app/build/outputs/apk/release 폴더에 릴리스 APK를 생성하도록 하는 Gradle에서 assembleRelease 작업을 호출 할 것입니다.
Android Studio에서 터미널로 이동하여 다음 gradle 명령을 실행합니다.

 

맥 OS에서 ./gradlew assembleRelease

윈도우 OS에서 gradlew assembleRelease 👇

성공 하셨죠! 🙌

핵심내용:

💡 팁 💡: keystore.properties 파일을 다른 위치에 저장하도록 선택할 수 있습니다.

(예를 들어, 프로젝트의 루트 폴더가 아닌 모듈 폴더 또는 빌드 서버에서 지속적 통합 도구를 사용하는 경우).

이 경우 실제 keystore.properties 파일의 위치를 사용하여 keystorePropertiesFile을 올바르게 초기화하도록 위의 코드를 수정해야 합니다.

 

참고: 이 과정은 중요합니다. 키 저장소 확인을 잊지 마십시오. 그렇게 하면 모든 버전이 동일한 키로 서명되어야 하므로 업데이트를 앱에 게시할 수 없습니다.


참고: 속성 파일이 VCS에 추가되지 않도록 keystore.properties 파일을 .gitignore 파일에 추가하는 것을 잊지 마십시오.


NOTE: You can achieve the above process using your Android Studio IDE if that is your preference 😃. Follow the link detailing this process in the Android documentation below.
참고:  Android Studio IDE를 사용해도 위의 과정을 수행할 수 있습니다 😃. 아래 Android 설명서에서 이 프로세스를 자세히 설명하는 링크를 따르세요.


S/O to Isaac Owomugisha & Nabende Simiyu for helping me edit this article. ✊
If this post was helpful, please click the clap 👏 button below a few times to show your support.

 

 

Signing your APK’s, the Pragmatic way

It is one thing to build an app and a totally different challenge to deploy & distribute your application to your users.

medium.com

 

그외 읽을 거리:

 

 

앱 서명  |  Android 개발자  |  Android Developers

앱 서명 및 보안과 관련된 중요한 개념을 알아보고, Android 스튜디오를 사용하여 Google Play에 출시하기 위해 앱에 서명하는 방법과 Play 앱 서명을 선택하는 방법을 알아보세요.

developer.android.com

 

 

SigningConfig - Android Plugin 1.3.1 DSL Reference

Except as noted, this content is licensed under Apache 2.0. For details and restrictions, see the Content License.

google.github.io

 

이상.

728x90