Package Name คือตัวระบุเฉพาะของแอปพลิเคชัน Android ที่อิงจากการเขียนชื่อโดเมนแบบย้อนกลับ (reverse domain notation) ระบบใช้เพื่อแยกแยะแอปพลิเคชันบนอุปกรณ์ของผู้ใช้ ใน Google Play สำหรับการระบุผลิตภัณฑ์ และในบริการ Firebase สำหรับเชื่อมโยงการกำหนดค่าโครงการทั้งหมด ตามAndroid Developer Documentation Package Name ยังคงไม่เปลี่ยนแปลงตลอดวงจรชีวิตของแอปพลิเคชันหลังการเผยแพร่
สาระสำคัญ
Package Name คือสตริงเฉพาะที่ Android ใช้ในการระบุแอปพลิเคชันในระดับระบบปฏิบัติการ โดยสอดคล้องกับฟิลด์ package ในไฟล์ AndroidManifest.xml และฟิลด์ applicationId ในไฟล์ build.gradle ของโมดูลแอป หากไม่มี Package Name ที่ไม่ซ้ำกัน จะไม่สามารถติดตั้งแอปพลิเคชันบนอุปกรณ์ของผู้ใช้ได้
บนอุปกรณ์ Package Name ทำหน้าที่เป็นคีย์สำหรับจัดการแอปพลิเคชัน: ระบบจะเก็บข้อมูล การตั้งค่า และแคชของแต่ละแอปในไดเรกทอรี /data/data/[packageName] แอปสองตัวที่มีตัวระบุเดียวกันไม่สามารถอยู่ร่วมกันได้ — เมื่อพยายามติดตั้งแอปซ้ำ ระบบจะเสนอให้ลบแอปที่มีอยู่ออก
ใน Android Gradle Plugin เวอร์ชัน 0.11+ มีการแยกระหว่าง Package Name (ในแมนิเฟสต์) และ Application ID (ใน build.gradle) Application ID คือตัวระบุจริงของแอปพลิเคชันสำหรับระบบและ Google Play Package Name ในแมนิเฟสต์ใช้สำหรับการแก้ไขทรัพยากรและการสร้างคลาส R ขอแนะนำให้คงค่าไว้เหมือนกันเพื่อความเรียบง่าย
// build.gradle (Module: app)
android {
defaultConfig {
applicationId "com.example.myapplication"
minSdkVersion 24
targetSdkVersion 34
versionCode 1
versionName "1.0"
}
buildTypes {
debug {
applicationIdSuffix ".debug"
}
}
}
ฟิลด์ applicationIdSuffix อนุญาตให้เพิ่มคำต่อท้ายใน Application ID สำหรับการกำหนดค่าการ build ที่แตกต่างกัน เวอร์ชันดีบักสามารถมีตัวระบุเป็น com.example.app.debug ซึ่งทำให้สามารถติดตั้งควบคู่ไปกับเวอร์ชันโปรดักชันเพื่อการทดสอบแบบขนานได้
Google Play กำหนดกฎที่เข้มงวดสำหรับ Package Name ที่ต้องปฏิบัติตามเมื่อเผยแพร่ ตัวระบุต้องไม่ซ้ำกันในระดับร้านค้าทั้งหมด ตรงตามข้อกำหนดทางไวยากรณ์ และไม่ละเมิดนโยบายการใช้เครื่องหมายการค้า
Package Name สามารถมีได้เฉพาะตัวอักษรละติน (A-Z, a-z) ตัวเลข (0-9) จุด (.) และขีดล่าง (_) ความยาวสูงสุดคือ 150 ตัวอักษร แต่ละส่วนระหว่างจุดต้องขึ้นต้นด้วยตัวอักษร ยัติภังค์ ช่องว่าง และอักขระพิเศษถูกห้ามโดยกฎของ Google Play
| ข้อกำหนด | ค่า | ตัวอย่าง |
|---|---|---|
| อักขระที่อนุญาต | ตัวอักษรละติน ตัวเลข จุด ขีดล่าง | com.example.my_app |
| ความยาวสูงสุด | 150 ตัวอักษร | com.example.verylongappname |
| จุดเริ่มต้นของส่วน | เฉพาะตัวอักษร | com — ไม่ใช่ 3com |
| ต้องห้าม | ยัติภังค์ ช่องว่าง อักษรซีริลลิก | com.ผู้ใช้-domain — ข้อผิดพลาด |
| ความเป็นเอกลักษณ์ | ระดับโลกใน Google Play | ตรวจสอบเมื่อสร้าง |
ความเป็นเอกลักษณ์ ของ Package Name เป็นข้อกำหนดสัมบูรณ์ของ Google Play Store หากแอปอื่นใช้ตัวระบุที่เลือกไว้แล้ว การเผยแพร่จะถูกปฏิเสธ Google ไม่ปล่อยตัวระบุของแอปที่ถูกลบ ดังนั้นการเลือก Package Name แรกจึงเป็นการตัดสินใจที่สำคัญสำหรับทุกโปรเจกต์ของนักพัฒนา
Reverse domain notation คือมาตรฐานการตั้งชื่อที่ชื่อโดเมนของบริษัทถูกเขียนในลำดับย้อนกลับ: com.example แทน example.com ระบบดังกล่าวรับประกันความเป็นเอกลักษณ์ระดับโลกของตัวระบุ เนื่องจากชื่อโดเมนแต่ละชื่อมีความเฉพาะตัวโดยนิยาม
นักพัฒนามักใช้คำนำหน้าที่สอดคล้องกับ TLD ของโดเมน: com สำหรับองค์กรเชิงพาณิชย์ org สำหรับองค์กรไม่แสวงหาผลกำไร io สำหรับโปรเจกต์เทคโนโลยี net สำหรับบริการและโซลูชันเครือข่าย สำหรับโปรเจกต์ส่วนตัว สามารถใช้ com.github.username หรือ com.email ได้
สำหรับแอปที่เผยแพร่บน iOS และ Android ขอแนะนำให้ใช้ตัวระบุเดียวกันบนทั้งสองแพลตฟอร์ม ซึ่งช่วยลดความซับซ้อนในการรวมระบบกับ Firebase, AppsFlyer, Adjust และระบบวิเคราะห์อื่นๆ ที่เชื่อมโยงกับตัวระบุโปรเจกต์ ตัวอย่างเช่น com.mycompany.myapp จะเป็น Bundle ID บน iOS และ Package Name บน Android
การกำหนดค่า Package Name ในโปรเจกต์ Android รวมถึงการเปลี่ยน applicationId ใน build.gradle และโครงสร้างไดเรกทอรีของโค้ด Java/Kotlin ที่เกี่ยวข้อง Android Studio มีเครื่องมือสำหรับการรีแฟกเตอร์ Package Name แต่สำหรับโปรเจกต์ที่ซับซ้อน ขอแนะนำให้ย้ายข้อมูลแบบทีละขั้นตอน
// เส้นทางไฟล์สอดคล้องกับ Package Name
// com/example/myapp/MainActivity.kt
package com.example.myapp
import android.os.Bundle
import androidx.activity.ComponentActivity
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
}
ใน Kotlin และ Java Package Name ในไฟล์ต้นฉบับต้องสอดคล้องกับโครงสร้างไดเรกทอรี เมื่อเปลี่ยน Package Name ใน build.gradle จำเป็นต้องย้ายไฟล์ไปยังไดเรกทอรีที่เกี่ยวข้องและอัปเดตคำประกาศ package และ import ทั้งหมด Android Studio สามารถทำสิ่งนี้ได้โดยอัตโนมัติผ่าน Refactor -> Move แต่สำหรับโปรเจกต์ขนาดใหญ่ที่มีไฟล์นับสิบ ขอแนะนำให้ตรวจสอบผลลัพธ์หลังการรีแฟกเตอร์
หากโปรเจกต์ใช้ Data Binding, View Binding หรือ Hilt การเปลี่ยน Package Name จะกระทบกับคลาสที่ถูกสร้างขึ้นด้วย คลาส Binding ถูกสร้างขึ้นบนพื้นฐานของ Package Name ของโมดูลและไดเรกทอรี layout หลังจากเปลี่ยนตัวระบุแล้ว จะต้อง build โปรเจกต์ใหม่เพื่ออัปเดตลิงก์ที่สร้างขึ้นทั้งหมด ขอแนะนำให้ทำ clean build หลังจากเปลี่ยน Package Name เพื่อป้องกันข้อผิดพลาดจากลิงก์เก่าที่ถูกแคชไว้
ใน Gradle 7.0+ มีการสนับสนุน namespace ใน build.gradle ซึ่งแทนที่ package ใน AndroidManifest.xml เพื่อวัตถุประสงค์ในการสร้างคลาส R และทรัพยากร โดยที่ applicationId ยังคงเป็นตัวระบุจริงของแอปพลิเคชันสำหรับระบบและ Google Play ซึ่งทำให้สามารถมี applicationId และ namespace ที่แตกต่างกัน ซึ่งมีประโยชน์สำหรับโมดูลไลบรารีที่ namespace ถูกกำหนดไว้คงที่ ในขณะที่ตัวระบุสาธารณะสามารถเปลี่ยนแปลงได้เมื่อ build
สำหรับโปรเจกต์ที่มี สถาปัตยกรรมแบบโมดูล การเปลี่ยน Package Name ของโมดูลหนึ่งอาจกระทบต่อ imports ในโมดูลอื่น หากโมดูล data มีแพ็กเกจ com.example.data และโมดูล domain ใช้คลาสของมัน หลังจากเปลี่ยนตัวระบุแล้ว ให้อัปเดต imports ในทุกโมดูลที่ขึ้นต่อกัน ปลั๊กอิน Gradle ของ Android เวอร์ชัน 8.0+ ทำให้กระบวนการนี้ง่ายขึ้นด้วยการสร้าง namespace อัตโนมัติจาก build.gradle
สามารถรับ Application ID ปัจจุบันได้ผ่านคลาส BuildConfig: BuildConfig.APPLICATION_ID ซึ่งสะดวกสำหรับตรรกะแบบมีเงื่อนไขในโค้ด การผูกกับสภาพแวดล้อม หรือการแสดงตัวระบุในหน้าจอดีบัก BuildConfig ถูกสร้างขึ้นโดยอัตโนมัติตาม build.gradle
// การรับ Application ID ใน runtime
val packageName = BuildConfig.APPLICATION_ID
val packageManager = packageManager
val appInfo = packageManager.getPackageInfo(packageName, 0)
println("App version: ${appInfo.versionName} (${appInfo.versionCode})")
println("Package: $packageName")
การเปลี่ยน Package Name หลังจากเผยแพร่แอปใน Google Play เป็นการดำเนินการที่หมายถึงการสร้างผลิตภัณฑ์ใหม่ทั้งหมด ระบบไม่อนุญาตให้อัปเดตแอปที่มีอยู่ด้วย Package Name อื่น ดังนั้นการตัดสินใจเปลี่ยนตัวระบุจึงเทียบเท่ากับการเริ่มโปรเจกต์ใหม่ในร้านค้า
เมื่อเปลี่ยน Package Name จะสูญเสีย: เรตติ้งและรีวิวทั้งหมด สถิติการติดตั้ง การรวมระบบกับ Google Services (หากไม่ได้ย้าย) ลิงก์ไปยังโปรเจกต์ Firebase (ต้องสร้าง google-services.json ใหม่) ผู้ใช้จะไม่ได้รับการอัปเดตอัตโนมัติ — พวกเขาจะเห็นแอปใหม่ในร้านค้า
การเปลี่ยน Package Name อาจสมเหตุสมผลเมื่อมีการรีแบรนด์บริษัท การย้ายแอปไปยังบัญชีนักพัฒนาอื่น หรือเมื่อสร้างเวอร์ชันแยกต่างหากสำหรับภูมิภาคอื่น ไม่ว่าในกรณีใด ก่อนการเปลี่ยนขอแนะนำให้แจ้งผู้ใช้ผ่านแอปเก่าและเตรียมแผนการย้ายข้อมูลพร้อมการโอนย้ายข้อมูล หากไม่มีแผนการย้ายข้อมูล ผู้ใช้จะสูญเสียการเข้าถึงคอนเทนต์ที่ซื้อแล้ว การสมัครสมาชิก และข้อมูลที่บันทึกไว้ของแอป การย้ายข้อมูลรวมถึงการโอนย้ายฐานข้อมูลและไฟล์ผ่าน SharedPreferences หรือ Room
ก่อนเปลี่ยน Package Name ตรวจสอบให้แน่ใจว่าตัวระบุใหม่ไม่ซ้ำกันและสอดคล้องกับกฎการตั้งชื่อ สร้างแอปใหม่ใน Google Play ด้วย Package Name ใหม่และเผยแพร่เป็นผลิตภัณฑ์แยกต่างหาก ในคำอธิบายของแอปเก่า ให้ใส่ลิงก์ไปยังแอปใหม่ พิจารณาความเป็นไปได้ในการใช้ Google Play Custom Store Listing เพื่อเปลี่ยนเส้นทางผู้ใช้
คำถามที่พบบ่อย
ใน Package Name อนุญาตให้ใช้ขีดล่าง (_) แต่ไม่ใช่ยัติภังค์ (-) ขีดล่างใช้น้อยแต่ก็ใช้ได้: com.example.my_app ยัติภังค์ถูกห้ามโดยกฎของ Google Play และจะทำให้เกิดข้อผิดพลาดเมื่อเผยแพร่ ขอแนะนำให้ใช้เฉพาะจุดเป็นตัวคั่นส่วน
Package Name คือตัวระบุใน AndroidManifest.xml ที่ใช้สำหรับการแก้ไขทรัพยากรและการสร้างคลาส R Application ID คือฟิลด์ใน build.gradle ที่กำหนดตัวระบุของแอปพลิเคชันสำหรับระบบและ Google Play Store ขอแนะนำให้คงค่าไว้เหมือนกัน แต่สามารถแตกต่างกันได้เมื่อใช้ applicationIdSuffix
ใช้ reverse domain notation ของบริษัทหรือชื่อผู้ใช้ของคุณ: com.domain.appname ตรวจสอบให้แน่ใจว่าตัวระบุไม่ซ้ำกันใน Google Play หลีกเลี่ยงคำทั่วไป (todo, test, app) และตรวจสอบว่าตัวระบุไม่ได้ถูกใช้โดยนักพัฒนาอื่นผ่านการค้นหาใน Google Play
ได้ ก่อนเผยแพร่ใน Google Play สามารถเปลี่ยน Package Name ได้โดยไม่มีผลกระทบ หลังจากเปลี่ยนแล้ว จะต้องสร้าง google-services.json ใหม่ อัปเดตโครงสร้างไดเรกทอรี และตรวจสอบ imports ทั้งหมด Android Studio มีเครื่องมือ Refactor -> Move สำหรับทำให้กระบวนการเป็นอัตโนมัติ
Package Name ร่วมกับใบรับรองการเซ็นชื่อสร้างคู่ที่ใช้ระบุแอปพลิเคชันใน Google Play แม้ว่าแอปสองตัวจะมี Package Name ต่างกัน แอปเหล่านั้นก็สามารถเซ็นชื่อด้วยคีย์เดียวกันได้ การเปลี่ยนใบรับรองการเซ็นชื่อสามารถทำได้ผ่าน Key Rotation ใน Play Console โดยไม่สูญเสียตัวระบุ
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