<แอปพลิเคชัน>

ไวยากรณ์:
<application android:allowTaskReparenting=["true" | "false"]
             android:allowBackup=["true" | "false"]
             android:allowClearUserData=["true" | "false"]
             android:allowNativeHeapPointerTagging=["true" | "false"]
             android:appCategory=["accessibility" | "audio" | "game" |
             "image" | "maps" | "news" | "productivity" | "social" | "video"]
             android:backupAgent="string"
             android:backupInForeground=["true" | "false"]
             android:banner="drawable resource"
             android:dataExtractionRules="string resource"
             android:debuggable=["true" | "false"]
             android:description="string resource"
             android:enabled=["true" | "false"]
             android:enableOnBackInvokedCallback=["true" | "false"]
             android:extractNativeLibs=["true" | "false"]
             android:fullBackupContent="string"
             android:fullBackupOnly=["true" | "false"]
             android:gwpAsanMode=["always" | "never"]
             android:hasCode=["true" | "false"]
             android:hasFragileUserData=["true" | "false"]
             android:hardwareAccelerated=["true" | "false"]
             android:icon="drawable resource"
             android:isGame=["true" | "false"]
             android:isMonitoringTool=["parental_control" | "enterprise_management" |
             "other"]
             android:killAfterRestore=["true" | "false"]
             android:largeHeap=["true" | "false"]
             android:label="string resource"
             android:logo="drawable resource"
             android:manageSpaceActivity="string"
             android:name="string"
             android:networkSecurityConfig="xml resource"
             android:permission="string"
             android:persistent=["true" | "false"]
             android:process="string"
             android:restoreAnyVersion=["true" | "false"]
             android:requestLegacyExternalStorage=["true" | "false"]
             android:requiredAccountType="string"
             android:resizeableActivity=["true" | "false"]
             android:restrictedAccountType="string"
             android:supportsRtl=["true" | "false"]
             android:taskAffinity="string"
             android:testOnly=["true" | "false"]
             android:theme="resource or theme"
             android:uiOptions=["none" | "splitActionBarWhenNarrow"]
             android:usesCleartextTraffic=["true" | "false"]
             android:vmSafeMode=["true" | "false"] >
    . . .
</application>
มีอยู่ใน
<manifest>
อาจมีข้อมูลต่อไปนี้
<activity>
<activity-alias>
<meta-data>
<service>
<receiver>
<profileable>
<provider>
<uses-library>
<uses-native-library>
คำอธิบาย:

การประกาศของแอปพลิเคชัน องค์ประกอบนี้มีองค์ประกอบย่อย ที่ประกาศคอมโพเนนต์แต่ละรายการของแอปพลิเคชัน และมีแอตทริบิวต์ ที่อาจส่งผลต่อคอมโพเนนต์ทั้งหมด

แอตทริบิวต์เหล่านี้หลายรายการ เช่น icon, label, permission, process, taskAffinity และ allowTaskReparenting จะตั้งค่าเริ่มต้นสำหรับแอตทริบิวต์ที่เกี่ยวข้องขององค์ประกอบคอมโพเนนต์ ส่วนอื่นๆ เช่น debuggable, enabled, description และ allowClearUserData จะตั้งค่าสำหรับแอปพลิเคชันโดยรวมและ จะไม่ถูกแทนที่ด้วยคอมโพเนนต์

แอตทริบิวต์
android:allowTaskReparenting
กิจกรรมที่แอปพลิเคชันกำหนดจะย้ายจาก งานที่เริ่มต้นกิจกรรมไปยังงานที่กิจกรรมมีความเกี่ยวข้องได้หรือไม่เมื่อมีการนำงานนั้น มาไว้ด้านหน้าในครั้งถัดไป "true" หากย้ายได้ และ "false" หากต้องอยู่กับงานที่เริ่ม ค่าเริ่มต้นคือ "false"

องค์ประกอบ <activity> มีแอตทริบิวต์ allowTaskReparenting ของตัวเองซึ่งสามารถลบล้างค่าที่ตั้งไว้ที่นี่ได้

android:allowBackup

ว่าจะอนุญาตให้แอปพลิเคชันเข้าร่วมโครงสร้างพื้นฐานการสำรอง และกู้คืนข้อมูลหรือไม่ หากตั้งค่าแอตทริบิวต์นี้เป็น "false" ระบบจะไม่สำรองข้อมูลหรือกู้คืนแอปพลิเคชันเลย แม้ว่าจะเป็นการสำรองข้อมูลทั้งระบบที่ทำให้ระบบบันทึกข้อมูลแอปพลิเคชันทั้งหมดโดยใช้ adb ก็ตาม ค่าเริ่มต้นของแอตทริบิวต์นี้คือ "true"

หมายเหตุ: สําหรับแอปที่กําหนดเป้าหมายเป็น Android 12 (ระดับ API 31) ขึ้นไป ลักษณะการทํางานนี้ จะแตกต่างกัน ในอุปกรณ์จากผู้ผลิตอุปกรณ์บางราย คุณจะปิดใช้การย้ายข้อมูลจากอุปกรณ์หนึ่งไปยังอีกอุปกรณ์หนึ่ง ของไฟล์แอปไม่ได้

อย่างไรก็ตาม คุณสามารถปิดใช้การสำรองข้อมูลและการกู้คืนไฟล์ของแอปในระบบคลาวด์ได้โดยการตั้งค่า แอตทริบิวต์นี้เป็น "false" แม้ว่าแอปจะกำหนดเป้าหมายเป็น Android 12 (ระดับ API 31) ขึ้นไปก็ตาม

ดูข้อมูลเพิ่มเติมได้ที่ส่วนสำรองและกู้คืน ของหน้าเว็บที่อธิบายการเปลี่ยนแปลงลักษณะการทำงานของแอปที่กำหนดเป้าหมายเป็น Android 12 (ระดับ API 31) ขึ้นไป

