ตั้งแต่ 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 ได้
- รวมแอตทริบิวต์
android:installLocationที่มีค่าเป็น "auto" หรือ "preferExternal" ไว้ในองค์ประกอบ<manifest> - ปล่อยแอตทริบิวต์
android:minSdkVersionไว้ตามเดิม (ค่า น้อยกว่า "8") และตรวจสอบว่าโค้ดของแอปพลิเคชันใช้เฉพาะ API ที่เข้ากันได้กับระดับดังกล่าว - เปลี่ยนเป้าหมายการบิลด์เป็น API ระดับ 8 เพื่อคอมไพล์แอปพลิเคชัน ซึ่งจำเป็นเนื่องจากไลบรารี Android เวอร์ชันเก่าไม่เข้าใจแอตทริบิวต์
android:installLocationและจะไม่คอมไพล์แอปพลิเคชันเมื่อมีแอตทริบิวต์นี้
เมื่อติดตั้งแอปพลิเคชันในอุปกรณ์ที่ใช้ API ระดับต่ำกว่า 8 ระบบจะละเว้นแอตทริบิวต์ android:installLocation และติดตั้งแอปพลิเคชันในพื้นที่เก็บข้อมูลภายใน
ข้อควรระวัง: แม้ว่าแพลตฟอร์มเก่าจะละเว้นมาร์กอัป XML เช่นนี้ แต่คุณต้องระมัดระวังไม่ให้ใช้ API การเขียนโปรแกรมที่เปิดตัวใน API ระดับ 8 ในขณะที่ minSdkVersion มีค่าต่ำกว่า "8" เว้นแต่คุณจะดำเนินการที่จำเป็นเพื่อให้โค้ดมีความเข้ากันได้แบบย้อนหลัง
แอปพลิเคชันที่ไม่ควรติดตั้งในพื้นที่เก็บข้อมูลภายนอก
เมื่อผู้ใช้เปิดใช้พื้นที่เก็บข้อมูลแบบ USB เพื่อแชร์ไฟล์กับคอมพิวเตอร์ (หรือยกเลิกการต่อเชื่อมหรือนำพื้นที่เก็บข้อมูลภายนอกออก) ระบบจะหยุดแอปพลิเคชันที่ติดตั้งในพื้นที่เก็บข้อมูลภายนอกและกำลังทำงานอยู่ ระบบจะไม่รู้จักแอปพลิเคชันจนกว่าจะปิดใช้พื้นที่เก็บข้อมูลแบบ USB และต่อเชื่อมพื้นที่เก็บข้อมูลภายนอกกับอุปกรณ์อีกครั้ง นอกจากการหยุดแอปพลิเคชันและทำให้ผู้ใช้ใช้งานแอปพลิเคชันไม่ได้แล้ว การดำเนินการนี้ยังอาจทำให้แอปพลิเคชันบางประเภทเสียหายอย่างรุนแรงได้ เพื่อให้แอปพลิเคชันทำงานตามที่คาดไว้เสมอ คุณไม่ควร อนุญาตให้ติดตั้งแอปพลิเคชันในพื้นที่เก็บข้อมูลภายนอกหากแอปพลิเคชันใช้ฟีเจอร์ใดฟีเจอร์หนึ่งต่อไปนี้ เนื่องจากผลที่ตามมาเมื่อยกเลิกการต่อเชื่อมพื้นที่เก็บข้อมูลภายนอก
- บริการ
- ระบบจะหยุด
Serviceที่กำลังทำงานอยู่ และจะไม่รีสตาร์ทเมื่อต่อเชื่อมพื้นที่เก็บข้อมูลภายนอกอีกครั้ง แอปพลิเคชัน ที่ผูกกับบริการนี้สามารถลงทะเบียนเพื่อรับACTION_EXTERNAL_APPLICATIONS_AVAILABLEIntent การออกอากาศ ซึ่งจะแจ้งให้แอปพลิเคชันทั้งหมดที่ ไม่ได้ ติดตั้งในพื้นที่เก็บข้อมูลภายนอกทราบเมื่อแอปพลิเคชันที่ติดตั้งในพื้นที่เก็บข้อมูลภายนอก พร้อมใช้งานในระบบอีกครั้ง หลังจากได้รับข้อมูลออกอากาศนี้แล้ว แอปพลิเคชันจะพยายามผูกกับบริการของคุณ - บริการการปลุก
- ระบบจะยกเลิกการปลุกที่ลงทะเบียนกับ
AlarmManagerคุณต้องลงทะเบียนการปลุกอีกครั้งด้วยตนเองเมื่อต่อเชื่อมพื้นที่เก็บข้อมูลภายนอกอีกครั้ง - ตัวแก้ไขวิธีการป้อนข้อมูล
- ระบบจะแทนที่ IME ของคุณด้วย IME เริ่มต้น เมื่อต่อเชื่อมพื้นที่เก็บข้อมูลภายนอกอีกครั้ง ผู้ใช้สามารถเปิดการตั้งค่าระบบเพื่อเปิดใช้ IME ของคุณอีกครั้ง
- วอลเปเปอร์เคลื่อนไหว
- ระบบจะแทนที่วอลเปเปอร์เคลื่อนไหว ที่กำลังทำงานอยู่ด้วยวอลเปเปอร์เคลื่อนไหวเริ่มต้น เมื่อต่อเชื่อมพื้นที่เก็บข้อมูลภายนอกอีกครั้ง ผู้ใช้สามารถเลือกวอลเปเปอร์เคลื่อนไหวของคุณอีกครั้ง
- แอปวิดเจ็ต
- ระบบจะนำแอปวิดเจ็ตออกจากหน้าจอหลัก เมื่อต่อเชื่อมพื้นที่เก็บข้อมูลภายนอกอีกครั้ง ผู้ใช้จะเลือกแอปวิดเจ็ตของคุณ ไม่ได้ จนกว่าระบบจะรีเซ็ตแอปพลิเคชันหน้าแรก (โดยปกติจะเกิดขึ้นเมื่อรีบูตระบบ)
- Account Managers
- บัญชีที่สร้างด้วย
AccountManagerจะหายไปจนกว่าจะต่อเชื่อมพื้นที่เก็บข้อมูลภายนอกอีกครั้ง - อะแดปเตอร์การซิงค์
AbstractThreadedSyncAdapterและฟังก์ชันการซิงค์ทั้งหมดจะไม่ทำงานจนกว่าจะต่อเชื่อมพื้นที่เก็บข้อมูลภายนอกอีกครั้ง- ผู้ดูแลระบบอุปกรณ์
- ระบบจะปิดใช้
DeviceAdminReceiverและความสามารถในการดูแลระบบทั้งหมด ซึ่งอาจส่งผลที่ไม่คาดคิดต่อฟังก์ชันการทำงานของอุปกรณ์ และผลดังกล่าวอาจยังคงอยู่หลังจากต่อเชื่อมพื้นที่เก็บข้อมูลภายนอกอีกครั้ง - Broadcast Receiver ที่รอรับข้อมูลออกอากาศ "boot completed"
- ระบบจะส่งข้อมูลออกอากาศ
ACTION_BOOT_COMPLETEDก่อนที่จะต่อเชื่อมพื้นที่เก็บข้อมูลภายนอกกับอุปกรณ์ หากติดตั้งแอปพลิเคชันในพื้นที่เก็บข้อมูลภายนอก แอปพลิเคชันจะไม่มีทางได้รับข้อมูลออกอากาศนี้
หากแอปพลิเคชันใช้ฟีเจอร์ใดฟีเจอร์หนึ่งที่ระบุไว้ข้างต้น คุณไม่ควร อนุญาตให้ติดตั้งแอปพลิเคชันในพื้นที่เก็บข้อมูลภายนอก โดยค่าเริ่มต้น ระบบ จะไม่อนุญาต ให้ติดตั้งแอปพลิเคชันในพื้นที่เก็บข้อมูลภายนอก ดังนั้นคุณจึงไม่ต้องกังวลเกี่ยวกับแอปพลิเคชันที่มีอยู่ อย่างไรก็ตาม หากคุณมั่นใจว่าไม่ควรติดตั้งแอปพลิเคชันในที่จัดเก็บข้อมูลภายนอก ให้ระบุอย่างชัดเจนโดยประกาศ android:installLocation ที่มีค่าเป็น "internalOnly" แม้ว่าการดำเนินการนี้จะไม่เปลี่ยนลักษณะการทำงานเริ่มต้น แต่จะเป็นการระบุอย่างชัดเจนว่าควรติดตั้งแอปพลิเคชันในที่จัดเก็บข้อมูลภายในเท่านั้น และเป็นเครื่องเตือนใจสำหรับคุณและนักพัฒนาแอปคนอื่นๆ ว่าได้มีการตัดสินใจเช่นนี้แล้ว
แอปพลิเคชันที่ควรติดตั้งในพื้นที่เก็บข้อมูลภายนอก
กล่าวอย่างง่ายๆ คือ แอปพลิเคชันที่ไม่ใช้ฟีเจอร์ที่ระบุไว้ในส่วนก่อนหน้าจะปลอดภัยเมื่อติดตั้งในพื้นที่เก็บข้อมูลภายนอก เกมขนาดใหญ่มักเป็นแอปพลิเคชันประเภทที่ควรอนุญาตให้ติดตั้งในพื้นที่เก็บข้อมูลภายนอก เนื่องจากโดยปกติแล้วเกมจะไม่มีบริการเพิ่มเติมเมื่อไม่ได้ใช้งาน เมื่อพื้นที่เก็บข้อมูลภายนอกไม่พร้อมใช้งานและระบบหยุดกระบวนการของเกม จะไม่มีผลที่มองเห็นได้เมื่อพื้นที่เก็บข้อมูลพร้อมใช้งานอีกครั้งและ ผู้ใช้รีสตาร์ทเกม (โดยสมมติว่าเกมบันทึกสถานะอย่างถูกต้องในระหว่างวงจรกิจกรรมปกติของ Activity)
หากแอปพลิเคชันต้องใช้พื้นที่หลายเมกะไบต์สำหรับไฟล์ APK คุณควรพิจารณาอย่างรอบคอบว่าจะเปิดใช้การติดตั้งแอปพลิเคชันในที่จัดเก็บข้อมูลภายนอกหรือไม่ เพื่อให้ผู้ใช้มีพื้นที่ในที่จัดเก็บข้อมูลภายในเหลือเพียงพอ
ดูข้อมูลเพิ่มเติมที่เกี่ยวข้องได้ที่ <manifest>