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.so
và libssl.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()
và
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
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ép và Dá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:
- Trong đối tượng
View
hoặcActivity
, hãy thay đổiActionMode
cuộc gọi từstartActionMode(Callback)
đếnstartActionMode(Callback, ActionMode.TYPE_FLOATING)
. - 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ãyActionMode.Callback2
. - Ghi đè
onGetContentRect()
phương thức cung cấp toạ độ của đối tượngRect
nội dung (chẳng hạn như hình chữ nhật lựa chọn văn bản) trong chế độ xem. - 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()
và android.provider.Browser.saveBookmark()
hiện đã bị xoá. Tương tự, READ_HISTORY_BOOKMARKS
và WRITE_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ượngWifiConfiguration
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ằngdisableAllOthers=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ếutargetSdkVersion
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ếutargetSdkVersion
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ớibindProcessToNetwork()
) để đả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 đếnonError()
đang được cho khách hàng bị loại. Trong APICamera2
, 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 đã đặtsetBluetoothContactSharingDisabled()
thànhfalse
. Theo mặc định, mục này được đặt thànhtrue
. - 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:
KEYGUARD_DISABLE_TRUST_AGENTS
vàKEYGUARD_DISABLE_FINGERPRINT
, ảnh hưởng đến chế độ cài đặt bàn phím cho người dùng chính của hồ sơ.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS
, chỉ ảnh hưởng đến thông báo do ứng dụng tạo trong hồ sơ được quản lý.
- Các phương thức
DevicePolicyManager.createAndInitializeUser()
và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 Ý địnhACTION_PROVISION_MANAGED_DEVICE
, hệ thống hiện sẽ trả về mã kết quảRESULT_CANCELED
.
- Gọi
- 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ênNetworkStats
- Mức sử dụng dữ liệu: Lớp
- Thay đổi đối với chế độ cài đặt chung:
- Bạn không thể đặt các chế độ cài đặt này nữa qua
setGlobalSettings()
:BLUETOOTH_ON
DEVELOPMENT_SETTINGS_ENABLED
MODE_RINGER
NETWORK_PREFERENCE
WIFI_ON
- Giờ đây, bạn có thể đặt các cài đặt chung này thông qua
setGlobalSettings()
:
- Bạn không thể đặt các chế độ cài đặt này nữa qua