android:allowClearUserData

จะอนุญาตให้แอปพลิเคชันรีเซ็ตข้อมูลผู้ใช้หรือไม่ ข้อมูลนี้รวมถึง แฟล็ก เช่น ผู้ใช้เคยเห็นเคล็ดลับเครื่องมือเบื้องต้นหรือไม่ รวมถึงการตั้งค่าและความชอบที่ผู้ใช้ปรับแต่งได้ ค่าเริ่มต้นของแอตทริบิวต์นี้คือ "true"

หมายเหตุ: เฉพาะแอปที่เป็นส่วนหนึ่งของอิมเมจระบบเท่านั้นที่สามารถประกาศแอตทริบิวต์นี้อย่างชัดเจนได้ แอปของบุคคลที่สามจะรวมแอตทริบิวต์นี้ไว้ในไฟล์ Manifest ไม่ได้

ดูข้อมูลเพิ่มเติมได้ที่ภาพรวมการสำรองข้อมูล

android:allowNativeHeapPointerTagging

แอปเปิดใช้ฟีเจอร์การติดแท็กตัวชี้ฮีปหรือไม่ ค่าเริ่มต้นของ แอตทริบิวต์นี้คือ "true"

หมายเหตุ: การปิดใช้ฟีเจอร์นี้ไม่ได้แก้ปัญหาความสมบูรณ์ของโค้ดพื้นฐาน อุปกรณ์ฮาร์ดแวร์ในอนาคตอาจไม่รองรับแท็ก Manifest นี้

ดูข้อมูลเพิ่มเติมได้ที่ตัวชี้ที่ติดแท็ก

android:appCategory

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

ต้องเป็นค่าคงที่ค่าใดค่าหนึ่งต่อไปนี้

ค่าคำอธิบาย
accessibilityแอปที่เป็นแอปการช่วยเหลือพิเศษเป็นหลัก เช่น โปรแกรมอ่านหน้าจอ
audioแอปที่ทำงานกับเสียงหรือเพลงเป็นหลัก เช่น เครื่องเล่นเพลง
gameแอปที่เป็นเกมเป็นหลัก
imageแอปที่ทำงานกับรูปภาพเป็นหลัก เช่น แอปกล้องหรือแกลเลอรี
mapsแอปที่เป็นแอปแผนที่เป็นหลัก เช่น แอปนำทาง
newsแอปที่เป็นแอปข่าวเป็นหลัก เช่น แอปหนังสือพิมพ์ นิตยสาร หรือแอปกีฬา
productivityแอปที่เน้นการเพิ่มประสิทธิภาพเป็นหลัก เช่น แอปพื้นที่เก็บข้อมูลระบบคลาวด์หรือแอปในที่ทำงาน
socialแอปที่เป็นแอปโซเชียลเป็นหลัก เช่น แอปส่งข้อความ การสื่อสาร อีเมล หรือเครือข่ายสังคม
videoแอปที่ทำงานกับวิดีโอหรือภาพยนตร์เป็นหลัก เช่น แอปวิดีโอสตรีมมิง

android:backupAgent
ชื่อของคลาสที่ใช้ตัวแทนการสำรองข้อมูลของแอปพลิเคชัน ซึ่งเป็นคลาสย่อยของ BackupAgent ค่าแอตทริบิวต์คือ ชื่อคลาสที่สมบูรณ์ในตัวเอง เช่น "com.example.project.MyBackupAgent" อย่างไรก็ตาม ในรูปแบบย่อ หากอักขระแรกของชื่อเป็นจุด เช่น ".MyBackupAgent" ระบบจะต่อท้ายชื่อแพ็กเกจที่ระบุในองค์ประกอบ <manifest>

ไม่มีค่าเริ่มต้น ชื่อต้องเฉพาะเจาะจง

android:backupInForeground
ระบุว่าการดำเนินการสำรองข้อมูลอัตโนมัติ สามารถทำได้ในแอปนี้แม้ว่าแอปจะอยู่ในสถานะเทียบเท่ากับเบื้องหน้า ก็ตาม ระบบจะปิดแอปในระหว่างการดำเนินการสำรองข้อมูลอัตโนมัติ ดังนั้นโปรดใช้แอตทริบิวต์นี้ด้วยความระมัดระวัง การตั้งค่าสถานะนี้เป็น "true" อาจส่งผลต่อลักษณะการทำงานของแอป ขณะที่แอปทำงานอยู่

ค่าเริ่มต้นคือ "false" ซึ่งหมายความว่าระบบปฏิบัติการจะไม่สำรองข้อมูลแอปขณะที่แอปทำงานอยู่เบื้องหน้า เช่น แอปเพลงที่กำลังเล่นเพลงโดยใช้บริการในสถานะ startForeground()

android:banner
ทรัพยากร Drawable ซึ่งมีแบนเนอร์กราฟิกแบบขยายสำหรับรายการที่เชื่อมโยง ใช้กับแท็ก <application> เพื่อระบุแบนเนอร์เริ่มต้นสำหรับกิจกรรมทั้งหมดของแอปพลิเคชัน หรือใช้กับแท็ก <activity> เพื่อระบุแบนเนอร์สำหรับกิจกรรมที่เฉพาะเจาะจง

ระบบใช้แบนเนอร์เพื่อแสดงแอปใน หน้าจอหลักของ Android TV ดังนั้น ให้ระบุเฉพาะแอปพลิเคชันที่มีกิจกรรมที่จัดการ Intent CATEGORY_LEANBACK_LAUNCHER

แอตทริบิวต์นี้ตั้งค่าเป็นการอ้างอิงไปยังทรัพยากรที่วาดได้ซึ่งมีรูปภาพ เช่น "@drawable/banner" ไม่มีแบนเนอร์เริ่มต้น

