สำหรับการเริ่มต้นเพื่อก้าวเข้าสู่การเป็นนักพัฒนา ก็จะต้องผ่านช่วงเวลาในการทำความเข้าใจเกี่ยวกับ Android Platform ควบคู่ไปกับการเขียนโค้ด และแน่นอนว่า Android Manifest ก็เป็นหนึ่งในเรื่องพื้นฐานสำคัญที่จะต้องเรียนรู้ด้วยเช่นกัน

Android Manifest มีไว้ทำอะไร?

Android Manifest เป็นไฟล์ที่เอาไว้อธิบายข้อมูลต่างที่เกี่ยวกับแอปนั้น ๆ ซึ่งจะถูกฝังไว้ในไฟล์​ APK ที่ใช้ติดตั้งแอปลงในเครื่อง ไม่ว่าจะเป็น

  • Package Name ของแอป
  • App Icon ที่จะแสดงให้ผู้ใช้เห็นในเครื่อง
  • Permission ที่แอปเรียกใช้งาน
  • App Component ที่มีทั้งหมดในแอป (Activity, Service, Broadcast Receiver และ Content Provider)
  • App Configuration ต่าง ๆ เพื่อกำหนดการทำงานของระบบแอนดรอยด์ตามที่ต้องการ
  • Device Configuration เพื่อบอกให้รู้ว่ารองรับอุปกรณ์แบบไหนบ้าง
  • Metadata ต่าง ๆ เพื่อเรียกใช้งานภายในแอปหรือแอปภายนอก
  • ฯลฯ

โดย Android Manifest จะมีข้อมูลเป็นแบบ XML และมีชื่อไฟล์เป็น AndroidManifest.xml เสมอ และแอปแต่ละตัวก็จะมี Android Manifest ได้เพียงแค่ไฟล์เดียวเท่านั้น

สำหรับโปรเจคที่เพิ่งสร้างขึ้นมาใหม่บน Android Studio ก็จะเห็น Android Manifest ที่มีการเตรียมข้อมูลบางอย่างไว้ให้แบบนี้

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.SleepingForLess">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

จากตัวอย่างข้างบนนี้ จะเห็นว่าสิ่งที่กำหนดไว้ใน Android Manifest จะมีดังนี้

ใน Manifest Tag

  • Package Name ของแอปนี้คือ com.akexorcist.sleepingforless

ใน Application Tag

  • android:allowBackup="..." เปิด/ปิดการ Backup ข้อมูลในแอป (ลองนึกถึงตอนย้ายเครื่อง ที่สามารถย้ายข้อมูลบางส่วนไปอยู่ในเครื่องใหม่ได้)
  • android:icon="..." ภาพที่ใช้เป็น App Icon แบบปกติ
  • android:roundIcon="..." ภาพที่ใช้เป็น App Icon แบบวงกลม
  • android:supportRtl="..." แอปรองรับการแสดงผลบน Right-to-Left หรือไม่
  • android:theme="..." Default Theme/Style ที่จะใช้กับ Activity ทั้งหมด (สามารถกำหนดแยก Activity ได้)

ใน Activity Tag

  • Activity ที่มีในแอปมีเพียงตัวเดียวคือ MainActivity
  • MainActivity สามารถเรียกใช้งานจากแอปภายนอกได้ เพราะกำหนด android:export="true" ไว้ (ใน Android 12 จะบังคับให้ใส่ไว้ เพื่อป้องกันแอปภายนอกเรียกใช้งาน App Component ที่ไม่ต้องการให้เรียกใช้งานจากภายนอก)
  • มี Intent Filter เพียงตัวเดียว และมีการกำหนด Action กับ Category ไว้
  • android.intent.action.MAIN เป็น Action ที่ทำให้รู้ว่า MainActivity คือตัวแรกสุดของแอป
  • android.intent.category.LAUNCHER เป็น Category ที่จะทำให้ระบบแอนดรอยด์สร้าง App Icon ไว้ที่ App Launcher ของเครื่อง แล้วเมื่อผู้ใช้กดเปิดแอปดังกล่าวก็จะเปิด Activity ดังกล่าวให้โดยทันที

ในระหว่างพัฒนาต้องทำอะไรบ้างหรือไม่?

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

  • เพื่อให้แอปสามารถใช้งานอินเตอร์เน็ตได้ จะต้องประกาศ Internet Permission ไว้ใน Android Manifest ด้วย
  • เพื่อใช้งาน Google Maps SDK ในแอป จะต้องประกาศ​ Metadata สำหรับ Google Maps SDK ไว้ใน Android Manifest ด้วย
  • ฯลฯ

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

Android Module แต่ละตัวในโปรเจคจะต้องมี Android Manifest อยู่ด้วยเสมอ

นอกเหนือจาก App Module ที่เป็น Module หลักของโปรเจคแล้ว เวลาสร้าง Library Module ที่เป็น Android Library ก็จะต้องมี Android Manifest ด้วยเช่นกัน

ในกรณีที่กดสร้าง Module ใน Android Studio ก็จะได้ Module ที่มี Android Manifest โดยให้อัตโนมัติ

อ้าว! ไหนบอกว่าแอปมี Android Manifest ได้เพียงแค่ไฟล์เดียวเท่านั้น?

ในระหว่างการพัฒนาแอป นักพัฒนาสามารถสร้าง Module ขึ้นมาเท่าไรก็ได้ เพื่อให้ทำงานได้ง่ายขึ้น รวมไปถึงการกำหนดค่าใน Android Manifest สำหรับแต่ละ Module ที่แตกต่างกันด้วย

และเมื่อนักพัฒนา Build APK จากโปรเจคดังกล่าว Android Manifest ที่อยู่ในแต่ละ Module จะถูกรวมเข้าด้วยกันเป็น Android Manifest เพียงไฟล์เดียวนั่นเอง

จึงทำให้เวลากดเปิดดูไฟล์ Android Manifest ใน Android Studio จะมีแถบ Merged Manifest ให้กดดูได้ว่าเมื่อ Android Manifest ถูกรวมเป็นไฟล์เดียวแล้วจะมีหน้าตาเป็นอย่างไร รวมไปถึงมีการบอกด้วยว่า Tag ไหนมาจาก Module หรือ Library ไหนด้วย

ข้อมูลใน Android Manifest เอาไปใช้ทำอะไรได้บ้าง

คนที่นำข้อมูลใน Android Manifest ไปใช้งานก็จะมีทั้งระบบแอนดรอยด์ที่จะต้องรู้ว่าแอปแต่ละตัวที่ติดตั้งในเครื่องมีข้อมูลอะไรบ้าง เช่น Activity ที่ระบบแอนดรอยด์สามารถเรียกใช้งานได้ หรือ Activity ในแอปตัวไหนที่รองรับการแชร์ข้อมูลรูปภาพ เป็นต้น

รวมไปถึง Android App Store อย่าง Google Play ที่จะอ่านข้อมูลใน Android Manifest เพื่อจัดหมวดหมู่และแสดงข้อมูลเกี่ยวกับแอปนั้น ๆ ให้ผู้ใช้เห็นในหน้าดาวน์โหลด เช่น Permission ที่ในแอปนี้ต้องการใช้งาน หรือแสดงเฉพาะแอปที่รองรับกับเครื่องของผู้ใช้แต่ละคน เป็นต้น

นอกจากนี้นักพัฒนาก็สามารถเขียนให้แอปของตัวเองเรียกข้อมูลเหล่านี้ได้เช่นกัน แต่ใน Android 11 ขึ้นไปจะให้ทำได้เฉพาะแอปบางประเภทเท่านั้น (เรียกกันว่า Package Visibility)

สรุป

Android Manifest เป็นไฟล์สำคัญที่แอปทุกตัวจะต้องมี เพราะเป็นไฟล์ที่จะอธิบายข้อมูลบางส่วนของแอปแต่ละตัวเพื่อบอกให้ระบบแอนดรอยด์รู้และสามารถทำงานที่กำหนดได้อย่างถูกต้อง และในขณะเดียวกัน Google Play ก็ใช้ข้อมูลเหล่านั้นเพื่อแสดงข้อมูลให้ผู้ใช้เห็น และสามารถรู้ได้ว่าแอปตัวไหนไม่รองรับกับเครื่องของผู้ใช้บ้าง เพื่อที่จะได้แสดงเฉพาะแอปที่สามารถใช้งานได้เท่านั้น

แหล่งข้อมูลเพิ่มเติม