본문 바로가기

Javascript/ReactNative

React-Native Android 배포 과정 정리

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