02 March 2014

Package Name คืออะไร ทำไมถึงสำคัญกับการพัฒนาแอปแอนดรอยด์

Created on Sunday, March 02, 2014


เวลาจะสร้างแอปขึ้นมาซักตัวใน Android Studio จะพบว่าต้องตั้ง Package Name ให้กับแอปทุกครั้ง ซึ่งบทความนี้จะพามารู้จักกับเจ้าสิ่งนี้กัน

Package Name คือ

การที่ระบบแอนดรอยด์จะแยกแยะแอปแต่ละตัวได้นั้น ไม่ได้ดูที่ชื่อแอป เพราะว่าชื่อแอปมีไว้ให้ผู้ใช้รับรู้เท่านั้น เพราะการที่ผู้ใช้จะรู้ได้ว่าแอปนั้นๆคือแอปอะไร ก็จะดูจากชื่อแอปและภาพไอคอนของแอป โดยที่แอปแต่ละตัวก็อาจจะมีชื่อหรือภาพไอคอนที่เหมือนกันก็ได้

ดังนั้นระบบแอนดรอยด์จึงกำหนดสิ่งที่เรียกว่า Package Name ขึ้นมาเพื่อใช้เป็น Unique Name สำหรับแอปแต่ละตัว โดยกำหนดไว้ว่าแต่ละแอปจะต้องมี Package Name ของใครของมัน ห้ามซ้ำกับแอปอื่นๆโดยเด็ดขาด

จะเกิดอะไรขึ้นถ้ามีแอปที่ Package Name ซ้ำกัน?

นักพัฒนาจะกำหนด Package Name ให้กับแอปก็คือตอนที่สร้างโปรเจคสำหรับแอปนั้นๆขึ้นมาใน Android Studio ซึ่งไม่ได้มีการตรวจสอบอะไรเลยว่า Package Name ซ้ำกับแอปตัวอื่นที่มีอยู่แล้วหรือป่าว จึงทำให้นักพัฒนาสามารถใช้ Package Name นั้นๆและเขียนโค้ดได้โดยไม่มีอะไรเกิดขึ้น


แต่แอปที่มี Package Name ที่ซ้ำกับแอปอื่นจะเจอปัญหาก็ต่อเมื่อ

อัปโหลดแอปขึ้น Google Play : Google Play จะไม่ให้อัปโหลด ถ้ามีแอปตัวอื่นที่ใช้ Package Name นั้นๆอยู่แล้ว
ติดตั้งแอปลงในเครื่อง : จะติดตั้งแอปลงในเครื่องไม่ได้ ถ้ามีแอปที่ใช้ Package Name นั้นๆอยู่ในเครื่องแล้ว

ดังนั้นทางที่ดีก็ควรจะกำหนดชื่อ Package Name ด้วยชื่อที่เฉพาะตัวดีกว่า เพื่อลดโอกาสที่จะซ้ำกับแอปอื่นๆที่มีอยู่แล้ว

รูปแบบในการตั้ง Package Name

รูปแบบของ Package Name ที่ดี ควรกำหนดให้เป็นรูปแบบเดียวกับ Package ในโปรแกรม Java โดยใช้เป็นตัวพิมพ์เล็กทั้งหมด ไม่ใช่อักขระพิเศษ และคั่นระหว่างคำด้วยเครื่องหมายจุดทศนิยม เช่น

com.akexorcist.from.sleepingforless

ส่วนคำที่จะใช้ในการกำหนด Package Name นั้นไม่ได้มีข้อกำหนดตายตัว สามารถกำหนดได้ตามใจชอบเลย

ตั้งชื่อ Package Name อย่างไรให้มีโอกาสซ้ำได้น้อยที่สุด

โดยปกติแล้วแอนดรอยด์จะแนะนำให้กำหนด Package Name โดยใช้ Reverse Domain Name เพราะว่า Domain Name เป็นสิ่งที่ไม่สามารถซ้ำกันได้อยู่แล้ว แล้วค่อยเพิ่มคำต่อท้ายเข้าไปด้านหลัง เพราะอาจจะมีแอปได้มากกว่า 1 ตัวใน Domain Name นั้นๆ

อย่างเช่น Facebook ที่มีแอปหลายตัว ก็จะใช้ Domain Name ของ Facebook เป็นหลัก แต่มีการแยกแต่ละแอปด้วยชื่อแอปหรือ Codename อีกที


