ตำแหน่งติดตั้งแอป

ตั้งแต่ API ระดับ 8 เป็นต้นไป คุณสามารถอนุญาตให้ติดตั้งแอปพลิเคชันในพื้นที่เก็บข้อมูลภายนอก (เช่น การ์ด SD ของอุปกรณ์) ซึ่งเป็นฟีเจอร์เสริมที่คุณประกาศ สำหรับแอปพลิเคชันได้ด้วย android:installLocation ในไฟล์ Manifest หากคุณ ไม่ ประกาศแอตทริบิวต์นี้ ระบบจะติดตั้งแอปพลิเคชันในที่จัดเก็บข้อมูลภายในเท่านั้น และคุณจะย้ายแอปพลิเคชันไปยังที่จัดเก็บข้อมูลภายนอกไม่ได้

หากต้องการอนุญาตให้ระบบติดตั้งแอปพลิเคชันในพื้นที่เก็บข้อมูลภายนอก ให้แก้ไขไฟล์ Manifest เพื่อรวมแอตทริบิวต์ android:installLocation ไว้ในองค์ประกอบ <manifest> โดยมีค่าเป็น "preferExternal" หรือ "auto" เช่น

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:installLocation="preferExternal"
    ... >

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

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

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

  • ประสิทธิภาพของแอปพลิเคชันจะไม่ได้รับผลกระทบตราบใดที่ที่จัดเก็บข้อมูลภายนอกยังคงต่อเชื่อมกับอุปกรณ์
  • ระบบจะบันทึกไฟล์ .apk ไว้ในพื้นที่เก็บข้อมูลภายนอก แต่จะบันทึกข้อมูลผู้ใช้ส่วนตัว ฐานข้อมูล ไฟล์ .dex ที่ปรับให้เหมาะสม และโค้ดแบบเนทีฟที่แยกออกมาไว้ในหน่วยความจำภายในของอุปกรณ์
  • ระบบจะเข้ารหัสคอนเทนเนอร์ที่ไม่ซ้ำกันซึ่งใช้จัดเก็บแอปพลิเคชันด้วยคีย์ที่สร้างขึ้นแบบสุ่ม ซึ่งถอดรหัสได้เฉพาะอุปกรณ์ที่ติดตั้งแอปพลิเคชันดังกล่าวในตอนแรกเท่านั้น ดังนั้น แอปพลิเคชันที่ติดตั้งในการ์ด SD จึงใช้งานได้กับอุปกรณ์เพียงเครื่องเดียว
  • ผู้ใช้สามารถย้ายแอปพลิเคชันไปยังที่จัดเก็บข้อมูลภายในผ่านการตั้งค่าระบบได้

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

ความเข้ากันได้แบบย้อนหลัง

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

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

  1. รวมแอตทริบิวต์ android:installLocation ที่มีค่าเป็น "auto" หรือ "preferExternal" ไว้ในองค์ประกอบ <manifest>
  2. ปล่อยแอตทริบิวต์ android:minSdkVersion ไว้ตามเดิม (ค่า น้อยกว่า "8") และตรวจสอบว่าโค้ดของแอปพลิเคชันใช้เฉพาะ API ที่เข้ากันได้กับระดับดังกล่าว
  3. เปลี่ยนเป้าหมายการบิลด์เป็น API ระดับ 8 เพื่อคอมไพล์แอปพลิเคชัน ซึ่งจำเป็นเนื่องจากไลบรารี Android เวอร์ชันเก่าไม่เข้าใจแอตทริบิวต์ android:installLocation และจะไม่คอมไพล์แอปพลิเคชันเมื่อมีแอตทริบิวต์นี้

เมื่อติดตั้งแอปพลิเคชันในอุปกรณ์ที่ใช้ API ระดับต่ำกว่า 8 ระบบจะละเว้นแอตทริบิวต์ android:installLocation และติดตั้งแอปพลิเคชันในพื้นที่เก็บข้อมูลภายใน

ข้อควรระวัง: แม้ว่าแพลตฟอร์มเก่าจะละเว้นมาร์กอัป XML เช่นนี้ แต่คุณต้องระมัดระวังไม่ให้ใช้ API การเขียนโปรแกรมที่เปิดตัวใน API ระดับ 8 ในขณะที่ minSdkVersion มีค่าต่ำกว่า "8" เว้นแต่คุณจะดำเนินการที่จำเป็นเพื่อให้โค้ดมีความเข้ากันได้แบบย้อนหลัง

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

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

