Một repo Shell vừa lên GitHub hôm 24/10 vừa rồi, hiện đã có 499 sao. Tên nó là wangrongding/tv-fresh. Nội dung: hướng dẫn (viết dưới dạng agent skill, kèm script) để gỡ quảng cáo, đổi launcher, cài proxy và app xem phim trên Xiaomi TV bản nội địa Trung Quốc. Tất cả đều qua ADB, không đụng root, mọi thao tác có lệnh hoàn tác.
Nghe thì giống mấy bài blog “tinh chỉnh TV” đầy trên mạng. Nhưng cái làm tôi dừng lại là phần ghi chép reverse engineering: tác giả không chỉ đưa lệnh, mà giải thích tại sao lệnh đơn giản không chạy được trên MIUI TV, kèm bằng chứng từ dumpsys và bản dịch ngược từ vdex.
Nó giải quyết đúng cái đau của người dùng TV nội địa
Xiaomi TV bản nội địa chạy MIUI TV, launcher mặc định là PatchWall: một mớ nội dung gợi ý trộn quảng cáo, tin tức, banner khuyến mãi. Mở TV lên là thấy nó. Bấm HOME cũng về nó. Và cài launcher khác thì nó… vẫn về đó, vì MIUI TV có cơ chế chặn.
tv-fresh xử lý cả ba lớp vấn đề:
- Quảng cáo và tracking: gỡ các package như
com.miui.systemAdSolution(engine quảng cáo hệ thống),com.duokan.videodaily(màn hình tin tức đầu tiên),com.mitv.tvad, cùng mấy package analytics. Dùngpm uninstall --user 0, tức là gỡ ở user space, system partition còn nguyên, khôi phục bằng một lệnh. - Đổi launcher: cài Projectivy Launcher (mã nguồn mở) và làm cho HOME key luôn về đó. Đây là phần khó nhất và cũng là phần đáng đọc nhất của repo.
- Cài thêm app: Clash Meta for Android làm proxy, SmartTube thay YouTube chính thức, TVBox/OK影视 (FongMi) cho phim. Kèm mẹo import config qua
adb reverseđể né firewall máy tính.
Vì sao repo này đáng đọc hơn một bài tutorial thông thường
Phần lớn hướng dẫn trên mạng dừng ở “cài Set Home Activity là xong”. Repo này ghi lại rằng trên firmware MiTV-ASTP0 (Android 9), cách đó thất bại. Tác giả thử 5 cách khác nhau, ghi thành bảng kết quả, rồi mới đào vào nguyên nhân.
Nguyên nhân là “ba lớp chặn chồng lên nhau”: AOSP có rule khiến preferred activity bị bỏ qua nếu match score thấp hơn candidate khác; MIUI patch PMS để priority của launcher bên thứ ba bị kẹp về 0 (viết 1000 trong manifest cũng vô ích); và FallbackHome của com.android.tv.settings tự retry mỗi 20 giây khi không resolve được, gây ra màn hình đen loop.
Để tìm ra chỗ này, tác giả dùng vdexExtractor (tự compile) để bóc boot-framework.vdex 21MB và services.vdex 10MB, vì firmware này để framework.jar và services.jar là shell 183 byte rỗng. Baksmali 2.5.2 không đọc được cdex001, nên phải chuyển sang dùng chế độ disassembler tích hợp của vdexExtractor, đẻ ra file log 386MB. Đọc xong mới thấy rule resolve activity. Đó là công việc thật, không phải copy-paste.
Con số 499 sao trong chưa đầy 24 tiếng (tạo 24/10, update 25/10) phản ánh đúng mức độ “đói” của cộng đồng: ai mua Xiaomi TV nội địa cũng từng gặp PatchWall và cũng từng bó tay khi đổi launcher không được.
Dùng thử trong 5 phút
Trước hết bật ADB: vào Cài đặt, mục Giới thiệu, bấm phím OK trên remote 5-7 lần vào dòng “Model sản phẩm” hoặc “Số phiên bản”. Sau đó vào Cài đặt, Tài khoản và bảo mật, bật ADB debugging.
adb connect 192.168.1.4:5555
adb devices
Nếu trạng thái là unauthorized thì trên TV đang có hộp thoại RSA chờ bạn bấm “Cho phép”. Dưới đây là luồng đổi launcher hoàn chỉnh, đúng như README:

# 1. 装 Projectivy(armeabi-v7a 版)
adb install ProjectivyLauncher-*-xda-release.apk
# 2. 注册首选桌面
adb shell cmd package set-home-activity com.spocky.projengmenu/com.spocky.projengmenu.ui.home.MainActivity
# 3. 禁用 PatchWall(保留在系统分区,可随时还原)
adb shell pm uninstall --user 0 com.mitv.tvhome
# 4. 关键一步:禁用兜底页宿主(AOSP 设置包)
adb shell pm disable-user --user 0 com.android.tv.settings
# 5. 验证:HOME 键应落在 Projectivy
adb shell input keyevent 3 && adb shell dumpsys window windows | grep mCurrentFocus
Bước 4 là bước mà hầu hết hướng dẫn khác thiếu. Tác giả giải thích tại sao nó an toàn: người dùng MIUI TV nội địa thấy menu “Cài đặt” tiếng Trung là com.xiaomi.mitv.settings, còn com.android.tv.settings chỉ chứa FallbackHome và entry settings tiếng Anh, disable không ảnh hưởng dùng hàng ngày.
Nếu muốn dùng như agent skill (dành cho ai xài AI coding agent như omp), clone vào thư mục skills:
git clone https://github.com/wangrongding/tv-fresh ~/.agents/skills/tv-fresh
Sau đó ra lệnh bằng tiếng Việt hoặc tiếng Trung, agent tự route sang đúng task (debloat, launcher-swap, proxy-youtube, streaming-apps). README ghi rõ chỉ có 3 chỗ cần remote: bật ADB, bấm cho phép RSA, và cấp quyền VPN cho CMFA.
Rollback thì đơn giản:
adb shell cmd package install-existing com.mitv.tvhome
adb shell pm enable com.android.tv.settings
adb shell pm uninstall com.spocky.projengmenu
Ai nên dùng
Người có Xiaomi TV bản nội địa Trung Quốc (MiTV-ASTP0 là model được test, các model khác cùng firmware họ MIUI TV nhiều khả năng áp dụng được, nhưng README nói rõ cần tự đối chiếu). Người muốn dùng TV như một Android box sạch, không cần Google services, có SmartTube thay YouTube, có Clash để xem nội dung ngoài. Người làm dev muốn học cách troubleshoot một hệ thống đóng bằng ADB và reverse engineering.
Không phù hợp nếu bạn ngại gõ lệnh, hoặc TV còn bảo hành và bạn không muốn mất. Dù repo khẳng định mọi thứ đều khôi phục được, mỗi firmware có thể khác nhau, và cái fatal duy nhất (mất launcher cả mặc định lẫn bên thứ ba, phải factory reset) là khả năng có thật nếu làm sai thứ tự.
So sánh nhanh
Có nhiều hướng dẫn debloat MIUI TV khác trên mạng, nhưng đa số chỉ có bước gỡ package, không nói gì đến phần launcher, vì phần đó khó và firmware khác nhau fail khác nhau. Về launcher độc lập, Projectivy Launcher là lựa chọn phổ biến, có trên XDA. Còn tv-fresh là cái duy nhất tôi thấy ghi chép lại thất bại của các phương án “đúng chuẩn Android” trước khi đưa ra cách chạy được. So sánh với các tool kiểu Debloater universal (gỡ app hàng loạt) thì tv-fresh an toàn hơn nhờ tính “theo user, có hoàn tác”, nhưng cũng hẹp hơn vì gắn với firmware MIUI TV cụ thể.
Ưu điểm và hạn chế
Ưu: miễn phí, MIT license, được test thật, mọi bước có lệnh hoàn tác. Phần reverse engineering là tài liệu học tập tốt. Có SKILL.md nên agent hiểu được, tiện dùng lặp lại từng tháng khi OTA kéo quảng cáo trở về.
Hạn: repo mới, chỉ có 1 ngày tuổi tính đến lúc viết, mới test trên một model. Tài liệu viết bằng tiếng Trung và tiếng Anh lẫn lộn, ai không quen đọc tiếng Trung sẽ phải dùng Google Translate cho phần bảng package. Các interface TVBox trong README là do cộng đồng duy trì, sống chết thất thường, tác giả cũng ghi rõ “时活时死”. Và vì dùng pm uninstall --user 0, một bản OTA có thể cài lại các package đã gỡ, phải chạy lại script. Đây không phải giải pháp vĩnh viễn, chỉ là giải pháp có thể làm lại dễ dàng.
Tôi đánh giá cao cách tác giả viết phần “những gì đã thử và thất bại”. Đó là thứ giúp repo khác biệt với một bài blog khoe thành tích. Với 499 sao trong ngày đầu, nếu bạn có TV Xiaomi nội địa, đáng để clone về đọc trước khi làm theo bất kỳ hướng dẫn nào khác.
Repo: wangrongding/tv-fresh
