Release apk를 뽑기 전 맞춰야 할 것 들
- build.gradle에서 설정과 버전을 맞추기 (react native 버전마다 코드가 다를수도 있음 주의)
android {
compileSdkVersion rootProject.ext.compileSdkVersion
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
defaultConfig {
applicationId "com.test.com.test"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 55 // 버전 코드 - 릴리즈 버전 apk의 버전으로 들어감
versionName "1.4.2" // 버전 이름 - 릴리즈 버전 apk의 이름으로 들어감
missingDimensionStrategy 'react-native-camera', 'general'
multiDexEnabled true
}
splits {
abi {
reset()
enable enableSeparateBuildPerCPUArchitecture
universalApk false // If true, also generate a universal APK
include "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
}
}
signingConfigs {
debug {
storeFile file('debug.keystore')
storePassword 'test'
keyAlias 'androiddebugkey'
keyPassword 'android'
}
releaseWithSignedKey {
storeFile file("test.jks") // 배포할 키의 이름
storePassword "test" // 배포할 키의 비밀번호
keyAlias "test" // 배포할 키의 alias 정확한 용도 불명
keyPassword "test" // 배포할 키의 비밀번호
}
}
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.debug
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
}
}
// applicationVariants are e.g. debug, release
applicationVariants.all { variant ->
variant.outputs.each { output ->
// For each separate APK per architecture, set a unique version code as described here:
// https://developer.android.com/studio/build/configure-apk-splits.html
def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
def abi = output.getFilter(OutputFile.ABI)
if (abi != null) { // null for the universal-debug, universal-release variants
output.versionCodeOverride =
versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
}
}
}
}
배포용 apk 추출 과정
react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle
react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/
${ProjectName}/android/app/src/main/res 경로에서 아래 폴더 제거
1. drawable-mdpi
2. drawable-xhdpi
3. drawable-xxhdpi
4. drawable-xxxhdi
5. raw
6. drawable-hdpi 하위에서 buyaladdin_logo.png 제외하고 모두 제거
-> 이미지 중복이 있을 시 에러 발생 (정확한 이유는 모름)
cd android && ./gradlew app:assembleRelease
${projectName}/android/app/build/outputs/apk/release 폴더 하위에서 app-release.apk 확인
난독화 업체 없이 apk를 암호화 할 시
- 추출한 apk를 apktool로 디컴파일 적용
- apktool d ${해당 apk 경로}
- 추출후 폴더 생성
- 해당 폴더의 /assets/index.android.bundle ← 해당 프로젝트의 RN 의 모든 코드
- index.android.bundle을 암호화 시킨후
- apktool b ${해당 디컴파일을 한 프로젝트 폴더}
- 재서명 과정 진행
난독화 업체를 통한 뒤 apk를 암호화 할 시
- 릴리즈 버전 apk → 암호화 업체를 통해 난독화 진행
- 진행 후 다시 추출된 릴리즈 버전 apk 재서명 과정 진행
재서명 과정
- jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~/Desktop/keystore/release_key.jks ~/Desktop/keystore/LIAPP_with_app-release.apk release_key
- jarsigner로 진행
- jarsigner 옵션들 keystore위치 재서명할apk위치 keystore별명
- /Users/johyeonjae/Library/Android/sdk/build-tools/30.0.2/zipalign -f -v 4 ~/Desktop/keystore/LIAPP_with_app-release.apk ~/Desktop/keystore/aaa/buyaladdin.apk
- zipalign // jarsigner 진행후 다음 과정
- zipalign 옵션 재서명할apk위치 재서명된apk의 이름과 뽑을 위치
- zipalign를 사용할 수 없어서 전역경로를 잡음
구글 플레이 스토어 등록
- 등록시 전버전과 해당버전 체크 필수
- 배포 국가 선택 (웬만하면 건들지 말것 // 나중에 제거했던 국가를 추가시 해당 국가 검색까지 최소 2~3일 정도가 걸림)
- 검색의 0% ~ 100% 노출도를 정할 수 있다고 함
- 리젝의 경우가 적음 (위치정보 왜 사용하는지 당한 경험이 있음)
'Javascript > ReactNative' 카테고리의 다른 글
React-Native IOS 배포 과정 정리 (0) | 2021.03.28 |
---|