Giới hạn đã biết
Nvirya AdGuard hoạt động trong khuôn khổ bảo mật của môi trường JavaScript trên trình duyệt và trình quản lý userscript. Trang này giải thích chi tiết các giới hạn kỹ thuật đã được xác minh trong mã nguồn v11.7.0 và các môi trường di động/máy tính thực tế.
A. Độ trễ xử lý quảng cáo YouTube trên di động#
Vì sao quảng cáo YouTube đôi khi xuất hiện thoáng qua trước khi được bỏ qua?#
Trên YouTube (youtube.com, m.youtube.com, youtu.be và youtube-nocookie.com), Nvirya AdGuard cô lập toàn bộ logic xử lý riêng cho YouTube bên trong hàm initYouTubeShield(), chỉ kích hoạt khi bật Bảo vệ video (config.playerProtection).
Script sử dụng hai cơ chế nối tiếp nhau để xử lý quảng cáo video YouTube:
- Cắt tỉa dữ liệu JSON của trình phát (
installYouTubeJsonPrunervàmainWorldShield):
Khi YouTube nạp dữ liệu trình phát ban đầu (window.ytInitialPlayerResponse) hoặc gọi /youtubei/v1/player, /youtubei/v1/watch, /youtubei/v1/next qua Window.fetch hoặc XMLHttpRequest, script kiểm tra đối tượng JSON và xóa các khóa adPlacements, playerAds, adSlots, adBreakHeartbeatParams và adBreakRenderer, đồng thời chặn các điểm cuối theo dõi quảng cáo độc lập (RE_YOUTUBE_AD_ENDPOINT, như /youtubei/v1/player/ad_break, /api/stats/ads, /pagead/ và doubleclick.net).
- Cơ chế dự phòng theo trạng thái DOM của trình phát (
scheduleVideoAdScanvàhandleAdVideo):
Nếu YouTube phân phối quảng cáo qua một luồng vượt qua bước cắt tỉa JSON ban đầu (ví dụ: dữ liệu trang ban đầu được phân tích trước khi userscript kịp tiêm trên Safari/WebKit di động, hoặc khi YouTube thay đổi cấu trúc phản hồi), quảng cáo sẽ bắt đầu nạp vào phần tử <video> chính. Khi đó, #movie_player hoặc .html5-video-player sẽ gắn thêm class .ad-showing hoặc .ad-interrupting.
Ngay khi hasAdPlayerMarker(video) phát hiện .ad-showing hoặc .ad-interrupting, hàm scheduleVideoAdScan() (chạy trên requestAnimationFrame với khoảng cách tối thiểu 150 ms và bộ hẹn giờ theo dõi 500 ms, kích hoạt bởi các sự kiện timeupdate, loadedmetadata, durationchange, play, ended, yt-navigate-finish và biến đổi DOM) sẽ thực thi handleAdVideo(video):
- Nhấp vào nút bỏ qua quảng cáo đang hiển thị khớp với
.ytp-skip-ad-button,.ytp-ad-skip-button,.ytp-ad-skip-button-modern,.ytp-ad-SkipButton,ytm-skip-ad-renderer button,.ytp-ad-overlay-close-buttonhoặc.videoAdUiSkipButton. - Lưu lại cài đặt âm thanh và tốc độ hiện tại của bạn (
muted,volume,playbackRate) vàoactiveAdVideos. - Tắt tiếng và tăng tốc độ phát: Đặt
video.muted = true,video.volume = 0vàvideo.playbackRate = 16. - Tua tới cuối luồng quảng cáo: Ngay khi
video.durationcó giá trị hữu hạn lớn hơn0.5giây (isFinite(duration) && duration > 0.5), script nhảy tới thời điểmMath.max(0, duration - 0.05)quavideo.currentTime(hoặcvideo.fastSeek()). - Khôi phục trạng thái trình phát (
restoreAdVideo): Ngay khi trạng thái.ad-showing/.ad-interruptingkết thúc, các giá trịmuted,volumevàplaybackRateban đầu của bạn được khôi phục nguyên vẹn.
Vì sao script không chặn trực tiếp luồng dữ liệu video#
Nvirya AdGuard chủ động cho phép các tên miền phân phối luồng phát media (RE_YOUTUBE_CDN_WHITELIST, bao gồm googlevideo.com, youtube.com/videoplayback, ytimg.com và youtube.com/s/player). Việc chặn thô bạo các yêu cầu mạng tải luồng video có thể khiến trình phát HTML5 bị treo, xoay vòng tải vô tận hoặc báo lỗi phát video. Do cơ chế dự phòng phải đợi trình phát gắn trạng thái .ad-showing và báo cáo video.duration hợp lệ (> 0.5 s) trước khi tua tới cuối, bạn có thể thấy một khung hình quảng cáo thoáng qua trong tích tắc trước khi quảng cáo bị đóng.
Phân biệt hành vi dự kiến và lỗi thực sự#
| Hiện tượng quan sát thấy | Ý nghĩa kỹ thuật | Hành động khuyến nghị |
|---|---|---|
| Quảng cáo lóe lên ngắn ngủi, bị tắt tiếng và nhảy tới cuối | Hành vi bình thường của cơ chế dự phòng handleAdVideo khi quảng cáo lọt vào thẻ <video> | Không cần thao tác gì thêm |
| Quảng cáo phát ở tốc độ thường có tiếng hoặc không tự qua | Cấu trúc trình phát YouTube đã thay đổi hoặc tính năng Bảo vệ video đang tắt | Kiểm tra công tắc Bảo vệ video trong tab Cài đặt và xem Khắc phục sự cố |
| Video xoay vòng tải mãi hoặc báo lỗi không phát được | Có thể xảy ra xung đột giữa bước cắt tỉa trong trang, thay đổi từ YouTube hoặc bộ lọc DNS/VPN bên ngoài | Thực hiện theo các bước khôi phục trong Khắc phục sự cố |
B. VPN, Bộ lọc DNS, Shadowrocket, Surge và Loon#
Nhiều người dùng di động và máy tính chạy Nvirya AdGuard song song với các công cụ lọc cấp mạng như Shadowrocket, Surge, Loon, AdGuard DNS, NextDNS hoặc VPN có tính năng chặn quảng cáo.
Sự tương tác giữa chặn cấp mạng và userscript#
Khi một trang web tải script quảng cáo hoặc tệp mồi nhử (bait request):
- Khi Nvirya AdGuard tự xử lý yêu cầu: Các hook trong trang (
mainWorldShieldvàinstallNetworkGuard) chặn các lệnhfetchvàXMLHttpRequesttới tên miền quảng cáo rồi trả về phản hồi200 OKgiả lập, hoặc chặn thẻ<script>và<img>để giả lập sự kiệnonloadvà khởi tạo các đối tượng giả lập (window.googletag,window.OBR,window.Criteo,window._taboola,window.apstag,window.COMSCORE,window.adsbygoogle). - Khi VPN hoặc bộ lọc DNS chặn tên miền trước: Yêu cầu bị từ chối ngay ở tầng DNS hoặc TCP/TLS (
ERR_NAME_NOT_RESOLVEDhoặcERR_CONNECTION_REFUSED) trước khi phản hồi chạm tới trình duyệt.- Đối với các lệnh gọi
fetch(), Nvirya AdGuard có nhánh.catch()dự phòng cho các tên miền quảng cáo phổ biến (doubleclick,googlesyndication,googleadservices,pagead,outbrain,taboola,criteo, v.v.) để biến lỗi mạng thành phản hồi200 OKgiả lập. - Tuy nhiên, nếu bộ lọc cấp mạng chặn thẻ HTML
<script>,<img>hoặc<iframe>nguyên bản trước khi hook ngữ cảnh chính của Nvirya AdGuard chạy—hoặc khi giới hạn sandbox WebKit ngăn tiêm script ngữ cảnh chính—trình duyệt sẽ phát sự kiệnerrornguyên bản mà userscript không phải lúc nào cũng chặn hoặc ghi đè được.
- Đối với các lệnh gọi
Khuyến nghị thực tế#
- Không phải mọi thông báo anti-adblock đều do VPN hay bộ lọc DNS gây ra. Các trang web dùng nhiều phương pháp phát hiện khác nhau, và một số tường anti-adblock vẫn kích hoạt bất kể cài đặt DNS.
- Không tắt toàn bộ VPN hoặc bộ lọc DNS trên toàn hệ thống. Nếu một trang web cụ thể từ chối hiển thị nội dung do phát hiện tên miền bị chặn ở tầng DNS (và việc tạm dừng Nvirya AdGuard vẫn không giải quyết được), bạn chỉ nên thử cho phép riêng trang web đó hoặc tên miền bị chặn nhầm trong công cụ proxy/DNS thay vì tắt bảo vệ mạng cho mọi trang.
C. Mức sử dụng CPU và Pin trên Android#
Việc chạy bất kỳ userscript nào trên các trang web hiện đại phức tạp đều tạo thêm khối lượng xử lý JavaScript. Trên thiết bị Android, mức tiêu thụ CPU và pin phụ thuộc vào:
- Độ phức tạp của trang và kích thước cây DOM: Các bảng tin cuộn vô tận, trang tỷ số/tài chính trực tiếp và ứng dụng trang đơn (SPA) tạo ra hàng nghìn biến đổi DOM mỗi phút.
- Nhân trình duyệt và Android System WebView: Các trình duyệt Android độc lập (như Firefox for Android, Cromite/Kiwi hoặc trình duyệt dựa trên WebView hệ thống như XBrowser) có tốc độ biên dịch JIT, thu gom rác (GC) và cơ chế tiêm userscript khác nhau.
- Các tính năng đang bật: Quét biến đổi DOM, kiểm tra Shadow DOM và lắng nghe sự kiện trình phát video sẽ tốn nhiều CPU hơn trên các trang liên tục cập nhật thuộc tính phần tử.
Các cơ chế giới hạn tài nguyên trong v11.7.0#
Nvirya AdGuard tích hợp sẵn nhiều giải pháp tối ưu hóa để giới hạn thời gian chiếm dụng CPU:
- Cô lập hoàn toàn bộ máy YouTube (
initYouTubeShield): Các bộ lắng nghe trình phát YouTube, bộ cắt tỉa JSON và quy tắc CSS của YouTube tuyệt đối không chạy trên các trang web khác. - Gom nhóm biến đổi trên công cụ tìm kiếm (
RE_SEARCH_DEBOUNCE_HOST): Trên Google Search và Bing Search, các đợt biến đổi DOM được gom nhóm trễ150 msvà bỏ qua các thuộc tính khung nội bộ (jsaction,data-ved,jscontroller). - Xử lý chia nhỏ theo khung thời gian (
processInChunks): Hàng đợi nút DOM (giới hạn ởMAX_QUEUE = 800) và hàng đợi kiểm tra bẫy (giới hạn ở1.400) được chia nhỏ xử lý với ngân sách tối đa8 msmỗi khung hình quarequestIdleCallbackhoặcrequestAnimationFrame. - Thoát nhanh khi kiểm tra bẫy (
isInvisibleTrap): Các thẻ văn bản nội tuyến phổ biến (<p>,<span>,<h1>–<h6>,<li>,<td>,<tr>,<code>, v.v.) và các nút nằm trong vùng bài viết chính (article,main,#content) được bỏ qua ngay lập tức trước khi gọiwindow.getComputedStyle()hoặcgetBoundingClientRect().
Cách giảm tải hoặc khoanh vùng lỗi hiệu năng#
Nếu một trang web cụ thể khiến máy Android nóng lên, giật lag hoặc hao pin:
- Chạm vào Nút thao tác nhanh (hoặc nhấn
Alt+A) và chọn Tạm dừng phiên này (hoặc Cho phép trang này) trong tab Tổng quan. - Nếu không cần tự động bỏ qua quảng cáo video trên trang đó, bạn có thể tắt Bảo vệ video trong tab Cài đặt.
- Nếu bạn đang bật Lọc kết nối sâu (
strictMode) trong Cài đặt, hãy lưu ý rằng chế độ này kích hoạt ẩn phần tử chỉ với 1 tín hiệu (signals >= 1 && config.strictMode), khiến script phải kiểm tra và ẩn nhiều phần tử hơn mặc định. - Nếu việc tạm dừng Nvirya AdGuard giúp trang hết giật lag ngay lập tức, hãy gửi báo cáo qua Gửi phản hồi kèm theo tên miền để tác giả kiểm tra và tối ưu hóa.
D. Giới hạn của iOS Safari và WebKit#
Các trình duyệt trên iOS và iPadOS (bao gồm Safari dùng trình quản lý Stay) đều chạy trên nhân WebKit của Apple với các rào cản bảo mật và cô lập sandbox nghiêm ngặt hơn so với trình duyệt máy tính và Android:
- Ngữ cảnh JavaScript bị cô lập (Isolated Worlds): Userscript trên iOS Safari thường chạy trong một ngữ cảnh tách biệt với ngữ cảnh JavaScript chính của trang web. Dù cả hai ngữ cảnh cùng chia sẻ cây DOM (như ẩn phần tử hoặc thêm thẻ
<style>), các biến toàn cục trênwindow(nhưwindow.fetch,window.open, haywindow.googletag) lại bị tách rời trừ khi chèn được thẻ<script>trực tiếp vào DOM của trang (injectMainWorldShield). - Chính sách bảo mật nội dung (CSP) và thời điểm tiêm script: Ngay cả khi
injectMainWorldShield()chèn thẻ<script>vàodocument.documentElement, Chính sách bảo mật nội dung (CSP) của trang web hoặc các script nội tuyến chạy sớm có thể chặn hoặc chạy trước script được tiêm. Bên cạnh CSP, mô hình sandbox tiện ích mở rộng của WebKit và việc thiếu API mạng đặc quyền cũng giới hạn khả năng can thiệp của userscript trên iOS. - Ý nghĩa của trạng thái
không hỗ trợ(unsupported) đối với Vượt chặn anti-adblock:
Trong v11.7.0, hàm checkBypassSupport() kiểm tra xem thiết bị có phải là iOS/iPadOS (isAppleDevice()) hay không và xác minh xem typeof window.__NVIRYA_MAIN_SHIELD__ !== 'undefined' có truy cập được trong ngữ cảnh hiện tại hay không.
- Khi
checkBypassSupport()trả vềfalsetrên iOS/iPadOS:- Trong mục Giới thiệu → Khả năng hỗ trợ, dòng Vượt chặn anti-adblock sẽ hiển thị nhãn
không hỗ trợ. - Trong tab Cài đặt, công tắc Vượt chặn anti-adblock sẽ bị làm mờ (vô hiệu hóa) kèm dòng chú thích: "Không khả dụng do giới hạn sandbox của iOS WebKit".
- Trong mục Giới thiệu → Khả năng hỗ trợ, dòng Vượt chặn anti-adblock sẽ hiển thị nhãn
- Trạng thái này phản ánh chính xác việc tính năng giả lập biến toàn cục ở ngữ cảnh chính (
__NVIRYA_MAIN_SHIELD__) không khả dụng trong môi trường WebKit bị cô lập đó. Các tính năng lọc CSS, Ẩn phần tử trên trang, Dọn khung trống và Mở khóa cuộn trang vẫn hoạt động bình thường.