และสมมติว่าเจ้าของบล็อกสร้างแอปตัวหนึ่งขึ้นมา เอาไว้เช็คข้อมูลอุปกรณ์แอนดรอยด์ จึงตั้งชื่อว่า DeviceInfo ก็จะเอามากำหนดเป็น Package Name แบบนี้

com.akexorcist.android.deviceinfo

เหตุผลที่ใส่คำว่า android ลงไปด้วย เพราะว่าถ้าในอนาคตเจ้าของบล็อกอยากจะทำแอป DeviceInfo บน iOS ด้วยก็จะได้ใช้เป็น

com.akexorcist.ios.deviceinfo

เพราะบน iOS ก็มีสิ่งที่เรียกว่า Bundle ID ซึ่งเหมือนกับ Package Name บนแอนดรอยด์นั่นเอง ดังนั้นจึงใส่ชื่อ OS ลงไปด้วย เพื่อให้ระบุแอปแต่ละตัวได้ง่าย

ถ้าไม่มี Domain Name เป็นของตัวเองล่ะ?

อย่างที่บอกไปก่อนหน้านี้ว่าการใช้ Reverse Domain Name นั้นเป็นเพียงแค่ Best Practice ที่แอนดรอยด์แนะนำ แต่ถ้าไม่มี Domain Name เป็นของตัวเองจริงๆก็สามารถกำหนดเป็นอะไรก็ได้ ขอแค่ว่ามีโอกาสซ้ำได้ยากก็พอ หรือจะสมมติ Domain Name ขึ้นมาเองก็ได้

Package Name จะถูกกำหนดไว้ตรงไหนในโปรเจค?

Package Name ของแอปแต่ละตัวจะถูกเก็บไว้ใน Android Manifest ของโปรเจคนั้นๆ (ซึ่งเป็นไฟล์ที่จะไปอยู่ใน APK นั่นเอง) เมื่อผู้ที่หลงเข้ามาอ่านลองเปิด Android Manifest ขึ้นมาดู ก็จะพบว่ามีการกำหนด Package Name ไว้ที่นั่น

<!-- AndroidManifest.xml -->
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.akexorcist.android.deviceinfo">

    ...

</manifest>

แต่สำหรับ Android Studio ที่ใช้ Gradle เป็น Build Tool จะไม่ได้กำหนด Package Name ไว้ที่ Android Manifest โดยตรง แต่จะให้กำหนด Package Name เป็น Application ID ใน buid.gradle แทน เพื่อรองรับ Build Variant ของ Gradle ที่สามารถกำหนด Package Name แยกกันได้

// build.gradle
...
android {
    ...
    defaultConfig {
        applicationId "com.akexorcist.notification"
        ...
    }
    ...
}
...

ซึ่งสุดท้ายแล้วตอนที่ Gradle ทำการ Build ก็จะนำชื่อที่กำหนดไว้ใน Application ID ไปกำหนดเป็น Package Name ใน Android Manifest ให้โดยอัตโนมัติ

จะรู้ได้ยังไงว่าแอปที่อยู่บน Play Store นั้นใช้ Package Name ว่าอะไร?

ผู้ที่หลงเข้ามาอ่านสามารถเช็คแอปที่อยู่บน Google Play ว่ากำหนด Package Name ว่าอะไร ได้จาก URL ในหน้าดาวน์โหลดแอปนั้นๆ


ดังนั้นถ้าอยากรู้ว่าแอปตัวไหนใช้ Package Name ว่าอะไร ก็สามารถเปิด Google Play แล้วดู URL ของหน้านั้นๆได้เลย

Package Name สำคัญกว่าที่คิดนะ

เพราะ Package Name เป็นชื่อที่ระบบแอนดรอยด์ใช้ระบุแอปแต่ละตัว รวมไปถึง Google Play และ 3rd Party Service ต่างๆอย่าง Firebase ที่จะใช้ Package Name (เป็นส่วนหนึ่ง) เพื่อยืนยันแอปสำหรับใช้ Service นั้นๆได้

ดังนั้นการตั้ง Package Name ให้ไม่ซ้ำกับแอปอื่นๆที่มีอยู่แล้วจึงเป็นสิ่งที่ควรทำตั้งแต่ตอนสร้างโปรเจค และควรอิงตาม Best Practice ตามที่แอนดรอยด์แนะนำ เพื่อเลี่ยงปัญหาที่อาจจะเกิดจากการกำหนด Package Name ที่ไม่เหมาะสมได้ โดยใช้ Reverse Domain Name และเพิ่มคำอื่นๆที่สื่อความหมายสำหรับแอปนั้นๆต่อท้าย