ภาพรวม
การเปลี่ยน Package Name (Application ID) ใน Android Studio ต้องทำให้ถูกต้องทั้ง **Source Code** และ **Build Configuration** เพื่อไม่ให้เกิด Error หรือ Conflict บน Play Store
ขั้นตอนแบบ Visual (Refactor - แนะนำ)
1. เปิด Project View เป็น "Project" (ไม่ใช่ Android)
ซ้ายบน → Dropdown เลือก Project (แทน Android) → จะเห็นโครงสร้างโฟลเดอร์จริง
2. Refactor Package Name
- ขยายโฟลเดอร์:
app → src → main → java → com.example.oldpackage - Right-click ที่โฟลเดอร์ package สุดท้าย (เช่น
com.example.myapp) - เลือก Refactor → Rename (หรือกด Shift+F6)
- Dialog ปรากฏ → เลือก Rename package (ไม่ใช่ Rename directory)
- พิมพ์ Package Name ใหม่ (เช่น
com.newcompany.newapp) → Refactor - รอ Refactoring Preview → ตรวจสอบไฟล์ที่จะเปลี่ยน → Do Refactor
3. อัปเดต applicationId ใน build.gradle
หลัง Refactor แล้ว ให้เปิด build.gradle (Module: app) ตรวจสอบ:
android {
defaultConfig {
applicationId "com.newcompany.newapp" // ต้องตรงกับ Package Name ใหม่
minSdkVersion 21
targetSdkVersion 34
versionCode 1
versionName "1.0"
}
}
สำคัญ: Refactor ไม่ได้แก้ applicationId ให้อัตโนมัติ ต้องแก้เอง
4. Clean & Rebuild
Build → Clean Project Build → Rebuild Project
ขั้นตอนทางเลือก: เปลี่ยนด้วยตนเอง (Manual)
หาก Refactor ไม่ได้ผล ลองทำ Manual:
- เปลี่ยนชื่อโฟลเดอร์ใน
src/main/java/ให้ตรง Package ใหม่ - แก้ `package` statement ในทุกไฟล์ .java/.kt
- แก้ `applicationId` ใน build.gradle
- แก้ `namespace` ใน build.gradle (AGP 7.3+)
- แก้ `android:authorities` ใน Manifest (สำหรับ FileProvider, ContentProvider)
- Clean & Rebuild
ไฟล์ที่ต้องตรวจสอบหลังเปลี่ยน
| ไฟล์ | สิ่งที่ต้องตรวจสอบ |
|---|---|
| AndroidManifest.xml | package attribute (legacy), authorities |
| build.gradle (app) | applicationId, namespace |
| google-services.json | package_name (ถ้าใช้ Firebase) |
| proguard-rules.pro | Keep rules ที่อ้าง package |
| Test files (androidTest, test) | Package declaration |
กรณีพิเศษ: ใช้ Namespace แยกจาก Application ID (AGP 7.3+)
android {
namespace 'com.company.library' // สำหรับ R class, BuildConfig
defaultConfig {
applicationId 'com.company.app' // สำหรับ Play Store, Install
}
}
ปกติจะเหมือนกัน แต่ Library Module อาจแยกได้
Troubleshooting
- R class not found: Clean Project → Rebuild → File → Invalidate Caches / Restart
- Manifest merger failed: ตรวจสอบ authorities, permission names ที่มี package name เก่า
- Firebase/Google Services error: ดาวน์โหลด google-services.json ใหม่จาก Console
- Play Store rejects: applicationId ต้องไม่ซ้ำกับแอปอื่น และไม่สามารถเปลี่ยนได้หลังอัปโหลดครั้งแรก
Best Practices
- ใช้ Reverse Domain Name:
com.companyname.appname - ตัวพิมพ์เล็กทั้งหมด, ไม่มีช่องว่าง, ไม่ขึ้นต้นด้วยตัวเลข
- ตัดสินใจ Package Name ตั้งแต่ต้นโปรเจกต์ (ยากต่อการเปลี่ยนหลัง Release)
- เก็บ Package Name ไว้ใน `gradle.properties` เพื่ออ้างอิงง่าย
สรุป
ใช้ **Refactor → Rename → Rename package** ใน Project View แล้วแก้ `applicationId` ใน build.gradle ให้ตรงกัน → Clean/Rebuild → ตรวจสอบ Manifest และ google-services.json