บริการ
ระบบจะหยุด Service ที่กำลังทำงานอยู่ และจะไม่รีสตาร์ทเมื่อต่อเชื่อมพื้นที่เก็บข้อมูลภายนอกอีกครั้ง แอปพลิเคชัน ที่ผูกกับบริการนี้สามารถลงทะเบียนเพื่อรับ ACTION_EXTERNAL_APPLICATIONS_AVAILABLE Intent การออกอากาศ ซึ่งจะแจ้งให้แอปพลิเคชันทั้งหมดที่ ไม่ได้ ติดตั้งในพื้นที่เก็บข้อมูลภายนอกทราบเมื่อแอปพลิเคชันที่ติดตั้งในพื้นที่เก็บข้อมูลภายนอก พร้อมใช้งานในระบบอีกครั้ง หลังจากได้รับข้อมูลออกอากาศนี้แล้ว แอปพลิเคชันจะพยายามผูกกับบริการของคุณ
บริการการปลุก
ระบบจะยกเลิกการปลุกที่ลงทะเบียนกับ AlarmManager คุณต้องลงทะเบียนการปลุกอีกครั้งด้วยตนเองเมื่อต่อเชื่อมพื้นที่เก็บข้อมูลภายนอกอีกครั้ง
ตัวแก้ไขวิธีการป้อนข้อมูล
ระบบจะแทนที่ IME ของคุณด้วย IME เริ่มต้น เมื่อต่อเชื่อมพื้นที่เก็บข้อมูลภายนอกอีกครั้ง ผู้ใช้สามารถเปิดการตั้งค่าระบบเพื่อเปิดใช้ IME ของคุณอีกครั้ง
วอลเปเปอร์เคลื่อนไหว
ระบบจะแทนที่วอลเปเปอร์เคลื่อนไหว ที่กำลังทำงานอยู่ด้วยวอลเปเปอร์เคลื่อนไหวเริ่มต้น เมื่อต่อเชื่อมพื้นที่เก็บข้อมูลภายนอกอีกครั้ง ผู้ใช้สามารถเลือกวอลเปเปอร์เคลื่อนไหวของคุณอีกครั้ง
แอปวิดเจ็ต
ระบบจะนำแอปวิดเจ็ตออกจากหน้าจอหลัก เมื่อต่อเชื่อมพื้นที่เก็บข้อมูลภายนอกอีกครั้ง ผู้ใช้จะเลือกแอปวิดเจ็ตของคุณ ไม่ได้ จนกว่าระบบจะรีเซ็ตแอปพลิเคชันหน้าแรก (โดยปกติจะเกิดขึ้นเมื่อรีบูตระบบ)
Account Managers
บัญชีที่สร้างด้วย AccountManager จะหายไปจนกว่าจะต่อเชื่อมพื้นที่เก็บข้อมูลภายนอกอีกครั้ง
อะแดปเตอร์การซิงค์
AbstractThreadedSyncAdapter และฟังก์ชันการซิงค์ทั้งหมดจะไม่ทำงานจนกว่าจะต่อเชื่อมพื้นที่เก็บข้อมูลภายนอกอีกครั้ง
ผู้ดูแลระบบอุปกรณ์
ระบบจะปิดใช้ DeviceAdminReceiver และความสามารถในการดูแลระบบทั้งหมด ซึ่งอาจส่งผลที่ไม่คาดคิดต่อฟังก์ชันการทำงานของอุปกรณ์ และผลดังกล่าวอาจยังคงอยู่หลังจากต่อเชื่อมพื้นที่เก็บข้อมูลภายนอกอีกครั้ง
Broadcast Receiver ที่รอรับข้อมูลออกอากาศ "boot completed"
ระบบจะส่งข้อมูลออกอากาศ ACTION_BOOT_COMPLETED ก่อนที่จะต่อเชื่อมพื้นที่เก็บข้อมูลภายนอกกับอุปกรณ์ หากติดตั้งแอปพลิเคชันในพื้นที่เก็บข้อมูลภายนอก แอปพลิเคชันจะไม่มีทางได้รับข้อมูลออกอากาศนี้

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

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

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

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

ดูข้อมูลเพิ่มเติมที่เกี่ยวข้องได้ที่ <manifest>