Skip to content

Instantly share code, notes, and snippets.

@JayDev-Lee
Last active October 24, 2024 09:22
Show Gist options
  • Save JayDev-Lee/c563909c80ed9508b5cb91abd331e98c to your computer and use it in GitHub Desktop.
Save JayDev-Lee/c563909c80ed9508b5cb91abd331e98c to your computer and use it in GitHub Desktop.
android project package renaming script
#!/bin/bash
usage() {
if [ "$*" != "" ] ; then
echo "Error: $*"
fi
cat << EOF
Usage: $PROGNAME --package-name [PACKAGE_NAME] --title [TITLE]
Rename an Android app and package.
Options:
-h, --help display this usage message and exit
-p, --package-name [PACKAGE_NAME] new package name (i.e. com.example.package)
-t, --title [TITLE] new app title (i.e. MyApp)
EOF
exit 1
}
NEW_PACKAGE=""
NEW_APP_NAME=""
# 인자 처리
while [[ "$#" -gt 0 ]]; do
key="$1"
case $key in
-p|--package-name)
NEW_PACKAGE="$2"
if [ -n "$2" ] && [[ "$2" != -* ]]; then
NEW_PACKAGE="$2"
shift 2
else
usage "Missing value for --package-name/-p"
fi
;;
-t|--title)
NEW_APP_NAME="$2"
if [ -n "$2" ] && [[ "$2" != -* ]]; then
NEW_APP_NAME="$2"
shift 2
else
usage "Missing value for --title/-t"
fi
;;
-*)
usage "Unknown option '$1'"
;;
*)
usage "Too many arguments"
;;
esac
done
# 인자가 없는 경우 처리
if [ -z "$NEW_PACKAGE" ] || [ -z "$NEW_APP_NAME" ]; then
echo "Usage: $0 --new-package <new_package> --new-name <new_app_name>"
exit 1
fi
# 변수 정의
OLD_PACKAGE="com.superapps.example"
OLD_APP_NAME="example"
PROJECT_DIR="$(pwd)"
# OLD_APP_NAME 대소문자 처리
OLD_APP_NAME_LOWER=$(echo "$OLD_APP_NAME" | tr '[:upper:]' '[:lower:]')
OLD_APP_NAME_CAPITALIZED=$(echo "$OLD_APP_NAME" | awk '{print toupper(substr($0,1,1)) tolower(substr($0,2))}')
NEW_APP_NAME_LOWER=$(echo "$NEW_APP_NAME" | tr '[:upper:]' '[:lower:]')
echo "Updating package name from $OLD_PACKAGE to $NEW_PACKAGE"
echo "Updating app name from $OLD_APP_NAME to $NEW_APP_NAME"
# 모든 모듈의 디렉토리를 찾기 위한 반복문
for module in $(find "$PROJECT_DIR" -maxdepth 3 -type d \( ! -path "*/build*" ! -path "*/.*" \)); do
echo "Updating package name in module: $module"
# Java/Kotlin 소스 파일 내의 패키지 이름 변경
find "$module" -type f \( -name "*.java" -o -name "*.kt" \) -exec sed -i '' "s/$OLD_PACKAGE/$NEW_PACKAGE/g" {} +
find "$module" -type f \( -name "*.java" -o -name "*.kt" \) -exec sed -i '' "s/$OLD_APP_NAME_LOWER/$NEW_APP_NAME_LOWER/g" {} +
find "$module" -type f \( -name "*.java" -o -name "*.kt" \) -exec sed -i '' "s/$OLD_APP_NAME_CAPITALIZED/$NEW_APP_NAME/g" {} +
# version catalog 파일에서 패키지 이름 변경
find "$module" -type f -name "libs.versions.toml" -exec sed -i '' "s/$OLD_PACKAGE/$NEW_PACKAGE/g" {} +
find "$module" -type f -name "libs.versions.toml" -exec sed -i '' "s/$OLD_APP_NAME/$NEW_APP_NAME_LOWER/g" {} +
find "$module" -type f -name "libs.versions.toml" -exec sed -i '' "s/$OLD_APP_NAME_CAPITALIZED/$NEW_APP_NAME/g" {} +
# AndroidManifest 파일에서 패키지 이름 변경
find "$module" -type f -name "AndroidManifest.xml" -exec sed -i '' "s/$OLD_PACKAGE/$NEW_PACKAGE/g" {} +
find "$module" -type f -name "AndroidManifest.xml" -exec sed -i '' "s/$OLD_APP_NAME_LOWER/$NEW_APP_NAME_LOWER/g" {} +
find "$module" -type f -name "AndroidManifest.xml" -exec sed -i '' "s/$OLD_APP_NAME_CAPITALIZED/$NEW_APP_NAME/g" {} +
# Gradle 파일에서 패키지 이름 변경
find "$module" -type f -name "build.gradle.kts" -exec sed -i '' "s/$OLD_PACKAGE/$NEW_PACKAGE/g" {} +
find "$module" -type f -name "build.gradle.kts" -exec sed -i '' "s/$OLD_APP_NAME_LOWER/$NEW_APP_NAME_LOWER/g" {} +
find "$module" -type f -name "build.gradle.kts" -exec sed -i '' "s/$OLD_APP_NAME_CAPITALIZED/$NEW_APP_NAME/g" {} +
# 리소스 파일(.xml)에서 패키지 이름 변경
find "$module" -type f -name "*.xml" -exec sed -i '' "s/$OLD_PACKAGE/$NEW_PACKAGE/g" {} +
# .DS_Store 파일 제거
find "$module" -name "*.DS_Store" -exec rm -f {} +
done
# 모듈 경로 탐색 및 배열 설정
MODULES=$(find "$PROJECT_DIR" -type d -name "src" | sed 's|/src||' | sort -u)
# 각 모듈의 src 디렉토리에서 패키지 경로 변경
OLD_PACKAGE_PATH=$(echo "$OLD_PACKAGE" | tr '.' '/')
NEW_PACKAGE_PATH=$(echo "$NEW_PACKAGE" | tr '.' '/')
for MODULE in $MODULES; do
for SRC_DIR in "main" "test" "androidTest"; do
for LANG_DIR in "java" "kotlin"; do
OLD_PATH="$MODULE/src/$SRC_DIR/$LANG_DIR/$OLD_PACKAGE_PATH"
NEW_PATH="$MODULE/src/$SRC_DIR/$LANG_DIR/$NEW_PACKAGE_PATH"
# 이전 패키지 경로가 존재하는지 확인
if [ -d "$OLD_PATH" ]; then
# 새로운 패키지 경로 생성
mkdir -p "$NEW_PATH"
# 파일들을 새로운 경로로 이동
rsync -av "$OLD_PATH/" "$NEW_PATH/"
# 이전 빈 디렉토리 삭제
rm -rf "$OLD_PATH"
fi
done
done
done
echo "Package name change completed!"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment