Các thay đổi về Android 6.0

Cùng với các tính năng và khả năng mới, Android 6.0 (API cấp 23) bao gồm nhiều các thay đổi về hệ thống và hành vi của API. Tài liệu này đánh dấu một số thay đổi quan trọng mà bạn nên nắm rõ và tính đến trong ứng dụng của mình.

Nếu bạn từng xuất bản một ứng dụng dành cho Android, hãy lưu ý rằng những thay đổi này trong nền tảng ảnh hưởng đến ứng dụng của bạn.

Quyền trong thời gian chạy

Bản phát hành này giới thiệu một mô hình quản lý quyền mới mà giờ đây, người dùng có thể quản lý trực tiếp quyền cho ứng dụng trong thời gian chạy. Mô hình này giúp người dùng cải thiện khả năng giám sát và kiểm soát đồng thời đơn giản hoá quy trình cài đặt và tự động cập nhật cho nhà phát triển ứng dụng. Người dùng có thể cấp hoặc thu hồi từng quyền đối với các ứng dụng đã cài đặt.

Trên những ứng dụng nhắm đến Android 6.0 (API cấp 23) trở lên, hãy nhớ kiểm tra và yêu cầu trong thời gian chạy. Để xác định xem ứng dụng của bạn đã được cấp quyền hay chưa, hãy gọi phương thức checkSelfPermission() mới . Để yêu cầu cấp quyền, hãy gọi hàm mới requestPermissions() . Ngay cả khi ứng dụng của bạn không nhắm đến Android 6.0 (API cấp 23), bạn vẫn nên kiểm thử ứng dụng theo mô hình quản lý quyền mới.

Để biết thông tin chi tiết về cách hỗ trợ mô hình quản lý quyền mới trong ứng dụng của bạn, hãy xem Làm việc với Quyền của hệ thống. Để biết các mẹo về cách đánh giá tác động đối với ứng dụng, xem Ghi chú về việc sử dụng quyền.

Chế độ Nghỉ và Chế độ chờ ứng dụng

Bản phát hành này giới thiệu các tính năng tối ưu hoá mới giúp tiết kiệm pin cho thiết bị và ứng dụng ở trạng thái rảnh. Các tính năng ảnh hưởng đến tất cả ứng dụng, vì vậy, hãy nhớ kiểm thử ứng dụng của bạn ở các chế độ mới này.

  • Nghỉ ngơi: Nếu người dùng rút phích cắm thiết bị và để thiết bị đứng yên và tắt màn hình, trong một khoảng thời gian, thiết bị chuyển sang chế độ Nghỉ ngơi. Chế độ này cố gắng giữ cho hệ thống trong trạng thái ngủ. Ở chế độ này, thiết bị sẽ định kỳ tiếp tục hoạt động bình thường trong một khoảng thời gian ngắn để quá trình đồng bộ hoá ứng dụng có thể diễn ra và hệ thống có thể thực hiện mọi thao tác đang chờ xử lý.
  • Chế độ chờ ứng dụng: Chế độ chờ ứng dụng cho phép hệ thống xác định xem một ứng dụng có ở trạng thái rảnh hay không khi người dùng không chủ động sử dụng ứng dụng đó. Hệ thống sẽ đưa ra quyết định này khi người dùng không chạm vào ứng dụng trong một khoảng thời gian nhất định. Nếu thiết bị chưa cắm điện, hệ thống sẽ tắt mạng truy cập và tạm ngưng quá trình đồng bộ hoá cũng như công việc đối với các ứng dụng mà hệ thống cho là đang ở trạng thái rảnh.

Để tìm hiểu thêm về những thay đổi tiết kiệm pin này, hãy xem Tối ưu hoá cho chế độ Nghỉ và Chế độ chờ ứng dụng.

Xoá ứng dụng HTTP Apache

Bản phát hành Android 6.0 sẽ ngừng hỗ trợ ứng dụng Apache HTTP. Nếu ứng dụng của bạn đang dùng ứng dụng này và nhắm đến Android 2.3 (API cấp 9) trở lên, hãy sử dụng lớp HttpURLConnection thay thế. API này hiệu quả hơn vì giảm mức sử dụng mạng thông qua phương thức nén minh bạch và lưu phản hồi vào bộ nhớ đệm, đồng thời giảm thiểu mức tiêu thụ điện năng. Để tiếp tục sử dụng API Apache HTTP, bạn trước tiên, phải khai báo phần phụ thuộc thời gian biên dịch sau đây trong tệp build.gradle:

android {
    useLibrary 'org.apache.http.legacy'
}

BoringSSL

Android sẽ chuyển từ OpenSSL sang SSL Nhàm chán thư viện của bạn. Nếu bạn đang sử dụng Android NDK trong ứng dụng của mình, đừng liên kết dựa trên thư viện mật mã không thuộc API NDK, chẳng hạn như libcrypto.solibssl.so. Các thư viện không phải là API công khai và có thể thay đổi hoặc bị lỗi mà không có thông báo trên các bản phát hành cũng như thiết bị. Ngoài ra, bạn có thể khiến bản thân gặp phải các lỗ hổng bảo mật. Thay vào đó, hãy sửa đổi mã gốc để gọi API mã hoá Java qua JNI hoặc để liên kết tĩnh với một thư viện mật mã học bạn chọn.

Quyền truy cập vào mã nhận dạng phần cứng

Để bảo vệ dữ liệu hiệu quả hơn cho người dùng, kể từ bản phát hành này, Android xoá quyền truy cập có lập trình vào giá trị nhận dạng phần cứng cục bộ của thiết bị cho ứng dụng bằng API Wi-Fi và Bluetooth. Chiến lược phát hành đĩa đơn WifiInfo.getMacAddress()BluetoothAdapter.getAddress() phương thức giờ đây sẽ trả về một giá trị không đổi của 02:00:00:00:00:00.

Để truy cập vào giá trị nhận dạng phần cứng của các thiết bị bên ngoài ở gần thông qua tính năng quét tìm Wi-Fi và Bluetooth, ứng dụng của bạn bây giờ phải có ACCESS_FINE_LOCATION hoặc Quyền đối với ACCESS_COARSE_LOCATION:

Lưu ý: Khi một thiết bị chạy Android 6.0 (API cấp 23) bắt đầu một quét tìm Wi-Fi hoặc Bluetooth ở chế độ nền, hoạt động sẽ hiển thị với các thiết bị bên ngoài dưới dạng bắt nguồn từ địa chỉ MAC ngẫu nhiên.

Thông báo

Bản phát hành này sẽ xoá phương thức Notification.setLatestEventInfo(). Sử dụng Notification.Builder để tạo thông báo. Để cập nhật một nhiều lần, hãy sử dụng lại phiên bản Notification.Builder. Gọi build() phương thức để lấy đã cập nhật bản sao Notification.

Lệnh adb shell dumpsys notification không còn in văn bản thông báo của bạn nữa. Thay vào đó, hãy dùng lệnh adb shell dumpsys notification --noredact để in văn bản trong đối tượng thông báo.

Các thay đổi về trình quản lý âm thanh

Trực tiếp đặt âm lượng hoặc tắt tiếng các sự kiện phát trực tiếp cụ thể qua AudioManager lớp không còn được hỗ trợ. Phương thức setStreamSolo() không được dùng nữa và bạn nên gọi phương thức requestAudioFocus() thay thế. Tương tự, Phương thức setStreamMute() là không dùng nữa; thay vào đó, hãy gọi phương thức adjustStreamVolume() rồi truyền vào giá trị chỉ hướng ADJUST_MUTE hoặc ADJUST_UNMUTE.

Chọn văn bản

Màn hình cho thấy các tính năng lựa chọn văn bản mới trong thanh công cụ nổi

Giờ đây, khi người dùng chọn văn bản trong ứng dụng, bạn có thể hiển thị các thao tác lựa chọn văn bản như Cắt, Sao chépDán vào một thanh công cụ nổi. Việc triển khai tương tác người dùng tương tự như cho thanh thao tác theo ngữ cảnh, như được mô tả trong Bật chế độ thao tác theo ngữ cảnh cho từng chế độ xem.

Để triển khai thanh công cụ nổi để lựa chọn văn bản, hãy thực hiện các thay đổi sau trong thanh công cụ hiện có ứng dụng:

  1. Trong đối tượng View hoặc Activity, hãy thay đổi ActionMode cuộc gọi từ startActionMode(Callback) đến startActionMode(Callback, ActionMode.TYPE_FLOATING).
  2. Thực hiện triển khai ActionMode.Callback hiện tại của bạn và mở rộng phương thức này Hãy ActionMode.Callback2.
  3. Ghi đè onGetContentRect() phương thức cung cấp toạ độ của đối tượng Rect nội dung (chẳng hạn như hình chữ nhật lựa chọn văn bản) trong chế độ xem.
  4. Nếu vị trí hình chữ nhật không còn hợp lệ và đây là phần tử duy nhất không còn hợp lệ, gọi phương thức invalidateContentRect().

Nếu bạn đang sử dụng Bản sửa đổi 22.2 của Thư viện hỗ trợ Android, lưu ý rằng thanh công cụ nổi không phải là tương thích ngược và appcompat kiểm soát các đối tượng ActionMode bằng cách mặc định. Điều này ngăn không cho thanh công cụ nổi hiển thị. Để bật Nhóm hỗ trợ ActionMode trong một AppCompatActivity, gọi getDelegate(), sau đó gọi setHandleNativeActionModesEnabled() cho hàng được trả về đối tượng AppCompatDelegate và đặt giá trị đầu vào tham số vào false. Lệnh gọi này trả về quyền kiểm soát đối tượng ActionMode cho khung này. Trong các thiết bị chạy Android 6.0 (API cấp 23), cho phép khung hỗ trợ ActionBar hoặc chế độ thanh công cụ nổi khi ở trên những thiết bị đang chạy Android 5.1 (API cấp 22) trở xuống, chỉ có các chế độ ActionBar được được hỗ trợ.

Các thay đổi về dấu trang của trình duyệt

Bản phát hành này sẽ ngừng hỗ trợ dấu trang chung. Chiến lược phát hành đĩa đơn android.provider.Browser.getAllBookmarks()android.provider.Browser.saveBookmark() hiện đã bị xoá. Tương tự, READ_HISTORY_BOOKMARKSWRITE_HISTORY_BOOKMARKS quyền đã bị xoá. Nếu ứng dụng của bạn nhắm đến Android 6.0 (API cấp 23) trở lên thì đừng truy cập dấu trang từ nhà cung cấp chung hoặc sử dụng quyền đối với dấu trang. Thay vào đó, ứng dụng nên lưu trữ nội bộ.

Các thay đổi đối với kho khoá Android

Với bản phát hành này, Nhà cung cấp Kho khoá Android không còn hỗ trợ nữa Quảng cáo tìm kiếm động. ECDSA vẫn được hỗ trợ.

Các khoá không yêu cầu mã hoá khi lưu trữ sẽ không còn bị xoá khi màn hình khoá bảo mật bị tắt hoặc đặt lại (ví dụ: do người dùng hoặc Quản trị viên thiết bị). Khoá yêu cầu mã hoá ở trạng thái tĩnh sẽ bị xoá trong những sự kiện này.

Những thay đổi về Wi-Fi và mạng

Bản phát hành này ra mắt các thay đổi sau đây về hành vi đối với các API Wi-Fi và API mạng.

  • Ứng dụng của bạn hiện chỉ có thể thay đổi trạng thái của các đối tượng WifiConfiguration nếu bạn đã tạo các đối tượng này. Bạn không được phép sửa đổi hoặc xoá Các đối tượng WifiConfiguration do người dùng hoặc ứng dụng khác tạo.
  • Trước đây, nếu một ứng dụng buộc thiết bị kết nối với một mạng Wi-Fi cụ thể bằng cách sử dụng enableNetwork() bằng disableAllOthers=true, thiết bị đã ngắt kết nối với các mạng khác, chẳng hạn như dữ liệu di động. Trong bản phát hành này, thiết bị không còn ngắt kết nối khỏi các mạng khác như vậy nữa. Nếu targetSdkVersion của ứng dụng là “20” trở xuống, ứng dụng này sẽ được ghim với ứng dụng đã chọn Mạng Wi-Fi. Nếu targetSdkVersion của ứng dụng là “21” trở lên, hãy sử dụng API đa mạng (chẳng hạn như openConnection(), bindSocket() và phiên bản mới bindProcessToNetwork()) để đảm bảo lưu lượng truy cập mạng của phương thức này được gửi trên mạng đã chọn.

Các thay đổi về dịch vụ camera

Trong bản phát hành này, mô hình truy cập vào các tài nguyên dùng chung trong dịch vụ máy ảnh đã được thay đổi từ mô hình truy cập "ưu tiên người đến trước" trước đây sang mô hình truy cập có mức độ ưu tiên cao ưu tiên các quy trình. Các thay đổi về hành vi của dịch vụ bao gồm:

  • Có quyền truy cập vào các tài nguyên trong hệ thống máy ảnh phụ, bao gồm cả việc mở và định cấu hình thiết bị máy ảnh được cấp dựa trên "mức độ ưu tiên" của quy trình đăng ký của khách hàng. Quy trình ứng dụng bằng các hoạt động mà người dùng nhìn thấy hoặc hoạt động ở nền trước thường được ưu tiên hơn, khiến tài nguyên của máy ảnh thu nạp người dùng và sử dụng ứng dụng đáng tin cậy hơn.
  • Các ứng dụng máy ảnh đang hoạt động đối với ứng dụng có mức độ ưu tiên thấp hơn có thể bị "loại bỏ" khi có mức độ ưu tiên cao hơn ứng dụng cố gắng sử dụng máy ảnh. Trong API Camera không dùng nữa, điều này dẫn đến onError() đang được cho khách hàng bị loại. Trong API Camera2, kết quả onDisconnected() được gọi cho khách hàng bị loại.
  • Trên những thiết bị có phần cứng máy ảnh phù hợp, các quy trình ứng dụng riêng biệt có thể mở và sử dụng đồng thời các thiết bị máy ảnh riêng biệt. Tuy nhiên, việc sử dụng đa quá trình trong đó việc truy cập đồng thời làm giảm đáng kể hiệu suất hoặc khả năng của bất kỳ thiết bị camera nào đang mở, hiện đã được dịch vụ camera phát hiện và cho phép. Sự thay đổi này có thể khiến những khách hàng có mức độ ưu tiên thấp hơn bị "loại bỏ" ngay cả khi không có ứng dụng nào khác trực tiếp cố gắng truy cập vào cùng một thiết bị máy ảnh.
  • Khi người dùng thay đổi người dùng hiện tại, ứng dụng máy ảnh đang hoạt động trong các ứng dụng do tài khoản người dùng trước đó sở hữu sẽ bị loại. Chỉ có quyền truy cập vào máy ảnh trong hồ sơ người dùng của người dùng thiết bị hiện tại. Trong thực tế, điều này có nghĩa là tài khoản "Khách" chẳng hạn sẽ không thể tiếp tục chạy các quy trình sử dụng hệ thống máy ảnh phụ khi người dùng chuyển sang một tài khoản khác.

Thời gian chạy

Môi trường thời gian chạy ART hiện đã triển khai đúng cách các quy tắc truy cập cho newInstance(). Chiến dịch này khắc phục vấn đề Dalvik kiểm tra không chính xác các quy tắc truy cập trong các phiên bản trước. Nếu ứng dụng của bạn sử dụng newInstance() phương thức và bạn muốn ghi đè các bước kiểm tra quyền truy cập, hãy gọi phương thức Phương thức setAccessible() có giá trị nhập tham số được đặt thành true. Nếu ứng dụng của bạn sử dụng thư viện appcompat phiên bản 7 hoặc thư viện recyclerview phiên bản 7, bạn phải cập nhật ứng dụng để sử dụng lên phiên bản mới nhất của các thư viện này. Nếu không, hãy đảm bảo rằng mọi lớp tuỳ chỉnh được tham chiếu từ XML đều được cập nhật để có thể truy cập vào các hàm khởi tạo lớp của chúng.

Bản phát hành này cập nhật hành vi của trình liên kết động. Trình liên kết động hiện hiểu được sự khác biệt giữa soname của thư viện và đường dẫn của thư viện đó ( công khai lỗi 6670) và tìm kiếm theo soname hiện là triển khai. Các ứng dụng từng hoạt động nhưng có mục nhập DT_NEEDED không hợp lệ (thường là các đường dẫn tuyệt đối trên hệ thống tệp của máy xây dựng) có thể không thành công khi tải.

Cờ dlopen(3) RTLD_LOCAL hiện đã được triển khai chính xác. Lưu ý rằng RTLD_LOCAL là giá trị mặc định, vì vậy, các lệnh gọi đến dlopen(3) không sử dụng rõ ràng RTLD_LOCAL sẽ bị ảnh hưởng (trừ phi ứng dụng của bạn rõ ràng sử dụng RTLD_GLOBAL). Bằng RTLD_LOCAL, các biểu tượng sẽ không áp dụng cho thư viện được tải bằng các lệnh gọi sau này đến dlopen(3) (trái ngược với việc được các mục nhập DT_NEEDED tham chiếu).

Trên các phiên bản Android trước, nếu ứng dụng của bạn yêu cầu hệ thống tải một thư viện dùng chung bằng chuyển vị trí văn bản, hệ thống đã cho thấy cảnh báo nhưng vẫn cho phép tải thư viện. Kể từ bản phát hành này, hệ thống sẽ từ chối thư viện này nếu phiên bản SDK mục tiêu của ứng dụng là 23 trở lên. Để giúp bạn phát hiện xem thư viện có tải được hay không, ứng dụng của bạn nên ghi nhật ký Lỗi dlopen(3) và bao gồm văn bản mô tả sự cố mà dlerror(3) cuộc gọi bị trả về. Để tìm hiểu thêm về cách xử lý việc chuyển vị trí văn bản, hãy xem hướng dẫn.

Xác thực APK

Giờ đây, nền tảng này sẽ xác thực tệp APK chặt chẽ hơn. Tệp APK bị coi là bị hỏng nếu một tệp được khai báo trong tệp kê khai nhưng không hiển thị trong chính APK. APK phải được ký lại nếu có bất kỳ nội dung bị xoá.

Kết nối USB

Theo mặc định, các kết nối thiết bị qua cổng USB hiện được đặt thành chế độ chỉ sạc. Để truy cập thiết bị và nội dung của thiết bị qua kết nối USB, người dùng phải cấp quyền rõ ràng cho tương tác. Nếu ứng dụng của bạn hỗ trợ các hoạt động tương tác của người dùng với thiết bị qua cổng USB, hãy xem xét khi cân nhắc rằng tương tác phải được bật một cách rõ ràng.

Các thay đổi của Android for Work

Bản phát hành này bao gồm các thay đổi sau đây về hành vi cho Android for Work:

  • Danh bạ công việc trong bối cảnh cá nhân. Trình quay số của Google Giờ đây, Nhật ký cuộc gọi sẽ hiển thị danh bạ công việc khi người dùng xem các cuộc gọi trước đây. Chế độ cài đặt setCrossProfileCallerIdDisabled() để true ẩn thông tin liên hệ trong hồ sơ công việc khỏi Nhật ký cuộc gọi của Google Dialer. Danh bạ công việc có thể là chỉ hiển thị cùng với danh bạ cá nhân với các thiết bị qua Bluetooth nếu bạn đã đặt setBluetoothContactSharingDisabled() thành false. Theo mặc định, mục này được đặt thành true.
  • Xoá cấu hình Wi-Fi: Cấu hình Wi-Fi do Chủ sở hữu hồ sơ thêm (ví dụ: thông qua lệnh gọi đến addNetwork()) hiện sẽ bị xoá nếu hồ sơ công việc đó bị xoá.
  • Khoá cấu hình Wi-Fi: Mọi cấu hình Wi-Fi được tạo bởi Người dùng không thể sửa đổi hoặc xóa Chủ sở hữu thiết bị đang hoạt động được nữa nếu WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN khác 0. Người dùng vẫn có thể tạo và sửa đổi cấu hình Wi-Fi của riêng mình. Thiết bị đang hoạt động Chủ sở hữu có đặc quyền chỉnh sửa hoặc xóa mọi cấu hình Wi-Fi, bao gồm những ứng dụng không phải do họ tạo ra.
  • Tải trình kiểm soát chính sách thiết bị xuống thông qua tính năng thêm Tài khoản Google: Khi một người dùng tài khoản yêu cầu quản lý thông qua ứng dụng kiểm soát chính sách thiết bị (DPC) được thêm vào thiết bị bên ngoài ngữ cảnh được quản lý, hiện quy trình thêm tài khoản sẽ nhắc người dùng cài đặt WPC phù hợp. Hành vi này cũng áp dụng cho tài khoản được thêm qua Cài đặt > Tài khoản và trong trình hướng dẫn thiết lập thiết bị ban đầu.
  • Thay đổi đối với một số hành vi cụ thể của API DevicePolicyManager:
    • Gọi setCameraDisabled() chỉ ảnh hưởng đến máy ảnh đối với người dùng đang gọi; và bạn sẽ không thể gọi nó từ hồ sơ được quản lý ảnh hưởng đến các ứng dụng máy ảnh chạy trên người dùng chính.
    • Ngoài ra, setKeyguardDisabledFeatures() phương thức hiện có sẵn cho Chủ sở hữu hồ sơ cũng như Chủ sở hữu thiết bị.
    • Chủ sở hữu hồ sơ có thể đặt các hạn chế sau đây khi bảo vệ bàn phím:
    • Các phương thức DevicePolicyManager.createAndInitializeUser()DevicePolicyManager.createUser() không còn được dùng nữa.
    • setScreenCaptureDisabled() phương thức hiện tại cũng chặn cấu trúc hỗ trợ khi một ứng dụng của người dùng cụ thể đang chạy ở nền trước.
    • EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM hiện được đặt mặc định thành SHA-256. SHA-1 vẫn được hỗ trợ để tương thích ngược nhưng sẽ bị xoá trong tương lai. EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM hiện chỉ chấp nhận SHA-256.
    • API trình khởi tạo thiết bị từng tồn tại trong Android 6.0 (API cấp 23) nay đã bị xoá.
    • EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS đã bị xoá nên NFC sẽ tăng không thể cấp phép bằng cách lập trình để mở khóa một thiết bị được bảo vệ đã đặt lại về trạng thái ban đầu.
    • Giờ đây, bạn có thể sử dụng EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE dữ liệu bổ sung để truyền dữ liệu đến ứng dụng của chủ sở hữu thiết bị trong quá trình cấp phép NFC của thiết bị được quản lý.
    • API Android for Work được tối ưu hóa cho các quyền khi bắt đầu chạy M, bao gồm cả Hồ sơ công việc, lớp hỗ trợ và các lớp khác. Các API quyền DevicePolicyManager mới không ảnh hưởng đến các ứng dụng phát hành trước M.
    • Khi người dùng rời khỏi phần đồng bộ của quy trình thiết lập được bắt đầu thông qua một ACTION_PROVISION_MANAGED_PROFILE hoặc Ý định ACTION_PROVISION_MANAGED_DEVICE, hệ thống hiện sẽ trả về mã kết quả RESULT_CANCELED.
  • Thay đổi đối với các API khác:
    • Mức sử dụng dữ liệu: Lớp android.app.usage.NetworkUsageStats đã được đổi tên NetworkStats
  • Thay đổi đối với chế độ cài đặt chung: