반응형
해당 글에서는 react-native 환경에서 APK 파일을 구성하는 방법에 대해 공유합니다.
1) APK, Keystore
💡 APK
- 안드로이드 운영 체제에서 사용되는 앱 패키지 파일을 의미합니다. 이 파일은 모바일 앱을 설치하는 데 사용되며 앱이 실행되는 데 필요한 모든 파일과 리소스를 포함합니다.
💡 Keystore
- Android 앱을 배포하기 위한 서명 파일을 의미합니다. Key Store를 사용하면 앱을 서명하여 앱이 정당한 출처임을 증명할 수 있습니다.
- 앱을 업데이트하거나 새로운 앱을 배포할 때마다 같은 Key Store를 사용해야 합니다. 따라서 Key Store는 안전한 장소에 보관하고 관리해야 합니다.
2) 구성 과정
1. keystore 생성합니다.
💡 keytool은 Java Development Kit(JDK)에 포함된 keystore를 생성하고 관리하는 도구입니다.
💡 이를 사용하여 keyStore를 생성합니다.
옵션 | 설명 |
-genkey | 새로운 공개키와 개인키를 생성하고 새로운 키 스토어에 저장합니다. |
-v | key tool이 수행하는 동작에 대한 자세한 정보를 표시하는 verbose 모드입니다. |
-keystore | 생성할 키 스토어의 이름을 지정합니다. |
-alias | 키 쌍에 대한 별칭 이름을 지정합니다. |
-keyalg | 키 쌍을 생성할 때 사용할 알고리즘을 지정합니다. |
-keysize | 생성할 키의 크기를 지정합니다. |
-validity | 키의 유효 기간을 일(day) 단위로 지정합니다. |
[ 더 알아보기]
💡 keystore 파일은 왜 만들어야 할까?
- React Native 앱을 서명하기 위해 필요합니다. 앱이 서명되면, Google Play Store와 같은 앱 스토어에서 앱을 업로드할 수 있고, 사용자는 APK를 다운로드하여 설치할 수 있습니다.
- 서명되지 않은 APK를 설치하려고 하면, 사용자의 안전성에 대한 경고가 표시됩니다. 또한 서명하지 않은 APK는 Google Play Protect와 같은 안드로이드 보안 기능에서 차단됩니다.
1.1. Keystore의 기본구조
💡 터미널에서 수행하며 일반적인 기본구조는 아래와 같이 구성되어 있습니다.
keytool -genkey -v -keystore [키스토어 이름.keystore] -alias [키 약어] -keyalg RSA -keysize 2048 -validity [유효한 일자]
# 기본 구조
$ keytool -genkey -v -keystore [키스토어 이름.keystore] -alias [키 약어] -keyalg RSA -keysize 2048 -validity [유효한 일자]
1.2. Keystore의 예시
# 사용예시
$ keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
💡 사용 예시 - 아래의 명령어
keytool -genkey -v -keystore [키스토어 이름.keystore] -alias [키 약어] -keyalg RSA -keysize 2048 -validity [유효한 일자]
1. keytool -genkey -v -keystore [키스토어 이름.keystore] -alias [키 약어]
- 해당 명령어는 [my-release-key.keystore]라는 이름으로 key store에 저장하며 key 이름은 [my-key-alias]으로 지정합니다.
2. keyalg RSA -keysize 2048
- 키 쌍을 생성할 때 사용하는 RSA 알고리즘을 2048 사이즈로 지정합니다.
3. -validity [유효한 일자]
- 키의 유효기간을 일 단위로 10000일로 유효하도록 지정합니다
💡 명령어를 입력한 위치에 keystore 파일이 생성되었습니다.
2. 프로젝트 내에 생성한 keystore 저장합니다.
💡 andriod/app 안 패키지 내에 keystore를 저장해줍니다.
3. gradle.properties 파일 내에 keystore 정보를 저장합니다.
💡 gradle.properties 파일 내에 해당 정보를 입력합니다.
💡 gradle.properties 파일에 이 구문을 추가한 후, 해당 파일에 keystore 정보를 입력하면 앱을 빌드할 때 해당 keystore 파일을 사용하여 APK를 서명할 수 있습니다.
속성 | 설명 |
MYAPP_UPLOAD_STORE_FILE | keystore 파일의 이름과 경로 |
MYAPP_UPLOAD_KEY_ALIAS | keystore에 있는 alias의 이름 |
MYAPP_UPLOAD_STORE_PASSWORD | keystore 파일의 비밀번호 |
MYAPP_UPLOAD_KEY_PASSWORD | alias의 비밀번호 |
MYAPP_RELEASE_STORE_FILE=my-release-key.keystore
MYAPP_RELEASE_KEY_ALIAS=my-key-alias
MYAPP_RELEASE_KEY_PASSWORD=hahahoho1234!!
MYAPP_RELEASE_STORE_PASSWORD=hahahoho1234!!
4. app/build.gradle 파일에 release에 맞는 값을 추가합니다
android {
ndkVersion rootProject.ext.ndkVersion
compileSdkVersion rootProject.ext.compileSdkVersion
namespace "com.xxxx"
defaultConfig {
applicationId "com.xxxx"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0"
}
signingConfigs {
debug {
storeFile file('debug.keystore')
storePassword 'android'
keyAlias 'androiddebugkey'
keyPassword 'android'
}
release {
if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {
storeFile file(MYAPP_RELEASE_STORE_FILE)
storePassword MYAPP_RELEASE_STORE_PASSWORD
keyAlias MYAPP_RELEASE_KEY_ALIAS
keyPassword MYAPP_RELEASE_KEY_PASSWORD
}
}
}
buildTypes {
debug {
signingConfig signingConfigs.debug
}
release {
// Caution! In production, you need to generate your own keystore file.
// see https://reactnative.dev/docs/signed-apk-android.
signingConfig signingConfigs.release
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
}
}
}
5. APK를 생성합니다.
💡 구성한 keystore를 기반으로 APK 파일을 생성합니다. 단, 위에 과정처럼 gradle.properties 파일 내에 명시를 하면 명령어로 keystore나 password를 입력하지 않아도 됩니다.
5.1. gradle.properties 파일 내에 속성을 입력한 경우
💡 gradle.properties 파일 내에 명시를 하면 명령어로 keystore나 password를 입력하지 않고 바로 릴리즈를 빌드하는 명령어를 입력합니다.
$ cd android && ./gradlew assembleRelease
# or
$ yarn android --mode release
$ npm run android -- --mode="release"
5.2 gradle.properties 파일내에 속성을 입력하지 않은 경우
💡 gradle.properties 파일 내에 작성하지 않고 명령어로 직접 처리를 하고 싶으시면 아래의 명령어를 사용하시면 됩니다.
# 기본구조
$ cd android && ./gradlew assembleRelease -PstoreFile=<path-to-key-store> -Palias=<alias> -PstorePassword=<password> -PkeyPassword=<password>
[사용예시]
- 위에 입력한 속성 값 대신 명령어로 처리하는 방법은 아래와 같습니다.
# 사용예시
./gradlew assembleRelease -PstoreFile=my-release-key.keystore -Palias=my-key-alias -PstorePassword=hahahoho1234!! -PkeyPassword=hahahoho1234!!
속성 | 설명 |
assembleRelease | -안드로이드 프로젝트를 릴리즈 모드로 빌드하는 Gradle 명령어 입니다. - 이를 통해 서명된 APK 파일을 생성합니다. |
storePassword | keystore의 비밀번호를 입력하는 속성입니다. |
keyPassword | key pair의 비밀번호를 입력하는 속성입니다. |
alias | key pair의 별칭을 입력하는 속성입니다. |
storeFile | keystore 파일의 경로를 입력하는 속성입니다. |
# 사용예시
$ cd andriod/ && ./gradlew assembleRelease -PstoreFile=my-release-key.keystore -Palias=my-key-alias -PstorePassword=hahahoho1234!! -PkeyPassword=hahahoho1234!!
💡[참고] Task :app:validateSigningDevRelease FAILED
- 해당 에러는 기존의 만든 keystore와 지정한 값이 맞지 않으면 위와 같은 문제가 발생합니다. 해당 keystore의 정보에 대해 잘 가지고 있어야 합니다
6. app/build/outputs/apk 폴더에서 생성된 APK 파일을 찾을 수 있습니다.
💡 빌드가 수행되고 app/build/outputs/apk 폴더 내에 APK 파일이 추출이 됩니다
💡 APK 생성이 생성이 잘됨을 확인하였습니다.
💡 생성된 APK를 확인하였습니다.
[ 더 알아보기 ]
💡 app/build/outputs/apk 폴더에 debug와 release 폴더가 있는 이유는 뭘까?
- debug 폴더:
debug 버전의 APK 파일이 생성됩니다. 이 버전은 개발 및 디버깅을 위해 사용됩니다. 이 APK 파일은 개발 중에 사용자에게 배포되는 것이 아니며, 디버그 도구 및 로그 기록 등의 추가 기능이 포함될 수 있습니다.
- release 폴더: release 버전의 APK 파일이 생성됩니다. 이 버전은 실제 사용자에게 배포되는 버전으로, 최적화 및 보안을 위해
축소되고 서명됩니다. release APK 파일은 앱 스토어 또는 배포 플랫폼에 제출됩니다.
- 이렇게 구분되는 이유는 개발자가 개발 및 디버깅 중에는 debug 버전을 사용하고, 앱을 배포할 때는 release 버전을 사용하여 최종 사용자에게 제공하기 위해서입니다.
3) 구성한 APK 파일을 디바이스에서 실행하기
1. Android File Transfer를 다운받습니다
💡 해당 응용프로그램을 다운받아서 PC에서 구성한 APK 파일을 Andriod 디바이스로 이동합니다.
2. 다운로드 받은 응용 프로그램을 실행합니다
3. 실행을 하면 아래와 같이 출력이 됩니다
4. 모바일에서 이를 확인하여 "허용"을 눌러줍니다.
💡 [참고] 해당 메시지가 안나오는 경우
- 디바이스의 연결선을 뽑았다가 다시 끼고 'Andriod 파일 전송'을 다시 실행하면 다시 메시지가 출력됩니다.
5. 허용을 하면 아래와 같이 출력이 됩니다
6. 구성한 apk 파일을 Download 폴더에 복사합니다.
7. 다운로드 받은 파일을 클릭하여 설치합니다
💡 해당 파일은 디바이스에서 '내 파일' - '다운로드' 경로에 위치해 있습니다.
8. 디바이스 내에 설치를 수행합니다.
9. '무시하고 설치' 버튼을 눌러서 설치를 완료합니다
99) 참고 keystore 관련 오류 노트
1. Execution failed for task ':app:validateSigningDebug'. Keystore file '/Users/lee/Desktop/workspace/xxxx/android/app/debug.keystore' not found for signing config 'debug'.
💡 FAILURE: Build failed with an exception. What went wrong: Execution failed for task ':app:validateSigningDebug'. Keystore file '/Users/lee/Desktop/workspace/xxxx/android/app/debug.keystore' not found for signing config 'debug'.
2. Task :app:validateSigningDevRelease FAILED
💡 apk를 생성할때 수행되는 에러이며, keystore에 지정한 값과 동일하게 값을 구성해야합니다. 서로 다를때 이와 같이 발생합니다.
오늘도 감사합니다. 😀
반응형
'React & React Native > 환경 설정 및 구성' 카테고리의 다른 글
[RN] 갤럭시 개발자 모드 설정 방법 (0) | 2023.09.26 |
---|---|
[RN] React Native Firebase Analytics + Crashlytics 이해 및 설정 방법 : Android (0) | 2023.09.20 |
[RN] React Native Android 빌드 속도 올리는 방법 : gradle.properties (0) | 2023.06.27 |
[React] CRA 사용 없이 React/Typescript 개발 환경 구축(with. Webpack/babel) (0) | 2022.11.18 |
[RN] React-native-cli Mac OS 환경설정 : 초기 프로젝트 구성 (0) | 2022.03.20 |