Bỏ qua để đến nội dung
VLivev1.1.2

06 — Lỗi thường gặp & cách chẩn đoán

Hướng dẫn bật log và chẩn đoán các lỗi thường gặp khi tích hợp SDK Interactive Android.

Xem Markdown

SDK ghi log qua hàm logcat {} — chỉ hoạt động khi AAR được build ở buildType debug (BuildConfig.DEBUG = true của module :interactive). Tag mặc định: Interactive.

Terminal window
adb logcat -s System.out | grep Interactive

Các chuỗi log đáng chú ý:

LogÝ nghĩa
overlay manager: Khởi tạo mới InnteractiveConstructor chạy
socket io management initialization: socketUrl = ...Chuẩn bị kết nối
overlay manager socket: connected socket / join room successVào phòng thành công
socket io management addEvents: received overlayCó overlay từ server
<-- check point: showOverlay -->Bắt đầu dựng WebView
VLive: Website onPageFinished url: ...Template tải xong
overlay web view manager: add cachesOverlay bị hoãn vì isVisible = false
socket io management prevent ex-overlay: user answeredBị chặn do đã trả lời

2. Overlay không hiển thị — cây chẩn đoán

Phần tiêu đề “2. Overlay không hiển thị — cây chẩn đoán”
flowchart TD
A["Overlay không hiện"] --> B{"Log có 'received overlay' không?"}
B -->|"không"| C{"Log có 'join room success' không?"}
C -->|"không"| C1["Kiểm tra: joinRoom đã gọi chưa,<br/>đúng mediaId chưa, mạng/tenantId/token,<br/>môi trường DEV/STG/PROD có khớp server không"]
C -->|"có"| C2["Server chưa đẩy overlay cho media này<br/>→ kiểm tra kịch bản phía vận hành"]
B -->|"có"| D{"Log có 'showOverlay' không?"}
D -->|"không"| E["Bị chặn ở tầng nghiệp vụ — xem mục 3"]
D -->|"có"| F{"Log có 'onPageFinished' không?"}
F -->|"không"| F1["WebView không tải được template:<br/>kiểm tra mạng, chứng chỉ SSL,<br/>usesCleartextTraffic nếu URL là http"]
F -->|"có"| G["Overlay đã render nhưng không nhìn thấy<br/>→ vấn đề layout, xem mục 4"]

Đối chiếu log với bảng lý do (chi tiết ở 05 — Tracking):

Triệu chứngNguyên nhânCách xử lý
user haven't logged in yetTenant vtvlive, chưa initToken, overlay không cho ẩn danhGọi initToken() sau khi đăng nhập
timelineId not foundPayload thiếu timelineIdBáo phía server
socket is not connectSocket rớt ngay lúc xử lýKiểm tra mạng; SDK sẽ tự reconnect sau 5s
duplicate predict overlay / duplicate miniGame overlayTrùng timelineId với overlay đang hiển thịHành vi đúng thiết kế
prevent ex-overlay: user answeredĐã trả lời mốc này (pref ex_*)Xoá dữ liệu app nếu muốn test lại
ex-overlay duration < 10sOverlay bù quá ngắnHành vi đúng thiết kế
Cancel target_mismatchtargets không khớp DEVICE_TYPEBuild đúng biến thể (androidmobile / androidtv) hoặc sửa kịch bản
Cancel expired_durationOverlay đã hết thời lượng tính từ missTimeHành vi đúng thiết kế
add caches mà không thấy hiệnisVisible = false (chưa Connected)Overlay sẽ hiện khi socket connect; nếu không bao giờ connect → xem mục 5

4. Overlay render nhưng không nhìn thấy / sai vị trí

Phần tiêu đề “4. Overlay render nhưng không nhìn thấy / sai vị trí”
Nguyên nhânDấu hiệuXử lý
OverlayView có kích thước 0Log render bình thường, màn hình trốngĐặt layout_width/height ràng buộc rõ ràng; kiểm tra bằng cách set tạm setBackgroundColor(Color.YELLOW)
OverlayView bị player vẽ đèOverlay “nhấp nháy” rồi mấtKhai báo OverlayView sau player trong layout, hoặc tăng elevation/translationZ
OverlayView lớn hơn khung videoOverlay lệch ra ngoài vùng hìnhRàng buộc OverlayView trùng khít khung 16:9 của player
OverlayView đang INVISIBLESau khi mất kết nốiSDK gọi temporaryLock() khi disconnect; sẽ visible() lại khi connect
Overlay là SurfaceView player che WebViewChỉ xảy ra với một số playerDùng TextureView cho player, hoặc đặt OverlayView trong ViewGroup riêng ở trên

Danh sách kiểm tra:

  1. Môi trường: EnvInteractive phải khớp hệ thống server (DEV/STG/PROD) — URL lấy từ native, không sửa được ở app.
  2. tenantId: sai tenant → server từ chối phòng.
  3. Quyền: thiếu INTERNET → không có log lỗi rõ ràng, chỉ thấy connect error.
  4. Token hết hạn: header Authorization sai → có thể bị từ chối tuỳ cấu hình server.
  5. liboverlay.so bị loại bỏ: nếu app dùng abiFilters hoặc split ABI mà thiếu kiến trúc, Utils sẽ ném UnsatisfiedLinkError ngay khi khởi tạo → INTERACTIVE_SOCKET_URL rỗng. Kiểm tra bằng unzip -l app-release.apk | grep liboverlay.

Log socket io management initialization: url value uninitialized chính là dấu hiệu của trường hợp 5.


6. Lỗi biên dịch / chạy sau khi tích hợp AAR

Phần tiêu đề “6. Lỗi biên dịch / chạy sau khi tích hợp AAR”
LỗiNguyên nhânXử lý
NoClassDefFoundError: io/socket/client/IOThiếu dependency bắc cầuKhai báo đủ các thư viện ở 02 §3
ClassCastException / crash khi mở dialogActivity không phải FragmentActivityDùng AppCompatActivity
Dialog không mở, log showPredictDialog erroractivity as? FragmentActivity trả nullNhư trên
Không nhận được callback từ WebView khi bật R8JS interface bị obfuscateThêm rule @JavascriptInterface ở 02 §14
Overlay không nhận dữ liệu (GET_DATA_INTERACTIVE)Template chưa gửi LOADED_OVERLAYPhối hợp với đội web template
UnsatisfiedLinkError: liboverlay.soThiếu ABIKiểm tra ndk.abiFilters, không loại bỏ thư viện native

Nguyên nhânXử lý
App không gọi receiveTrackingTime()Thêm vòng lặp 1 giây sau joinRoom(type = 2)
Bơm sai đơn vị (mili-giây thay vì giây)Chia player.currentPosition cho 1000
Người dùng tua qua mốcSDK so khớp đúng giây; overlay của mốc bị bỏ qua — đây là giới hạn hiện tại
Chưa đăng nhập, overlay không allowAnonymouscheckShowQuestion bỏ qua; đăng nhập rồi joinRoom lại
Kịch bản trả về rỗngKiểm tra log response vod failed, xác nhận mediaId và token

SDK có tự bám vòng đời Activity không? Không. LifecycleOverlay hiện rỗng. App phải tự gọi releaseAll(). Riêng LiveData của socket được observe theo LifecycleOwner nên tự dừng phát khi Activity không ở trạng thái active.

Có thể hiện nhiều overlay cùng lúc không? Không. OverlayView.addViewCommon* gọi clearViews() trước khi thêm → luôn chỉ một WebView overlay. Nút Predict/Lucky là view riêng nên có thể tồn tại song song với overlay (SDK chủ động tắt chúng khi mini game xuất hiện).

Đổi tài khoản giữa chừng thì sao? Gọi initToken(tokenMới, userIdMới). Nếu đang Live, SDK tự vào lại phòng với token mới.

Số người xem có chính xác không? onHandleLiveViews trả về count + 230 (hằng số cộng thêm trong mã hiện tại). Nếu cần số thô, app tự trừ lại.

Có cần gọi releaseAll() trước mỗi joinRoom() không? Không cần — joinRoom() đã tự cleanUp().

Xoay màn hình có mất overlay không? Không, nếu Activity khai báo configChanges="orientation|screenSize". Nếu Activity bị recreate, phải dựng lại OverlayManager và joinRoom() lại.

SDK dùng WebView của hệ thống? Có — OverlayWebView kế thừa android.webkit.WebView, bật JavaScript và DOM storage, nền trong suốt, cacheMode = LOAD_NO_CACHE, chặn điều hướng ngoài (shouldOverrideUrlLoading trả true).


← Tracking emit-ack · Về mục lục