Vị trí cài đặt ứng dụng

Kể từ API cấp 8, bạn có thể cho phép cài đặt ứng dụng trên bộ nhớ ngoài (ví dụ: thẻ SD của thiết bị). Đây là một tính năng không bắt buộc mà bạn có thể khai báo cho ứng dụng bằng thuộc tính android:installLocation trong tệp kê khai. Nếu bạn không khai báo thuộc tính này, thì ứng dụng sẽ chỉ được cài đặt trên bộ nhớ trong và không thể chuyển sang bộ nhớ ngoài.

Để cho phép hệ thống cài đặt ứng dụng trên bộ nhớ ngoài, hãy sửa đổi tệp kê khai để thêm thuộc tính android:installLocation vào phần tử <manifest>, với giá trị là "preferExternal" hoặc "auto". Ví dụ:

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

Khai báo "preferExternal" có nghĩa là bạn yêu cầu cài đặt ứng dụng trên bộ nhớ ngoài, nhưng hệ thống không đảm bảo rằng ứng dụng sẽ được cài đặt trên bộ nhớ ngoài. Nếu bộ nhớ ngoài đầy thì hệ thống sẽ cài đặt vào bộ nhớ trong. Người dùng cũng có thể di chuyển ứng dụng giữa hai vị trí.

Nếu khai báo "auto" thì bạn chỉ báo rằng người dùng có thể cài đặt ứng dụng trên bộ nhớ ngoài, nhưng bạn không có vị trí cài đặt ưu tiên. Hệ thống sẽ quyết định vị trí cài đặt ứng dụng dựa trên một số yếu tố. Người dùng cũng có thể di chuyển ứng dụng giữa hai vị trí.

Khi ứng dụng được cài đặt trên bộ nhớ ngoài:

  • Hiệu suất của ứng dụng không bị ảnh hưởng, miễn là bộ nhớ ngoài được gắn trên thiết bị.
  • Tệp .apk được lưu vào bộ nhớ ngoài, nhưng mọi dữ liệu riêng tư của người dùng, cơ sở dữ liệu, tệp .dex đã tối ưu hoá và mã gốc đã trích xuất sẽ được lưu trên bộ nhớ trong của thiết bị.
  • Vùng chứa riêng biệt nơi lưu trữ ứng dụng sẽ được mã hoá bằng một khoá được tạo ngẫu nhiên chỉ có thể giải mã bằng thiết bị cài đặt ban đầu. Do đó, ứng dụng cài đặt trên thẻ SD chỉ hoạt động trên một thiết bị.
  • Người dùng có thể chuyển ứng dụng sang bộ nhớ trong thông qua phần cài đặt hệ thống.

Cảnh báo: Khi người dùng bật chế độ lưu trữ dung lượng lớn qua USB để chia sẻ tệp với máy tính hoặc ngắt kết nối thẻ SD qua phần cài đặt hệ thống, bộ nhớ ngoài sẽ ngắt kết nối với thiết bị và tất cả ứng dụng đang chạy trên bộ nhớ ngoài sẽ bị tắt ngay lập tức.

Khả năng tương thích ngược

Khả năng cho phép cài đặt ứng dụng trên bộ nhớ ngoài là một tính năng chỉ có trên các thiết bị chạy API cấp 8 (Android 2.2) trở lên. Các ứng dụng hiện có được tạo trước API cấp 8 sẽ luôn cài đặt trên bộ nhớ trong và không thể chuyển sang bộ nhớ ngoài (ngay cả trên thiết bị có API cấp 8). Tuy nhiên, nếu ứng dụng được thiết kế để hỗ trợ API cấp thấp hơn 8, bạn có thể chọn hỗ trợ tính năng này cho thiết bị có API cấp 8 trở lên mà vẫn tương thích với thiết bị có cấp API thấp hơn 8.

Cách cho phép cài đặt trên bộ nhớ ngoài mà vẫn tương thích với phiên bản thấp hơn API cấp 8:

  1. Đưa thuộc tính android:installLocation mang giá trị "auto" hoặc "preferExternal" vào phần tử <manifest>.
  2. Giữ nguyên thuộc tính android:minSdkVersion (cấp thấp hơn "8") và đảm bảo rằng mã xử lý ứng dụng chỉ dùng API tương thích với cấp đó.
  3. Để biên dịch ứng dụng, hãy thay đổi bản dựng mục tiêu thành API cấp 8. Điều này là cần thiết vì các thư viện Android cũ không hiểu được thuộc tính android:installLocation và sẽ không biên dịch được ứng dụng khi có thuộc tính này.

Khi ứng dụng được cài đặt trên một thiết bị có API cấp thấp hơn 8, thuộc tính android:installLocation sẽ bị bỏ qua và ứng dụng đó sẽ được cài đặt trên bộ nhớ trong.

Chú ý: Mặc dù việc đánh dấu bằng XML như vậy sẽ bị các nền tảng cũ bỏ qua, nhưng bạn phải cẩn thận để không dùng API lập trình ra mắt từ API cấp 8 (trong khi minSdkVersion của bạn thấp hơn "8"), trừ trường hợp bạn thực hiện công việc cần thiết để cung cấp khả năng tương thích ngược trong mã.

Ứng dụng KHÔNG nên cài đặt trên bộ nhớ ngoài

Khi người dùng bật chế độ lưu trữ dung lượng lớn qua USB để chia sẻ tệp với máy tính (hoặc ngắt kết nối hoặc loại bỏ bộ nhớ ngoài), mọi ứng dụng cài đặt trên bộ nhớ ngoài và đang chạy đều bị tắt. Hệ thống không biết về ứng dụng này cho đến khi chế độ lưu trữ dung lượng lớn được tắt và bộ nhớ ngoài được kết nối lại trên thiết bị. Ngoài việc tắt ứng dụng và khiến người dùng không tìm thấy ứng dụng, tình trạng này còn có thể làm hỏng một số loại ứng dụng theo hướng nghiêm trọng hơn. Để ứng dụng hoạt động nhất quán như mong đợi, bạn không nên cho phép cài đặt ứng dụng trên bộ nhớ ngoài nếu ứng dụng đó sử dụng tính năng nào sau đây (do hậu quả của việc bộ nhớ ngoài bị ngắt kết nối):

Dịch vụ
Service đang chạy của bạn đã bị tắt và chưa khởi động lại sau khi bộ nhớ ngoài được kết nối lại. Các ứng dụng liên kết với dịch vụ này có thể đăng ký ý định broadcast (truyền tin) ACTION_EXTERNAL_APPLICATIONS_AVAILABLE. Ý định này thông báo cho tất cả ứng dụng rằng không được cài đặt trên bộ nhớ ngoài khi các ứng dụng đã cài đặt trên bộ nhớ ngoài xuất hiện lại trên hệ thống. Sau khi nhận được tin này, các ứng dụng có thể cố gắng liên kết với dịch vụ của bạn.
Dịch vụ chuông báo (alarm service)
Chuông báo đã đăng ký bằng AlarmManager sẽ bị huỷ. Bạn phải đăng ký lại mọi chuông báo theo cách thủ công khi bộ nhớ ngoài được kết nối lại.
Công cụ phương thức nhập (IME)
IME của bạn sẽ được thay thế bằng IME mặc định. Khi bộ nhớ ngoài được kết nối lại, người dùng có thể mở phần cài đặt hệ thống để bật lại IME của bạn.
Hình nền động (Live Wallpaper)
Hình nền động đang chạy của bạn sẽ được thay thế bằng hình nền động mặc định. Khi bộ nhớ ngoài được kết nối lại, người dùng có thể chọn lại Hình nền động của bạn.
Tiện ích ứng dụng (App Widget)
Tiện ích ứng dụng sẽ bị xoá khỏi màn hình chính. Khi bộ nhớ ngoài được kết nối lại, Tiện ích ứng dụng sẽ không cho phép người dùng chọn cho đến khi hệ thống đặt lại ứng dụng Home (thường là cho đến khi khởi động lại hệ thống).
Trình quản lý tài khoản (Account Manager)
Các tài khoản bạn tạo bằng AccountManager sẽ không xuất hiện cho đến khi bộ nhớ ngoài được kết nối lại.
Bộ điều hợp đồng bộ hoá (Sync Adapter)
AbstractThreadedSyncAdapter và tất cả chức năng đồng bộ hoá của thuộc tính này sẽ không hoạt động cho đến khi bộ nhớ ngoài được kết nối lại.
Trình quản trị thiết bị (Device Administrator)
DeviceAdminReceiver và tất cả tính năng quản trị của thuộc tính này sẽ bị tắt, từ đó có thể dẫn đến những hậu quả khó đoán đối với chức năng của thiết bị. Tình trạng này có thể vẫn tồn tại sau khi người dùng kết nối lại bộ nhớ ngoài.
Bộ nhận thông báo (Broadcast Receiver) lắng nghe trạng thái "boot completed" ("khởi động xong")
Hệ thống phân phối thông báo (broadcast) ACTION_BOOT_COMPLETED trước khi bộ nhớ ngoài kết nối với thiết bị. Nếu được cài đặt trên bộ nhớ ngoài, thì ứng dụng sẽ không bao giờ nhận được nội dung truyền tin này.

Nếu ứng dụng dùng tính năng nào nêu trên, thì bạn không nên cho phép cài đặt ứng dụng trên bộ nhớ ngoài. Theo mặc định, hệ thống sẽ không cho phép cài đặt ứng dụng trên bộ nhớ ngoài, vậy nên bạn không cần lo lắng về các ứng dụng hiện có của mình. Tuy nhiên, nếu chắc chắn rằng người dùng hoàn toàn không nên cài đặt ứng dụng trên bộ nhớ ngoài, thì bạn nên làm rõ điều này bằng cách khai báo android:installLocation kèm theo giá trị "internalOnly". Mặc dù không làm thay đổi hành vi mặc định, nhưng khai báo này nêu rõ rằng người dùng chỉ nên cài đặt ứng dụng của bạn trên bộ nhớ trong, đồng thời phân phối dưới dạng một lời nhắc cho bạn và các nhà phát triển khác rằng bạn đã đưa ra quyết định này.

Ứng dụng nên cài đặt trên bộ nhớ ngoài

Nói một cách đơn giản, mọi ứng dụng không sử dụng các tính năng nêu trong phần trước đều an toàn khi được cài đặt trên bộ nhớ ngoài. Thường thì trò chơi có kích thước lớn là loại ứng dụng nên cho phép cài đặt trên bộ nhớ ngoài, vì trò chơi thường không cung cấp dịch vụ bổ sung khi không hoạt động. Khi không dùng được bộ nhớ ngoài và tiến trình trò chơi bị ngắt, bạn sẽ không nhận thấy ảnh hưởng nào khi bộ nhớ ngoài dùng được trở lại và người dùng khởi động lại trò chơi (giả sử rằng trạng thái của trò chơi đã được lưu lại một cách phù hợp trong Vòng đời hoạt động bình thường

Nếu ứng dụng yêu cầu vài megabyte cho tệp APK, bạn nên cẩn thận xem xét có nên cho phép cài đặt ứng dụng trên bộ nhớ ngoài hay không để người dùng có thể bảo toàn dung lượng bộ nhớ trong của họ.

Để biết thêm thông tin liên quan, hãy tham khảo: <manifest>