Chào mừng bạn đến với TiemDienThoai.com
Kiến thức · Lỗi theo triệu chứng

Máy lag đột ngột sau khi thêm nhiều widget cùng lúc lên màn hình chính

Giật xảy ra ngay lập tức do launcher phải dựng hình nhiều widget cùng lúc (giới hạn Binder IPC, bộ nhớ render), khác với widget chạy nền tốn pin.

Mục lục bài viết

Vừa sắp xếp lại màn hình chính, thêm liền một lúc bốn năm widget thời tiết, lịch, ghi chú, theo dõi sức khoẻ cho tiện nhìn tổng quan, máy lập tức khựng lại mỗi lần vuốt qua trang hoặc nhấn nút Home. Cảm giác giật xuất hiện ngay lập tức, không cần chờ vài giờ như các kiểu chậm tích luỹ thông thường. Điểm khác biệt nằm ở chỗ nguyên nhân không nằm ở bản thân từng widget đang chạy nền, mà nằm ở cách ứng dụng màn hình chính (launcher) phải xử lý cùng lúc nhiều khối giao diện mới trong một lần dựng hình.

Vì sao thêm nhiều widget cùng lúc gây giật ngay lập tức

Mỗi widget không phải một ứng dụng độc lập mà là một gói giao diện dựng sẵn (RemoteViews trên Android, WidgetKit snapshot trên iOS) được launcher vẽ lại mỗi khi màn hình được load. Thêm nhiều widget trong một lần thao tác buộc launcher tính lại toàn bộ lưới bố cục, tải hình ảnh, phông chữ và dữ liệu ban đầu cho từng widget gần như đồng thời. Nếu các widget này thuộc loại phức tạp như nhiều dòng dữ liệu, ảnh động, biểu đồ, tổng khối lượng dựng hình dễ vượt ngân sách xử lý cho một khung hình, gây khựng ngay ở lần cuộn đầu tiên chứ không tích luỹ dần theo thời gian.

Giới hạn dung lượng truyền dữ liệu giữa widget và launcher

Trên Android, dữ liệu giao diện của widget được truyền qua cơ chế liên tiến trình (Binder IPC) từ ứng dụng chủ tới launcher, vốn có giới hạn dung lượng cho mỗi lần truyền, thường quanh mức 1MB cho toàn bộ giao dịch. Khi nhiều widget nặng dữ liệu ảnh hoặc danh sách dài được thêm cùng lúc, tổng dung lượng truyền áp sát giới hạn này, buộc hệ thống chia nhỏ nhiều lần truyền hoặc nén lại dữ liệu, biểu hiện ra ngoài như một đợt giật kéo dài vài giây ngay sau khi thêm widget.

Bộ nhớ launcher phải giữ nhiều bản render cùng lúc, dễ nhầm sang lỗi từng widget

Launcher là một tiến trình riêng, có ngân sách bộ nhớ giới hạn như mọi ứng dụng khác. Mỗi widget đang hiển thị chiếm một phần bộ nhớ để giữ bản vẽ đã dựng, phục vụ việc cuộn qua lại giữa các trang mà không cần vẽ lại từ đầu. Thêm nhiều widget cùng lúc làm bộ nhớ launcher tăng đột ngột, có thể chạm ngưỡng khiến hệ thống thu hồi bớt bộ nhớ đệm của chính launcher, buộc một số widget vẽ lại từ đầu ngay trong lúc thao tác. Cách phân biệt với lỗi riêng của một widget là gỡ từng widget một: giật giảm dần theo số lượng gỡ bất kể loại nào là do launcher; chỉ một widget cụ thể khiến hết giật hoàn toàn là do chính widget đó có vấn đề.

Cách giảm giật khi vẫn muốn dùng nhiều widget

Nên thêm widget theo từng đợt cách nhau vài giây thay vì kéo thả liên tục, để launcher hoàn tất dựng hình từng widget trước khi nhận thêm dữ liệu mới. Ưu tiên kích thước widget nhỏ nhất đáp ứng đủ nhu cầu thay vì bản lớn nhiều chi tiết, vì kích thước lớn kéo theo nhiều lớp view lồng nhau hơn. Khởi động lại launcher (buộc dừng ứng dụng màn hình chính trên Android, khởi động lại máy trên iPhone) sau khi sắp xếp xong giúp giải phóng bộ nhớ đệm cũ để lần dựng hình tiếp theo diễn ra sạch.

Hiểu nhầm thường gặp

“Máy giật vì widget đang chạy ngầm tốn CPU liên tục.” Phần lớn widget không chạy nền liên tục mà chỉ cập nhật theo lịch hoặc theo sự kiện; độ giật ngay sau khi thêm nhiều widget cùng lúc chủ yếu đến từ chi phí dựng hình một lần của launcher, không phải từ việc các widget cùng nhau chiếm CPU nền như một ứng dụng đang chạy thật.

Xem thêm

Nội dung này thuộc cụm bài Chậm, lag, đứng máy: tổng hợp bài viết. Xem thêm trường hợp liên quan tại bài Widget trên iPhone hiển thị dữ liệu cũ, không cập nhật đúng giờ để hiểu thêm về cách hệ thống quản lý ngân sách cập nhật widget.

Hoàng Gia Bảo - kỹ thuật viên trưởng
Tác giả phụ trách chuyên mục

Kỹ thuật viên trưởng — Kỹ thuật viên trưởng tại trung tâm sửa chữa, trực tiếp chẩn đoán và xử lý hàng nghìn ca lỗi điện thoại mỗi năm.

Xem hồ sơ và chuyên môn →
Bình luận bài viết

Để lại bình luận

Thông tin liên hệ chỉ dùng để phản hồi, không hiển thị công khai.