ดูข้อมูลเพิ่มเติมได้ที่ ระบุแบนเนอร์หน้าจอหลัก

android:dataExtractionRules

แอปพลิเคชันสามารถตั้งค่าแอตทริบิวต์นี้เป็นทรัพยากร XML ที่ระบุกฎซึ่งกำหนดว่าไฟล์และไดเรกทอรีใดที่สามารถคัดลอกจากอุปกรณ์เป็นส่วนหนึ่งของการสำรองข้อมูลหรือการโอนได้

ดูข้อมูลเกี่ยวกับรูปแบบของไฟล์ XML ได้ที่การสำรองและกู้คืนข้อมูล

android:debuggable
ไม่ว่าจะแก้ไขข้อบกพร่องของแอปพลิเคชันได้หรือไม่ แม้ว่าจะทำงาน ในอุปกรณ์ในโหมดผู้ใช้ก็ตาม "true" หากทำได้และ "false" หากทำไม่ได้ ค่าเริ่มต้นคือ "false"
android:description
ข้อความที่ผู้ใช้อ่านได้เกี่ยวกับแอปพลิเคชัน ซึ่งยาวและสื่อความหมายมากกว่าป้ายกำกับของแอปพลิเคชัน ค่านี้จะตั้งเป็นข้อมูลอ้างอิงถึงทรัพยากรสตริง แต่จะใช้สตริงดิบไม่ได้เหมือนป้ายกำกับ ไม่มีค่าเริ่มต้น
android:enabled
ไม่ว่าระบบ Android จะสร้างอินสแตนซ์ของคอมโพเนนต์ของ แอปพลิเคชันได้หรือไม่ "true" หากทำได้และ "false" หากทำไม่ได้ หากค่าเป็น "true" แอตทริบิวต์ enabledของแต่ละคอมโพเนนต์จะกำหนดว่าคอมโพเนนต์นั้นเปิดใช้อยู่หรือไม่ หากค่าเป็น "false" ค่านี้จะลบล้างค่าเฉพาะคอมโพเนนต์ และระบบจะปิดใช้คอมโพเนนต์ทั้งหมด

ค่าเริ่มต้นคือ "true"

android:enableOnBackInvokedCallback

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

ตั้งค่า android:enableOnBackInvokedCallback=false เพื่อปิดภาพเคลื่อนไหวของการย้อนกลับที่คาดการณ์ได้ที่ระดับแอป และสั่งให้ระบบไม่สนใจการเรียกใช้ API ของแพลตฟอร์ม OnBackInvokedCallback

android:extractNativeLibs

ตั้งแต่ AGP 4.2.0 เป็นต้นไป ตัวเลือก DSL useLegacyPackaging จะแทนที่แอตทริบิวต์ไฟล์ Manifest ของ extractNativeLibs ใช้ useLegacyPackaging ในไฟล์ build.gradle ของแอป แทน extractNativeLibs ในไฟล์ Manifest เพื่อกำหนดค่าลักษณะการทำงานของการบีบอัด ไลบรารีแบบเนทีฟ ดูข้อมูลเพิ่มเติมได้ที่บันทึกประจำรุ่น ใช้ DSL เพื่อแพ็กเกจไลบรารีเนทีฟที่บีบอัด

แอตทริบิวต์นี้ระบุว่าโปรแกรมติดตั้งแพ็กเกจจะแยกไลบรารีเนทีฟจาก APK ไปยังระบบไฟล์หรือไม่ หากตั้งค่าเป็น "false" ระบบจะจัดเก็บไลบรารีแบบเนทีฟ ที่ไม่ได้บีบอัดใน APK แม้ว่า APK อาจมีขนาดใหญ่ขึ้น แต่แอปพลิเคชันจะโหลดเร็วขึ้น เนื่องจากไลบรารีจะโหลดจาก APK โดยตรงในขณะรันไทม์

ค่าเริ่มต้นของ extractNativeLibs จะขึ้นอยู่กับ minSdkVersion และ เวอร์ชันของ AGP ที่คุณใช้ ในกรณีส่วนใหญ่ ลักษณะการทำงานเริ่มต้นอาจเป็นสิ่งที่คุณต้องการ และ คุณไม่จำเป็นต้องตั้งค่าแอตทริบิวต์นี้อย่างชัดเจน

android:fullBackupContent
แอตทริบิวต์นี้ชี้ไปยังไฟล์ XML ที่มีกฎการสำรองข้อมูลแบบเต็มสำหรับ การสำรองข้อมูลอัตโนมัติ กฎเหล่านี้จะกำหนดว่าไฟล์ใดจะได้รับการสำรองข้อมูล ดูข้อมูลเพิ่มเติมได้ที่ ไวยากรณ์การกำหนดค่า XML สำหรับการสำรองข้อมูลอัตโนมัติ

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

android:fullBackupOnly
แอตทริบิวต์นี้จะระบุว่าจะใช้การสำรองข้อมูลอัตโนมัติในอุปกรณ์ ที่ฟีเจอร์นี้พร้อมให้บริการหรือไม่ หากตั้งค่าเป็น "true" แอปจะทำการสำรองข้อมูลอัตโนมัติเมื่อติดตั้งในอุปกรณ์ที่ใช้ Android 6.0 (ระดับ API 23) ขึ้นไป ในอุปกรณ์รุ่นเก่า แอปจะละเว้นแอตทริบิวต์นี้และดำเนินการการสำรองข้อมูลคีย์/ค่า

ค่าเริ่มต้นคือ "false"

android:gwpAsanMode
แอตทริบิวต์นี้จะระบุว่าจะใช้ GWP-ASan ซึ่งเป็นฟีเจอร์ตัวจัดสรรหน่วยความจำของระบบที่ช่วยค้นหาข้อบกพร่องของการใช้งานหลังช่วงใช้ฟรี (Use After Free) และบัฟเฟอร์ล้นฮีป (Heap Buffer Overflow) หรือไม่

ค่าเริ่มต้นคือ "never"

android:hasCode
แอปพลิเคชันมีโค้ด DEX หรือไม่ ซึ่งก็คือโค้ดที่ใช้ภาษาโปรแกรม Kotlin หรือ Java โดยจะแสดงเป็น "true" หากมี และ "false" หากไม่มี เมื่อ ค่าเป็น "false" ระบบจะไม่พยายามโหลดโค้ดแอปพลิเคชัน ใดๆ เมื่อเปิดใช้คอมโพเนนต์ ค่าเริ่มต้นคือ "true"

หากแอปพลิเคชันมีโค้ดเนทีฟ (C/C++) แต่ไม่มีโค้ด DEX คุณควรตั้งค่าเป็น "false" หากตั้งค่าเป็น "true" เมื่อ APK ไม่มีโค้ด DEX แอปอาจโหลดไม่สำเร็จ

พร็อพเพอร์ตี้นี้ต้องพิจารณาโค้ดที่รวมอยู่ในแอปพลิเคชันโดย การอ้างอิง หากแอปพลิเคชันขึ้นอยู่กับ AAR ที่ใช้โค้ด Java/Kotlin หรือขึ้นอยู่กับ JAR โดยตรง app:hasCode ต้องเป็น "true" หรือละเว้นเนื่องจากเป็นค่าเริ่มต้น

เช่น แอปอาจรองรับการนำส่งฟีเจอร์ Play และมีโมดูลฟีเจอร์ที่ไม่สร้างไฟล์ DEX ซึ่งเป็นไบต์โค้ดที่เพิ่มประสิทธิภาพสำหรับแพลตฟอร์ม Android หากเป็นเช่นนั้น คุณต้องตั้งค่าพร็อพเพอร์ตี้นี้เป็น "false" ในไฟล์ Manifest ของโมดูล เพื่อหลีกเลี่ยงข้อผิดพลาดขณะรันไทม์

android:hasFragileUserData
ว่าจะแสดงข้อความแจ้งให้ผู้ใช้ เก็บข้อมูลของแอปไว้เมื่อผู้ใช้ถอนการติดตั้งแอปหรือไม่ ค่าเริ่มต้นคือ "false"
android:hardwareAccelerated
ไม่ว่าจะเปิดใช้การแสดงผลที่มีการเร่งด้วยฮาร์ดแวร์สำหรับกิจกรรมและมุมมองทั้งหมดในแอปพลิเคชันนี้หรือไม่ โดยจะเป็น "true" หากเปิดใช้ และ "false" หากไม่ได้เปิดใช้ ค่าเริ่มต้นคือ "true" หากคุณตั้งค่า minSdkVersion หรือ targetSdkVersion เป็น "14" ขึ้นไป มิเช่นนั้นจะเป็น "false"

ตั้งแต่ Android 3.0 (ระดับ API 11) เป็นต้นไป แอปพลิเคชันจะใช้ตัวแสดงผล OpenGL ที่เร่งด้วยฮาร์ดแวร์ได้เพื่อปรับปรุงประสิทธิภาพสำหรับการดำเนินการกราฟิก 2 มิติทั่วไปหลายอย่าง เมื่อเปิดใช้โปรแกรมแสดงผลที่เร่งด้วยฮาร์ดแวร์ ระบบจะเร่งการทำงานส่วนใหญ่ ใน Canvas, Paint, Xfermode, ColorFilter, Shader และ Camera

ซึ่งจะส่งผลให้ภาพเคลื่อนไหวและการเลื่อนราบรื่นขึ้น รวมถึงการตอบสนองโดยรวมดีขึ้น แม้แต่สำหรับแอปพลิเคชันที่ไม่ได้ใช้ไลบรารี OpenGL ของเฟรมเวิร์กอย่างชัดแจ้ง

การดำเนินการ 2 มิติของ OpenGL บางอย่างอาจไม่ได้รับการเร่งความเร็ว หากเปิดใช้ โปรแกรมแสดงผลที่เร่งด้วยฮาร์ดแวร์ ให้ทดสอบแอปพลิเคชันเพื่อให้ ใช้โปรแกรมแสดงผลได้โดยไม่มีข้อผิดพลาด

ดูข้อมูลเพิ่มเติมได้ในคู่มือการเร่งด้วยฮาร์ดแวร์

android:icon
ไอคอนสำหรับแอปพลิเคชันโดยรวมและไอคอนเริ่มต้นสำหรับ คอมโพเนนต์แต่ละรายการของแอปพลิเคชัน ดูแอตทริบิวต์ icon แต่ละรายการสำหรับองค์ประกอบ <activity>, <activity-alias>, <service>, <receiver> และ <provider>

แอตทริบิวต์นี้ตั้งค่าเป็นการอ้างอิงไปยังทรัพยากรที่วาดได้ซึ่งมีรูปภาพ เช่น "@drawable/icon" ไม่มีไอคอนเริ่มต้น

android:isGame
ระบุว่าแอปพลิเคชันเป็นเกมหรือไม่ ระบบอาจจัดกลุ่มแอปพลิเคชันที่จัดประเภทเป็นเกมไว้ด้วยกัน หรือแสดงแยกจากแอปพลิเคชันอื่นๆ ค่าเริ่มต้นคือ "false"
android:isMonitoringTool

ระบุว่าแอปพลิเคชันนี้ออกแบบมาเพื่อตรวจสอบบุคคลอื่น

หมายเหตุ: หากแอปประกาศแอตทริบิวต์นี้ในไฟล์ Manifest นักพัฒนาแอปต้อง ปฏิบัติตามนโยบายสตอล์กเกอร์แวร์ เพื่อเผยแพร่แอปไปยัง Google Play

ไม่มีค่าเริ่มต้น นักพัฒนาแอปต้องระบุค่าใดค่าหนึ่งต่อไปนี้

ค่าคำอธิบาย
"parental_control"แอป รองรับการควบคุมโดยผู้ปกครองและกำหนดเป้าหมายไปยังผู้ปกครองที่ต้องการดูแลบุตรหลานให้ปลอดภัยโดยเฉพาะ
"enterprise_management"แอป รองรับองค์กรที่ต้องการจัดการและติดตามอุปกรณ์ที่มอบให้แก่พนักงาน
"other"แอปมีไว้สำหรับกรณีการใช้งาน ที่ไม่ได้ระบุไว้ในตารางนี้
android:killAfterRestore

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

ค่าเริ่มต้นคือ "true" ซึ่งหมายความว่าหลังจากที่แอปพลิเคชัน ประมวลผลข้อมูลเสร็จสิ้นในระหว่างการกู้คืนทั้งระบบแล้ว แอปพลิเคชันจะสิ้นสุด

android:largeHeap

ไม่ว่ากระบวนการของแอปพลิเคชันจะสร้างขึ้นด้วยฮีป Dalvik ขนาดใหญ่หรือไม่ ซึ่งจะมีผลกับ กระบวนการทั้งหมดที่สร้างขึ้นสำหรับแอปพลิเคชัน โดยจะมีผลกับแอปพลิเคชันแรกที่โหลดลงในกระบวนการเท่านั้น หากคุณใช้รหัสผู้ใช้ที่แชร์เพื่อให้แอปพลิเคชันหลายรายการใช้กระบวนการเดียวกัน แอปพลิเคชันทั้งหมด ต้องใช้อุปกรณ์นี้อย่างสม่ำเสมอเพื่อหลีกเลี่ยงผลลัพธ์ที่คาดเดาไม่ได้

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

หากต้องการค้นหาขนาดหน่วยความจำที่พร้อมใช้งานในรันไทม์ ให้ใช้วิธีการ getMemoryClass() หรือ getLargeMemoryClass()

android:label
ป้ายกำกับที่ผู้ใช้อ่านได้สำหรับแอปพลิเคชันโดยรวมและป้ายกำกับเริ่มต้น สำหรับคอมโพเนนต์แต่ละรายการของแอปพลิเคชัน ดูแอตทริบิวต์ label แต่ละรายการสำหรับองค์ประกอบ <activity>, <activity-alias>, <service>, <receiver> และ <provider>

ป้ายกำกับจะตั้งค่าเป็นข้อมูลอ้างอิงไปยังทรัพยากรสตริง เพื่อให้ แปลเป็นภาษาท้องถิ่นได้เหมือนสตริงอื่นๆ ในอินเทอร์เฟซผู้ใช้ อย่างไรก็ตาม เพื่อความสะดวกในขณะที่คุณกำลังพัฒนาแอปพลิเคชัน คุณยังตั้งค่าเป็นสตริงดิบได้ด้วย

android:logo
โลโก้สำหรับแอปพลิเคชันโดยรวมและโลโก้เริ่มต้นสำหรับกิจกรรม แอตทริบิวต์นี้ตั้งค่าเป็นการอ้างอิงไปยังทรัพยากรที่วาดได้ซึ่งมีรูปภาพ เช่น "@drawable/logo" ไม่มีโลโก้เริ่มต้น
android:manageSpaceActivity
ชื่อที่สมบูรณ์ในตัวเองของคลาสย่อย Activity ที่ระบบเปิดใช้เพื่อให้ผู้ใช้จัดการหน่วยความจำที่แอปพลิเคชันใช้ในอุปกรณ์ได้ นอกจากนี้ยังมีการประกาศกิจกรรมด้วยองค์ประกอบ <activity>
android:name
ชื่อที่สมบูรณ์ในตัวเองของApplicationคลาสย่อยที่ใช้สำหรับแอปพลิเคชัน เมื่อเริ่มกระบวนการสมัคร ระบบจะสร้างอินสแตนซ์ของคลาสนี้ก่อนคอมโพเนนต์ใดๆ ของแอปพลิเคชัน

โดยคุณจะระบุคลาสย่อยหรือไม่ก็ได้ แอปพลิเคชันส่วนใหญ่ไม่จำเป็นต้องมี หากไม่มีคลาสย่อย Android จะใช้อินสแตนซ์ของคลาสฐาน Application

android:networkSecurityConfig

ระบุชื่อของไฟล์ XML ที่มีการกำหนดค่าความปลอดภัยของเครือข่ายของแอปพลิเคชัน ค่านี้เป็นการอ้างอิงไปยังไฟล์ทรัพยากร XML ที่มีการกำหนดค่า

แอตทริบิวต์นี้เพิ่มในระดับ API 24

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับสิทธิ์ได้ที่ส่วนสิทธิ์ในภาพรวมของไฟล์ Manifest ของแอปและเคล็ดลับด้านความปลอดภัย

android:persistent
แอปพลิเคชันจะทำงานอยู่ตลอดเวลาหรือไม่ "true" หากมีและ "false" หากไม่มี ค่าเริ่มต้นคือ "false" โดยปกติแล้วแอปพลิเคชันจะไม่ตั้งค่าสถานะนี้ โหมดคงอยู่มีไว้สำหรับแอปพลิเคชันระบบบางอย่างเท่านั้น
android:process
ชื่อของกระบวนการที่คอมโพเนนต์ทั้งหมดของแอปพลิเคชันทำงาน คอมโพเนนต์แต่ละรายการจะลบล้างค่าเริ่มต้นนี้ได้โดยการตั้งค่าprocess แอตทริบิวต์ของตัวเอง

โดยค่าเริ่มต้น Android จะสร้างกระบวนการสำหรับแอปพลิเคชันเมื่อคอมโพเนนต์แรก ของแอปพลิเคชันนั้นต้องทำงาน จากนั้นคอมโพเนนต์ทั้งหมดจะทำงานในกระบวนการนั้น ชื่อของกระบวนการเริ่มต้นจะตรงกับชื่อแพ็กเกจที่ตั้งค่าโดยองค์ประกอบ <manifest>

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

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

android:restoreAnyVersion
ระบุว่าแอปพลิเคชันพร้อมที่จะพยายามกู้คืนชุดข้อมูลที่สำรองไว้ แม้ว่าการสำรองข้อมูลจะจัดเก็บโดยแอปพลิเคชันเวอร์ชันใหม่กว่า ที่ติดตั้งอยู่ในอุปกรณ์ในปัจจุบันก็ตาม การตั้งค่าแอตทริบิวต์นี้เป็น "true" จะช่วยให้ Backup Manager
  • $1
  • พยายามกู้คืนแม้ว่าเวอร์ชันจะไม่ตรงกันซึ่งบ่งชี้ว่าข้อมูล เข้ากันไม่ได้ โปรดใช้ด้วยความระมัดระวัง

    ค่าเริ่มต้นของแอตทริบิวต์นี้คือ "false"

    android:requestLegacyExternalStorage

    แอปพลิเคชันต้องการเลือกไม่ใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขตหรือไม่

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

    android:requiredAccountType
    ระบุประเภทบัญชีที่แอปพลิเคชันต้องใช้ในการทำงาน หากแอปของคุณต้องใช้ Account ค่าของแอตทริบิวต์นี้ต้อง สอดคล้องกับประเภทโปรแกรมตรวจสอบสิทธิ์ของบัญชี ที่แอปของคุณใช้ตามที่กำหนดโดย AuthenticatorDescription เช่น "com.google"

    ค่าเริ่มต้นคือ null และบ่งบอกว่าแอปพลิเคชันสามารถทำงานโดยไม่มีบัญชีใดๆ ได้

    เนื่องจากโปรไฟล์ที่จำกัด เพิ่มบัญชีไม่ได้ การระบุแอตทริบิวต์นี้จะทำให้แอปของคุณ ไม่พร้อมใช้งานจากโปรไฟล์ที่จำกัด เว้นแต่คุณจะประกาศ android:restrictedAccountType ด้วย ค่าเดียวกันด้วย

    ข้อควรระวัง: หากข้อมูลบัญชีอาจเปิดเผยข้อมูลส่วนบุคคลที่ระบุตัวบุคคลนั้นได้ คุณต้อง ประกาศแอตทริบิวต์นี้และปล่อยให้ android:restrictedAccountType เป็นค่าว่าง เพื่อไม่ให้โปรไฟล์ที่จำกัดใช้ แอปของคุณเพื่อเข้าถึงข้อมูลส่วนบุคคลที่เป็นของผู้ใช้เจ้าของ

    แอตทริบิวต์นี้เพิ่มเข้ามาในระดับ API 18

    android:resizeableActivity

    ระบุว่าแอปจะรองรับโหมดหลายหน้าต่างหรือไม่

    คุณตั้งค่าแอตทริบิวต์นี้ได้ในองค์ประกอบ <activity> หรือ <application>

    หากตั้งค่าแอตทริบิวต์นี้เป็น "true" ผู้ใช้จะเปิดกิจกรรมใน โหมดแยกหน้าจอและโหมดอิสระได้ หากคุณตั้งค่าแอตทริบิวต์เป็น "false" คุณจะทดสอบหรือเพิ่มประสิทธิภาพแอป สำหรับสภาพแวดล้อมแบบหลายหน้าต่างไม่ได้ ระบบยังคง ใส่กิจกรรมในโหมดหลายหน้าต่างได้โดยใช้โหมดความเข้ากันได้

    การตั้งค่าแอตทริบิวต์นี้เป็น "true" ไม่ได้เป็นการรับประกันว่าจะไม่มี แอปอื่นๆ ในโหมดหลายหน้าต่างที่มองเห็นได้บนหน้าจอ เช่น การแสดงภาพซ้อนภาพ หรือ บนจอแสดงผลอื่นๆ ดังนั้น การตั้งค่าแฟล็กนี้ไม่ได้หมายความว่าแอปของคุณ มีสิทธิ์เข้าถึงทรัพยากรแบบพิเศษ

    สำหรับแอปที่กำหนดเป้าหมายเป็น API ระดับ 24 ขึ้นไป ค่าเริ่มต้นคือ "true"

    หากแอปกำหนดเป้าหมายเป็น API ระดับ 31 ขึ้นไป แอตทริบิวต์นี้จะทำงานแตกต่างกันในหน้าจอขนาดเล็กและขนาดใหญ่ ดังนี้

    • หน้าจอขนาดใหญ่ (sw >= 600dp): แอปทั้งหมดรองรับโหมดหลายหน้าต่าง แอตทริบิวต์จะระบุว่า แอปปรับขนาดได้หรือไม่ ไม่ใช่ว่าแอปนั้นรองรับโหมดหลายหน้าต่างหรือไม่ หาก resizeableActivity="false" ระบบจะเปลี่ยนแอปเป็นโหมดความเข้ากันได้เมื่อจำเป็นเพื่อให้เป็นไปตามขนาดการแสดงผล
    • หน้าจอขนาดเล็ก (sw < 600dp): หาก resizeableActivity="true" และความกว้างขั้นต่ำ และความสูงขั้นต่ำของกิจกรรมหลักเป็นไปตามข้อกำหนดของโหมดหลายหน้าต่าง แอปจะรองรับโหมดหลายหน้าต่าง หากเป็น resizeableActivity="false" แอปจะไม่รองรับโหมดหลายหน้าต่างไม่ว่าความกว้างและความสูงขั้นต่ำของกิจกรรมจะเป็นเท่าใดก็ตาม

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

    แอตทริบิวต์นี้เพิ่มในระดับ API 24

    android:restrictedAccountType
    ระบุประเภทบัญชีที่แอปพลิเคชันนี้ต้องการ และระบุว่าโปรไฟล์ที่ถูกจำกัด สามารถเข้าถึงบัญชีดังกล่าวที่เป็นของผู้ใช้เจ้าของได้ หากแอปของคุณต้องใช้ Account และโปรไฟล์ที่จำกัดสามารถเข้าถึงบัญชีของผู้ใช้หลัก ค่าของแอตทริบิวต์นี้ต้องสอดคล้องกับประเภทโปรแกรมตรวจสอบสิทธิ์ของบัญชีที่แอปใช้ตามที่กำหนดโดย AuthenticatorDescription เช่น "com.google"

    ค่าเริ่มต้นคือ null และบ่งบอกว่าแอปพลิเคชันสามารถทำงานโดยไม่มีบัญชีใดๆ ได้

    ข้อควรระวัง: การระบุแอตทริบิวต์นี้จะทำให้โปรไฟล์ที่จำกัดใช้แอปของคุณกับบัญชีที่เป็นของผู้ใช้เจ้าของได้ ซึ่งอาจเปิดเผยข้อมูลส่วนบุคคลที่ระบุตัวบุคคลนั้นได้ หากบัญชีอาจเปิดเผยรายละเอียดส่วนบุคคล อย่า ใช้แอตทริบิวต์นี้ ให้ประกาศแอตทริบิวต์ android:requiredAccountType แทน เพื่อทำให้แอปไม่พร้อมให้บริการในโปรไฟล์ที่จำกัด

    แอตทริบิวต์นี้เพิ่มเข้ามาในระดับ API 18

    android:supportsRtl

    ประกาศว่าแอปพลิเคชันของคุณพร้อมรองรับเลย์เอาต์แบบอ่านจากขวาไปซ้าย (RTL) หรือไม่

    หากตั้งค่าเป็น "true" และ targetSdkVersion ตั้งค่าเป็น 17 ขึ้นไป ระบบจะเปิดใช้งานและใช้ API ต่างๆ ของ RTL เพื่อให้แอปแสดงเลย์เอาต์ RTL ได้ หากตั้งค่าเป็น "false" หรือหากตั้งค่า targetSdkVersion เป็น 16 หรือต่ำกว่า ระบบจะละเว้น RTL API หรือไม่มีผล และแอปจะทํางานเหมือนเดิมไม่ว่าเลย์เอาต์จะเชื่อมโยงกับตัวเลือกภาษาของผู้ใช้หรือไม่ก็ตาม กล่าวคือ เลย์เอาต์ของคุณจะอยู่จากซ้ายไปขวาเสมอ

    ค่าเริ่มต้นของแอตทริบิวต์นี้คือ "false"

    แอตทริบิวต์นี้เพิ่มเข้ามาในระดับ API 17

    android:taskAffinity
    ชื่อความสัมพันธ์ที่ใช้กับกิจกรรมทั้งหมดภายในแอปพลิเคชัน ยกเว้นกิจกรรมที่ตั้งค่าความสัมพันธ์อื่นด้วยแอตทริบิวต์ของตัวเอง taskAffinity ดูข้อมูลเพิ่มเติมได้ที่แอตทริบิวต์ดังกล่าว

    โดยค่าเริ่มต้น กิจกรรมทั้งหมดภายในแอปพลิเคชันจะมีความสัมพันธ์เดียวกัน ชื่อของความสัมพันธ์นั้นจะเหมือนกับชื่อแพ็กเกจที่ตั้งค่าโดยองค์ประกอบ <manifest>

    android:testOnly
    ระบุว่าแอปพลิเคชันนี้มีไว้เพื่อการทดสอบเท่านั้นหรือไม่ เช่น อาจเปิดเผยฟังก์ชันการทำงานหรือข้อมูลภายนอกตัวเองซึ่งอาจทำให้เกิดช่องโหว่ด้านความปลอดภัย แต่มีประโยชน์สำหรับการทดสอบ APK ประเภทนี้จะติดตั้งได้ผ่าน adb เท่านั้น คุณเผยแพร่ไปยัง Google Play ไม่ได้

    Android Studio จะเพิ่มแอตทริบิวต์นี้โดยอัตโนมัติเมื่อคุณคลิกเรียกใช้

    android:theme
    การอ้างอิงถึงทรัพยากรรูปแบบที่กำหนดธีมเริ่มต้นสำหรับกิจกรรมทั้งหมด ในแอปพลิเคชัน กิจกรรมแต่ละรายการสามารถลบล้างค่าเริ่มต้นได้โดยการตั้งค่าแอตทริบิวต์ theme ของตนเอง ดูข้อมูลเพิ่มเติมได้ที่สไตล์และธีม
    android:uiOptions
    ตัวเลือกเพิ่มเติมสำหรับ UI ของกิจกรรม ซึ่งต้องเป็นค่าใดค่าหนึ่งต่อไปนี้
    ค่าคำอธิบาย
    "none"ไม่มีตัวเลือก UI เพิ่มเติม โดยตัวเลือกนี้คือค่าเริ่มต้น
    "splitActionBarWhenNarrow"เพิ่มแถบที่ด้านล่างของหน้าจอเพื่อแสดงรายการการทำงานในแถบแอป หรือที่เรียกว่าแถบการดำเนินการ เมื่อมีพื้นที่แนวนอนจำกัด เช่น เมื่ออยู่ในโหมดแนวตั้งบนโทรศัพท์มือถือ แถบแอปจะแบ่งออกเป็นส่วนการนำทางด้านบนและแถบด้านล่างสำหรับรายการการดำเนินการ แทนที่จะมีรายการการดำเนินการจำนวนเล็กน้อยปรากฏในแถบแอปที่ด้านบนของหน้าจอ ซึ่งหมายความว่าจะมีพื้นที่ที่เหมาะสม สำหรับรายการการดำเนินการ รวมถึงองค์ประกอบการนำทางและชื่อ ที่ด้านบน รายการในเมนูจะไม่แยกกันใน 2 แถบ โดยจะปรากฏพร้อมกันเสมอ

    ดูข้อมูลเพิ่มเติมเกี่ยวกับแถบแอปได้ที่เพิ่มแถบแอป

    แอตทริบิวต์นี้เพิ่มเข้ามาในระดับ API 14

    android:usesCleartextTraffic
    ระบุว่าแอปตั้งใจที่จะใช้การจราจรของข้อมูลในเครือข่ายข้อความธรรมดา เช่น HTTP ข้อความธรรมดา หรือไม่ ค่าเริ่มต้นสำหรับแอปที่กำหนดเป้าหมายเป็น API ระดับ 27 หรือต่ำกว่าคือ "true" แอปที่กำหนดเป้าหมายเป็นระดับ API 28 ขึ้นไปจะใช้ "false" เป็นค่าเริ่มต้น

    หมายเหตุ: เราจะเลิกใช้งานแอตทริบิวต์นี้และระบบจะไม่สนใจแอปที่กำหนดเป้าหมายเป็น API ระดับ 38 ขึ้นไป ระบุการกำหนดค่าความปลอดภัยของเครือข่ายเพื่อควบคุมการเข้าชมแบบข้อความธรรมดา (Cleartext) สำหรับ API ระดับ 24 ขึ้นไป หากแอปกำหนดเป้าหมายเป็น API ระดับ 23 และต่ำกว่า คุณต้องระบุ android:usesCleartextTraffic นอกเหนือจากการกำหนดค่าความปลอดภัยของเครือข่าย

    เมื่อตั้งค่าแอตทริบิวต์เป็น "false" คอมโพเนนต์แพลตฟอร์ม เช่น สแต็ก HTTP และ FTP DownloadManager และ MediaPlayer จะปฏิเสธคำขอของแอปที่จะใช้การรับส่งข้อมูลที่ไม่มีการเข้ารหัส

    เราขอแนะนำอย่างยิ่งให้ไลบรารีของบุคคลที่สามปฏิบัติตามการตั้งค่านี้ด้วย เหตุผลสำคัญที่ควรหลีกเลี่ยงการรับส่งข้อมูลข้อความธรรมดาคือการขาดการรักษาความลับ ความถูกต้อง และการป้องกันการดัดแปลง ผู้โจมตีเครือข่ายสามารถดักฟังข้อมูลที่ส่งและแก้ไขข้อมูลดังกล่าวได้โดยไม่ถูกตรวจพบ

    เราจะพยายามอย่างเต็มที่ในการปฏิบัติตามแฟล็กนี้ เนื่องจากเป็นไปไม่ได้ที่จะป้องกันไม่ให้แอปพลิเคชัน Android ส่งการรับส่งข้อมูลข้อความที่โอนหรือจัดเก็บได้โดยไม่ต้องเข้ารหัสทั้งหมด เนื่องจากระดับการเข้าถึงที่เราให้ เช่น ไม่คาดหวังว่า Socket API จะปฏิบัติตาม แฟล็กนี้ เนื่องจาก API ไม่สามารถระบุได้ว่าการรับส่งข้อมูลเป็นข้อความที่โอนหรือจัดเก็บได้โดยไม่ต้องเข้ารหัสหรือไม่

    อย่างไรก็ตาม การจราจรของข้อมูลในเครือข่ายส่วนใหญ่จากแอปพลิเคชันจะได้รับการจัดการโดยสแต็กและคอมโพเนนต์เครือข่ายระดับสูงกว่า ซึ่งสามารถ ใช้แฟล็กนี้ได้โดยการอ่านจาก ApplicationInfo.flags หรือ NetworkSecurityPolicy.isCleartextTrafficPermitted()

    หมายเหตุ: WebView จะใช้แอตทริบิวต์นี้สำหรับ แอปพลิเคชันที่กำหนดเป้าหมายเป็น API ระดับ 26 ขึ้นไป

    ในระหว่างการพัฒนาแอป คุณสามารถใช้ StrictMode เพื่อระบุการรับส่งข้อมูลที่ไม่ได้เข้ารหัสจากแอปได้ ดูข้อมูลเพิ่มเติมได้ที่ StrictMode.VmPolicy.Builder.detectCleartextNetwork()

    แอตทริบิวต์นี้เพิ่มเข้ามาในระดับ API 23

    ระบบจะละเว้นแฟล็กนี้ใน Android 7.0 (ระดับ API 24) ขึ้นไป หากมี Android Network Security Config

    android:vmSafeMode
    ระบุว่าแอปต้องการให้เครื่องเสมือน (VM) ทำงานในโหมดปลอดภัยหรือไม่ ค่าเริ่มต้นคือ "false"

    แอตทริบิวต์นี้เพิ่มเข้ามาในระดับ API 8 ซึ่งค่า "true" จะปิดใช้คอมไพเลอร์ Dalvik Just-In-Time (JIT)

    แอตทริบิวต์นี้ได้รับการดัดแปลงในระดับ API 22 ซึ่งค่า "true" จะปิดใช้คอมไพเลอร์ล่วงหน้า (AOT) ของ ART

    เปิดตัวใน
    ระดับ API 1
    ดูเพิ่มเติม
    <activity>
    <service>
    <receiver>
    <provider>