#!/bin/bash # 안드로이드 앱 빌드 스크립트 (디버그 및 릴리즈 버전) # 사용법: ./build-apk-for-device.sh # 색상 정의 GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' # No Color # 프로젝트 디렉토리로 이동 cd "$(dirname "$0")" # 빌드 타입 선택 메뉴 echo -e "${YELLOW}Zellyy Finance 앱 빌드 스크립트${NC}" echo -e "${YELLOW}=============================${NC}" echo -e "빌드 타입을 선택하세요:" echo -e "1) 디버그 빌드 (개발 및 테스트용)" echo -e "2) 릴리즈 빌드 - AAB (Google Play 스토어 배포용)" echo -e "3) 릴리즈 빌드 - 서명된 APK" echo -e "4) 종료" echo -n "선택 (1-4): " read -r CHOICE case $CHOICE in 1) BUILD_TYPE="debug" ;; 2) BUILD_TYPE="release-aab" ;; 3) BUILD_TYPE="release-apk" ;; 4) echo -e "${YELLOW}빌드를 취소합니다.${NC}" exit 0 ;; *) echo -e "${RED}잘못된 선택입니다. 빌드를 취소합니다.${NC}" exit 1 ;; esac # 현재 버전 코드 가져오기 CURRENT_VERSION_CODE=$(grep -o 'versionCode [0-9]*' android/app/build.gradle | awk '{print $2}') # 버전 코드가 비어있으면 기본값 1로 설정 if [ -z "$CURRENT_VERSION_CODE" ]; then CURRENT_VERSION_CODE=1 echo -e "${YELLOW}버전 코드가 없어 기본값 1로 설정했습니다.${NC}" fi echo -e "${YELLOW}현재 버전 코드: ${CURRENT_VERSION_CODE}${NC}" # 현재 버전 이름 가져오기 CURRENT_VERSION_NAME=$(grep -o 'versionName "[^"]*"' android/app/build.gradle | sed 's/versionName "//' | sed 's/"//') # 버전 이름이 비어있으면 기본값 1.0.0으로 설정 if [ -z "$CURRENT_VERSION_NAME" ]; then CURRENT_VERSION_NAME="1.0.0" echo -e "${YELLOW}버전 이름이 없어 기본값 1.0.0으로 설정했습니다.${NC}" fi echo -e "${YELLOW}현재 버전 이름: ${CURRENT_VERSION_NAME}${NC}" # 버전 정보 수정 여부 확인 echo -e "${YELLOW}버전 정보를 수정하시겠습니까? (y/n)${NC}" read -r MODIFY_VERSION if [[ "$MODIFY_VERSION" == "y" || "$MODIFY_VERSION" == "Y" ]]; then # 버전 코드 입력 echo -e "${YELLOW}새 버전 코드를 입력하세요 (현재: ${CURRENT_VERSION_CODE}):${NC}" read -r NEW_VERSION_CODE_INPUT if [ -n "$NEW_VERSION_CODE_INPUT" ]; then NEW_VERSION_CODE=$NEW_VERSION_CODE_INPUT else NEW_VERSION_CODE=$CURRENT_VERSION_CODE fi # 버전 이름 입력 echo -e "${YELLOW}새 버전 이름을 입력하세요 (현재: ${CURRENT_VERSION_NAME}):${NC}" read -r NEW_VERSION_NAME_INPUT if [ -n "$NEW_VERSION_NAME_INPUT" ]; then VERSION_NAME=$NEW_VERSION_NAME_INPUT else VERSION_NAME=$CURRENT_VERSION_NAME fi echo -e "${GREEN}버전 정보가 업데이트되었습니다: 버전 코드=${NEW_VERSION_CODE}, 버전 이름=${VERSION_NAME}${NC}" else NEW_VERSION_CODE=$CURRENT_VERSION_CODE VERSION_NAME=$CURRENT_VERSION_NAME fi # 빌드 넘버 자동 설정 BUILD_NUMBER=$NEW_VERSION_CODE echo -e "${GREEN}빌드 넘버가 자동으로 ${BUILD_NUMBER}(으)로 설정되었습니다.${NC}" # 빌드 넘버 수정 여부 확인 echo -e "${YELLOW}빌드 넘버를 수정하시겠습니까? (y/n)${NC}" read -r MODIFY_BUILD if [[ "$MODIFY_BUILD" == "y" || "$MODIFY_BUILD" == "Y" ]]; then echo -e "${YELLOW}새 빌드 넘버를 입력하세요 (현재: ${BUILD_NUMBER}):${NC}" read -r NEW_BUILD_NUMBER if [ -n "$NEW_BUILD_NUMBER" ]; then BUILD_NUMBER=$NEW_BUILD_NUMBER echo -e "${GREEN}빌드 넘버가 ${BUILD_NUMBER}(으)로 설정되었습니다.${NC}" fi fi # 릴리즈 빌드인 경우 버전 코드 증가 여부 확인 if [[ "$BUILD_TYPE" == "release-aab" || "$BUILD_TYPE" == "release-apk" ]]; then # 버전 정보를 이미 수정했다면 다시 묻지 않음 if [[ "$MODIFY_VERSION" != "y" && "$MODIFY_VERSION" != "Y" ]]; then echo -e "${YELLOW}버전 코드를 증가시키겠습니까? 현재 버전 코드: ${NEW_VERSION_CODE} (y/n)${NC}" read -r INCREASE_VERSION if [[ "$INCREASE_VERSION" == "y" || "$INCREASE_VERSION" == "Y" ]]; then NEW_VERSION_CODE=$((NEW_VERSION_CODE + 1)) echo -e "${GREEN}버전 코드가 ${NEW_VERSION_CODE}(으)로 증가됩니다.${NC}" fi fi # 키스토어 정보 자동 설정 KEYSTORE_PASSWORD="djqrP1dnl#" KEY_ALIAS="key0" KEY_PASSWORD="aplfarm99##" echo -e "${GREEN}키스토어 비밀번호와 키 정보가 자동으로 설정되었습니다.${NC}" # 서명 설정 업데이트 echo -e "${YELLOW}서명 설정 업데이트 중...${NC}" sed -i '' "s/storePassword \".*\"/storePassword \"$KEYSTORE_PASSWORD\"/" android/app/build.gradle sed -i '' "s/keyAlias \".*\"/keyAlias \"$KEY_ALIAS\"/" android/app/build.gradle sed -i '' "s/keyPassword \".*\"/keyPassword \"$KEY_PASSWORD\"/" android/app/build.gradle echo -e "${GREEN}서명 설정이 업데이트되었습니다.${NC}" fi echo -e "${YELLOW}Zellyy Finance 앱 빌드 시작 (${BUILD_TYPE}, 빌드 넘버: ${BUILD_NUMBER}, 버전 코드: ${NEW_VERSION_CODE}): $(date)${NC}" # 버전 정보를 파일에 저장하는 함수 save_version_info() { # version.properties 파일 업데이트 - 루트 디렉토리와 app 디렉토리 모두에 저장 echo "buildNumber=$BUILD_NUMBER" > android/version.properties echo "versionCode=$NEW_VERSION_CODE" >> android/version.properties echo "versionName=$VERSION_NAME" >> android/version.properties # app 디렉토리에도 동일한 파일 복사 cp android/version.properties android/app/version.properties # app_version.json 파일 업데이트 cat > android/app_version.json << EOF { "versionCode": $NEW_VERSION_CODE, "versionName": "$VERSION_NAME", "buildNumber": $BUILD_NUMBER, "notes": "사용자가 수정한 버전 정보입니다. 이 파일을 편집하여 앱 버전 정보를 변경할 수 있습니다." } EOF # AppVersionInfo.tsx 파일의 하드코딩된 버전 정보 업데이트 echo -e "${YELLOW}AppVersionInfo.tsx 파일의 버전 정보 업데이트 중...${NC}" # 백업 파일 생성 cp src/components/AppVersionInfo.tsx src/components/AppVersionInfo.tsx.bak # AppVersionInfo.tsx 파일에서 하드코딩된 버전 정보 업데이트 sed -i '' "s/versionName: '[^']*'/versionName: '$VERSION_NAME'/" src/components/AppVersionInfo.tsx sed -i '' "/hardcodedVersionInfo/,/}/s/buildNumber: [0-9]*/buildNumber: $BUILD_NUMBER/" src/components/AppVersionInfo.tsx sed -i '' "/hardcodedVersionInfo/,/}/s/versionCode: [0-9]*/versionCode: $NEW_VERSION_CODE/" src/components/AppVersionInfo.tsx echo -e "${GREEN}AppVersionInfo.tsx 파일의 버전 정보가 업데이트되었습니다.${NC}" echo -e "${GREEN}버전 정보가 모든 파일에 저장되었습니다: 버전 코드=${NEW_VERSION_CODE}, 버전 이름=${VERSION_NAME}, 빌드 넘버=${BUILD_NUMBER}${NC}" } # 빌드 시작 전에 버전 정보 저장 save_version_info # 캐시 삭제 echo -e "${YELLOW}빌드 캐시 삭제 중...${NC}" rm -rf node_modules/.vite rm -rf android/app/build rm -rf android/.gradle rm -rf dist echo -e "${GREEN}빌드 캐시가 삭제되었습니다.${NC}" # 1. 웹 앱 빌드 echo -e "${YELLOW}1. 웹 앱 빌드 중...${NC}" npm run build if [ $? -ne 0 ]; then echo -e "${RED}웹 앱 빌드 실패. 빌드 프로세스를 중단합니다.${NC}" exit 1 fi echo -e "${GREEN}웹 앱 빌드 완료${NC}" # 2. Capacitor에 웹 코드 복사 및 동기화 echo -e "${YELLOW}2. Capacitor에 웹 코드 동기화 중...${NC}" npx cap sync android if [ $? -ne 0 ]; then echo -e "${RED}Capacitor 동기화 실패. 빌드 프로세스를 중단합니다.${NC}" exit 1 fi echo -e "${GREEN}Capacitor 동기화 완료${NC}" # 3. 안드로이드 APK/AAB 빌드 cd android echo -e "${YELLOW}3. 안드로이드 빌드 시작 (${BUILD_TYPE})...${NC}" # 빌드 타입에 따라 다른 명령어 실행 if [ "$BUILD_TYPE" = "debug" ]; then # 디버그 빌드 ./gradlew clean assembleDebug if [ $? -ne 0 ]; then echo -e "${RED}디버그 APK 빌드 실패. 오류를 확인하세요.${NC}" exit 1 fi APK_PATH="app/build/outputs/apk/debug/app-debug.apk" DEST_PATH="$HOME/zellyy-finance-debug.apk" if [ -f "$APK_PATH" ]; then echo -e "${GREEN}디버그 APK 빌드 성공!${NC}" echo -e "APK 파일 위치: $(pwd)/$APK_PATH" # 홈 디렉토리로 APK 복사 cp "$APK_PATH" "$DEST_PATH" echo -e "${GREEN}APK를 홈 디렉토리에 복사했습니다: $DEST_PATH${NC}" # 연결된 기기 확인 DEVICES=$(adb devices | grep -v "List" | grep "device" | wc -l) if [ $DEVICES -gt 0 ]; then echo -e "${YELLOW}연결된 기기가 감지되었습니다. 설치하시겠습니까? (y/n)${NC}" read -r INSTALL if [ "$INSTALL" = "y" ] || [ "$INSTALL" = "Y" ]; then # 기기가 여러 개인 경우 if [ $(adb devices | grep -v "List" | grep "device" | wc -l) -gt 1 ]; then echo -e "${YELLOW}여러 기기가 연결되어 있습니다. 특정 기기를 선택하세요:${NC}" adb devices | grep -v "List" | grep "device" echo -e "${YELLOW}기기 ID를 입력하세요:${NC}" read -r DEVICE_ID adb -s "$DEVICE_ID" install -r "$APK_PATH" else adb install -r "$APK_PATH" fi echo -e "${GREEN}설치 완료!${NC}" fi else echo -e "${YELLOW}연결된 기기가 없습니다. 다음 방법으로 APK를 설치할 수 있습니다:${NC}" echo "1. USB 케이블로 폰을 연결하고 파일 전송" echo "2. 이메일이나 메신저로 APK 파일 전송" echo "3. adb 명령어 사용: adb install $DEST_PATH" fi else echo -e "${RED}APK 빌드 실패. 오류를 확인하세요.${NC}" exit 1 fi elif [ "$BUILD_TYPE" = "release-aab" ]; then # AAB 릴리즈 빌드 ./gradlew clean bundleRelease if [ $? -ne 0 ]; then echo -e "${RED}릴리즈 AAB 빌드 실패. 오류를 확인하세요.${NC}" exit 1 fi AAB_PATH="app/build/outputs/bundle/release/app-release.aab" DEST_PATH="$HOME/zellyy-finance-release.aab" if [ -f "$AAB_PATH" ]; then echo -e "${GREEN}릴리즈 AAB 빌드 성공!${NC}" echo -e "AAB 파일 위치: $(pwd)/$AAB_PATH" # 홈 디렉토리로 AAB 복사 cp "$AAB_PATH" "$DEST_PATH" echo -e "${GREEN}AAB를 홈 디렉토리에 복사했습니다: $DEST_PATH${NC}" echo -e "${YELLOW}다음 단계:${NC}" echo "1. Google Play Console에 AAB 파일 업로드: $DEST_PATH" echo "2. 내부 테스트 트랙을 선택하여 업로드" echo "3. 검토 과정이 완료될 때까지 기다리기 (보통 몇 시간에서 24시간 소요)" else echo -e "${RED}AAB 빌드 실패. 오류를 확인하세요.${NC}" exit 1 fi elif [ "$BUILD_TYPE" = "release-apk" ]; then # 서명된 APK 릴리즈 빌드 ./gradlew clean assembleRelease if [ $? -ne 0 ]; then echo -e "${RED}서명된 릴리즈 APK 빌드 실패. 오류를 확인하세요.${NC}" exit 1 fi SIGNED_APK_PATH="app/build/outputs/apk/release/app-release.apk" DEST_PATH="$HOME/zellyy-finance-release.apk" if [ -f "$SIGNED_APK_PATH" ]; then echo -e "${GREEN}서명된 릴리즈 APK 빌드 성공!${NC}" echo -e "APK 파일 위치: $(pwd)/$SIGNED_APK_PATH" # 홈 디렉토리로 APK 복사 cp "$SIGNED_APK_PATH" "$DEST_PATH" echo -e "${GREEN}서명된 APK를 홈 디렉토리에 복사했습니다: $DEST_PATH${NC}" # 연결된 기기 확인 DEVICES=$(adb devices | grep -v "List" | grep "device" | wc -l) if [ $DEVICES -gt 0 ]; then echo -e "${YELLOW}연결된 기기가 감지되었습니다. 설치하시겠습니까? (y/n)${NC}" read -r INSTALL if [ "$INSTALL" = "y" ] || [ "$INSTALL" = "Y" ]; then # 기기가 여러 개인 경우 if [ $(adb devices | grep -v "List" | grep "device" | wc -l) -gt 1 ]; then echo -e "${YELLOW}여러 기기가 연결되어 있습니다. 특정 기기를 선택하세요:${NC}" adb devices | grep -v "List" | grep "device" echo -e "${YELLOW}기기 ID를 입력하세요:${NC}" read -r DEVICE_ID adb -s "$DEVICE_ID" install -r "$SIGNED_APK_PATH" else adb install -r "$SIGNED_APK_PATH" fi echo -e "${GREEN}설치 완료!${NC}" fi else echo -e "${YELLOW}연결된 기기가 없습니다. 다음 방법으로 APK를 설치할 수 있습니다:${NC}" echo "1. USB 케이블로 폰을 연결하고 파일 전송" echo "2. 이메일이나 메신저로 APK 파일 전송" echo "3. adb 명령어 사용: adb install $DEST_PATH" fi else echo -e "${RED}APK 빌드 실패. 오류를 확인하세요.${NC}" exit 1 fi else echo -e "${RED}지원되지 않는 빌드 타입입니다: $BUILD_TYPE${NC}" echo -e "${YELLOW}사용법: ./build-apk-for-device.sh${NC}" exit 1 fi echo -e "${GREEN}빌드 프로세스 완료: $(date)${NC}"