page.title=Các thay đổi Hành vi page.keywords=preview,sdk,compatibility meta.tags="preview", "compatibility" page.tags="preview", "developer preview" page.image=images/cards/card-n-changes_2x.png @jd:body
Với các tính năng và khả năng mới, Android N cũng có một số các thay đổi hành vi của hệ thống và API. Tài liệu này nêu bật một số các thay đổi quan trọng mà bạn cần biết và cân nhắc cho ứng dụng của mình.
Nếu bạn đã từng phát hành ứng dụng cho Android, hãy lưu ý rằng các thay đổi trong nền tảng này có thể tác động đến ứng dụng của bạn.
Android N có chứa các thay đổi hành vi của hệ thống nhằm cải thiện thời lượng pin của thiết bị, sử dụng RAM và hiệu năng ứng dụng. Các thay đổi này có thể tác động đến tính khả dụng của tài nguyên và các thông báo hệ thống đối tới ứng dụng. Bạn nên tìm hiểu các thay đổi này và đánh giá xem ứng dụng cần phải điều chỉnh như thế nào đối với các thay đổi.
Được đưa vào Android 6.0 (Mức API 23), Chế độ Ngủ sâu cải thiện thời lượng pin bằng cách trì hoãn các hoạt động của CPU và mạng khi người dùng không cắm sạc, không di chuyển và tắt màn hình thiết bị. Android N thêm các cải tiến cho Chế độ Ngủ sâu bằng cách sử dụng một tập con các hạn chế của CPU và mạng khi thiết bị không được cắm sạc với màn hình bị tắt, nhưng không nhất thiết phải để một chỗ, ví dụ như một thiết bị cầm tay di chuyển trong túi của người dùng.
Khi một thiết bị dùng nguồn điện từ pin và màn hình bị tắt trong một khoảng thời gian nhất định, thiết bị sẽ chuyển vào Chế độ Ngủ sâu và áp dụng tập con đầu tiên của các hạn chế: Nó sẽ ngắt truy cập mạng của ứng dụng và trì hoãn các tác vụ và các đồng bộ. Nếu thiết bị được đặt một chỗ trong một khoảng thời gian nhất định sau khi vào Chế độ Ngủ sâu thì hệ thống sẽ áp dụng các hạn chế còn lại của Chế độ Ngủ sâu thành {@link android.os.PowerManager.WakeLock}, báo thức {@link android.app.AlarmManager}, GPS, quét Wi-Fi. Cho dù một số hoặc tất cả các hạn chế của Chế độ Ngủ sâu có được áp dụng hay không thì hệ thống sẽ đánh thức thiết bị trong các khoảng thời gian bảo trì ngắn, trong đó các ứng dụng được phép truy cập mạng và có thể thực thi mọi tác vụ/đồng bộ bị trì hoãn.
Lưu ý rằng việc bật màn hình hoặc cắm sạc sẽ đưa thiết bị thoát Chế độ Ngủ sâu và loại bỏ các hạn chế xử lý này. Hành vi bổ sung này không ảnh hưởng đến các khuyến nghị và các thực hành tốt nhất khi thích ứng cho ứng dụng của bạn với phiên bản Chế độ Ngủ sâu được đưa vào Android 6.0 (API mức 23) trước đó, như mô tả trong Tối ưu hóa Chế độ Ngủ sâu và Chế độ Chờ của Ứng dụng. Bạn nên tiếp tục làm theo các khuyến nghị đó, ví dụ như sử dụng Google Cloud Messaging (GCM) để gửi và nhận tin nhắn, và hãy tiến hành áp dụng các bản cập nhật để nhận hành vi Chế độ Ngủ sâu bổ sung.
Android N gỡ bỏ ba truyền phát không biểu thị để giúp tối ưu hóa cả việc sử dụng bộ nhớ lẫn tiêu thụ điện năng. Thay đổi này là điều cần thiết bởi các truyền phát không biểu thị thường xuyên khởi động các ứng dụng đã được đăng ký để lắng nghe chúng dưới nền. Gỡ bỏ các truyền phát này có thể đem lại lợi ích lớn đối với hiệu năng của thiết bị và trải nghiệm người dùng.
Các thiết bị di động thường xuyên gặp phải những thay đổi về kết nối, chẳng hạn như khi di chuyển giữa Wi-Fi và dữ liệu di động. Hiện tại, các ứng dụng có thể theo dõi những thay đổi về kết nối bằng cách đăng ký một bộ thu truyền phát cho {@link android.net.ConnectivityManager#CONNECTIVITY_ACTION} không biểu thị trong bản kê khai của chúng. Vì nhiều ứng dụng đăng ký để nhận truyền phát này do đó một hoạt động chuyển mạng duy nhất cũng có thể khiến tất cả các ứng dụng thức dậy và xử lý truyền phát đó ngay lập tức.
Tương tự, các ứng dụng có thể đăng ký nhận truyền phát {@link android.hardware.Camera#ACTION_NEW_PICTURE} và {@link android.hardware.Camera#ACTION_NEW_VIDEO} không biểu thị từ các ứng dụng khác, ví dụ như ứng dụng Camera. Khi một người dùng chụp ảnh với ứng dụng Camera thì những ứng dụng này sẽ thức dậy để xử lý truyền phát đó.
Để loại bỏ các vấn đề này, Android N áp dụng các cách tối ưu hóa sau:
Các lần phát hành Android sau này có thể loại bỏ thêm các truyền phát không biểu thị, cũng như các dịch vụ chạy ngầm không còn liên kết. Vì lý do này, bạn nên tránh dùng hoặc gỡ bỏ các phụ thuộc trên các bộ thu được khai báo trong bản kê khai đối với các truyền phát không biểu thị, cũng như các dịch vụ chạy ngầm.
Khuôn khổ Android cung cấp một số giải pháp để giảm thiểu sự cần thiết đối với các truyền phát không biểu thị hoặc các dịch vụ chạy ngầm này. Ví dụ, API {@link android.app.job.JobScheduler} cung cấp một cơ chế lên lịch hiệu quả cho các hoạt động mạng khi đáp ứng các điều kiện được chỉ định, ví dụ như kết nối tới một mạng không đo lưu lượng. Bạn còn có thể sử dụng {@link android.app.job.JobScheduler} để phản ứng lại các thay đổi đối với trình cung cấp nội dung.
Để biết thêm thông tin về thay đổi hành vi này và cách thích ứng ứng dụng của bạn, hãy xem Tối ưu hóa Chạy ngầm.
Android N có các thay đổi đối với quyền có thể tác động đến ứng dụng của bạn, bao gồm các quyền tài khoản người dùng và một quyền mới cho phép ghi vào bộ nhớ ngoài. Sau đây là phần tóm tắt các quyền đã thay đổi trong bản xem trước:
Quyền GET_ACCOUNTS nay đã bị loại bỏ. Hệ thống sẽ bỏ qua quyền này đối với các ứng dụng nhắm mục tiêu Android N.
Android N có các thay đổi nhằm nâng cao khả năng sử dụng của nền tảng cho những người dùng có thị lực kém hoặc khiếm thị. Nhìn chung, các thay đổi này sẽ không yêu cầu thay đổi mã nguồn trong ứng dụng của bạn. Tuy nhiên, bạn cần xem lại các tính năng này và kiểm thử chúng với ứng dụng của mình để đánh giá các tác động tiềm tàng đối với trải nghiệm người dùng.
Android N cho phép người dùng đặt Display size để phóng to hoặc thu nhỏ tất cả các phần tử trên màn hình, nhờ đó cải thiện trợ năng của thiết bị cho những người dùng có thị lực kém. Người dùng không thể thu phóng màn hình vượt quá chiều rộng màn hình tối thiểu sw320dp. Đây là chiều rộng của Nexus 4, một máy điện thoại phổ biến có kích cỡ trung bình.
Khi mật độ của thiết bị thay đổi, hệ thống sẽ thông báo cho các ứng dụng đang chạy theo những cách sau:
Hầu hết các ứng dụng không cần thực hiện bất kỳ thay đổi nào để hỗ trợ tính năng này, miễn là các ứng dụng đó tuân theo các thực hành tốt nhất của Android. Những điều cụ thể cần kiểm tra:
sw320dp
và đảm bảo nó hoạt động đúng.
Lưu ý: Nếu bạn lưu trữ trong bộ đệm các dữ liệu phụ thuộc vào cấu hình thì nên thêm siêu dữ liệu liên quan như kích cỡ màn hình phù hợp hoặc mật độ điểm ảnh cho dữ liệu đó. Việc lưu siêu dữ liệu này cho phép bạn quyết định liệu bạn có cần phải làm mới dữ liệu được lưu trữ đệm sau khi một cấu hình thay đổi.
dp
).
Android N có Cài đặt Khả năng nhìn trên màn hình Chào mừng, nơi người dùng có thể thiết lập các cài đặt trợ năng sau đây trên một thiết bị mới: Magnification gesture, Font size, Display size và TalkBack. Thay đổi này sẽ tăng khả năng thấy được các khiếm khuyết liên quan đến những cài đặt màn hình khác nhau. Để đánh giá tác động của tính năng này, bạn có thể kiểm thử ứng dụng của mình với các cài đặt sau được bật. Bạn có thể tìm các cài đặt này trong Settings > Accessibility.
Android N có các thay đổi đối với không gian tên để ngăn việc tải các API không công khai. Nếu bạn sử dụng NDK, bạn chỉ nên sử dụng các API công khai từ nền tảng Android. Sử dụng các API không công khai trong bản phát hành chính thức tiếp theo của Android có thể khiến ứng dụng bị treo.
Để cảnh báo cho bạn việc sử dụng các API không công khai, các ứng dụng chạy trên thiết bị Android N sẽ tạo ra một lỗi trong phần xuất ra của logcat khi một ứng dụng gọi một API không công khai. Lỗi này cũng được hiển thị trên màn hình thiết bị dưới dạng thông báo để hỗ trợ nâng cao nhận biết đối với tình huống này. Bạn nên xem lại mã của ứng dụng để gỡ bỏ phần sử dụng các API nền tảng không công khai và kiểm thử kỹ lưỡng ứng dụng bằng một thiết bị hoặc bộ giả lập của bản xem trước.
Nếu ứng dụng của bạn phụ thuộc vào các thư viện của nền tảng, hãy xem tài liệu NDK để biết
các cách khắc phục cơ bản nhằm thay thế các API không công khai bằng các API công khai tương ứng.
Bạn cũng có thể liên kết với các thư viện của nền tảng mà không nhận biết ứng dụng,
đặc biệt nếu ứng dụng của bạn sử dụng thư viện thuộc một phần của nền tảng (như
libpng
), nhưng không thuộc NDK. Trong trường hợp đó, hãy đảm bảo rằng
tệp APK của bạn có chứa tất cả các tệp .so bạn dự định liên kết với.
Cẩn trọng: Một số thư viện của bên thứ ba có thể liên kết với các API không công khai. Nếu ứng dụng của bạn sử dụng các thư viện này thì ứng dụng của bạn có thể gặp lỗi sụp đổ khi đang chạy trong lần phát hành Android chính thức kế tiếp.
Các ứng dụng không nên phụ thuộc vào hoặc sử dụng các thư viện gốc không kèm theo trong NDK bởi vì chúng có thể thay đổi hoặc bị gỡ bỏ khỏi khi phát hành bản Android khác thay cho bản cũ. Việc chuyển từ OpenSSL sang BoringSSL là một ví dụ về sự thay đổi đó. Ngoài ra, các thiết bị khác nhau có thể cung cấp các mức độ tương thích khác nhau bởi không có yêu cầu nào về khả năng tương thích cho các thư viện nền tảng không đi kèm với NDK. Nếu bạn buộc phải sử dụng các thư viện không thuộc NDK trên các thiết bị cũ, hãy thực hiện quá trình tải phụ thuộc vào mức Android API.
Nhằm giúp bạn chẩn đoán các loại vấn đề này, sau đây là một số lỗi Java và NDK ví dụ bạn có thể gặp phải khi cố dựng ứng dụng với Android N:
Ví dụ lỗi Java:
java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libcutils.so" is not accessible for the namespace "classloader-namespace"
Ví dụ lỗi NDK:
dlopen failed: cannot locate symbol "__system_property_get" referenced by ...
Sau đây là một số cách khắc phục đối với ứng dụng gặp phải các kiểu lỗi này:
AndroidRuntime::getJavaVM -> GetJavaVM from <jni.h> AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or JavaVM::AttachCurrentThread from <jni.h>.
#include <sys/system_properties.h>
Android N có các thay đổi cho ứng dụng nhắm mục tiêu Android cho Công việc, bao gồm các thay đổi đối với cài đặt chứng chỉ, đặt lại mật khẩu, quản lý người dùng thứ hai và truy cập các mã định danh của thiết bị. Nếu bạn đang dựng các ứng dụng dành cho các môi trường Android cho Công việc thì bạn nên xem lại các thay đổi này và chỉnh sửa ứng dụng của mình cho phù hợp.
DevicePolicyManager.setCertInstallerPackage()
. Nếu trình cài đặt
chưa được cài thì hệ thống sẽ đưa ra một
IllegalArgumentException
.
DevicePolicyManager.resetPassword()
được nữa để xóa mật khẩu hoặc thay đổi
các mật khẩu đã đặt. Người quản lý thiết bị vẫn có thể đặt một mật khẩu nhưng chỉ
khi thiết bị không có mật khẩu, mã PIN hoặc mẫu hình.
DISALLOW_MODIFY_ACCOUNTS
đã có sẵn.
DISALLOW_ADD_USER
sẽ được đặt tự động. Điều này ngăn người dùng tạo các người dùng
thứ cấp không được quản lý. Ngoài ra, các phương thức CreateUser()
và
createAndInitial()
đã bị loại bỏ; phương thức
DevicePolicyManager.createAndManageUser()
mới sẽ thay thế chúng.
DevicePolicyManagewr.getWifiMacAddress()
. Nếu Wi-Fi chưa từng
được bật trên thiết bị đó thì phương thức này sẽ trả về một giá trị {@code null}.
Để biết thêm thông tin về các thay đổi đối với Android cho Công việc trong Android N, hãy xem Cập nhật của Android cho Công việc.
Bạn cần kiểm thử ứng dụng để đảm bảo rằng hành vi này không xảy ra. Bạn có thể thực hiện điều đó bằng cách gây ra một lỗi sụp đổ giống vậy khi tắt ứng dụng một cách thủ công qua DDMS.
Các ứng dụng nhắm mục tiêu N và cao hơn sẽ không bị tắt tự động khi có các thay đổi về mật độ; tuy nhiên, chúng có thể phản hồi khó khăn đối với các thay đổi cấu hình.