Cài một app xong rồi tự hỏi nó lấy những gì của mình, gửi về đâu, có tắt được không. Trả lời mấy câu đó trên Android hiện tại khá mệt: phải mở Settings xem permission, rồi đoán xem cái URL trong code là telemetry hay SDK quảng cáo, rồi phân vân tắt cái này có làm app hỏng không. NOIR gom hết mấy bước đó vào một CLI chạy trên máy tính, nối với điện thoại qua adb.
Nó làm gì, cụ thể
NOIR đọc danh sách app trên máy đang cắm, lọc ra những app vừa có quyền mạng vừa có quyền nhạy cảm. Với từng app, nó không kéo nguyên APK về mà chạy unzip + strings ngay trên thiết bị để rút URL từ các file dex, chỉ gửi về vài KB endpoint. Cách này tránh chuyện ngồi chờ pull mấy trăm MB APK qua cáp.
Sau đó nó phân loại theo package name và domain: Xiaomi, Google, Tencent, AMap và đại loại thế, kèm nhóm chức năng (telemetry, quảng cáo, định vị, bàn phím). Từ quyền và endpoint, nó tính điểm rủi ro. Phần mình thấy hữu ích nhất là bước ghép dữ liệu: nó dịch permission thành “app này chạm được vào gì” (vị trí, danh bạ, SMS, cuộc gọi, micro, camera, màn hình, danh sách app, device ID, file, lịch, tài khoản), rồi đối chiếu với domain đích để ra câu “dữ liệu loại này có thể chảy về chỗ kia”.
Có một chi tiết ít tool quan tâm: shared UID. Mấy app chạy dưới android.uid.system thực chất dùng chung một tập quyền, nên nhìn permission riêng lẻ của từng app là hiểu sai. NOIR liệt kê luôn nhóm nào đang chia sẻ UID với nhau.
Ở tầng manifest, nó parse file AXML nhị phân và chỉ ra component export không có permission bảo vệ, app bật cleartext traffic, bật backup, debuggable, targetSdk bao nhiêu. Đây là mấy thứ mà dân review app thường kiểm tra tay.
Cuối cùng là đề xuất xử lý, chia ba nhóm: chạy được luôn, cần người xác nhận, đừng động vào. Mỗi hành động đều sinh kèm lệnh rollback. Nếu cần đào sâu thì deep kéo một APK về, chạy jadx, tìm mấy call kiểu Runtime.exec, DexClassLoader, setApplicationEnabledSetting, MediaProjection.
Vì sao 817 sao trong hai ngày
Repo tạo ngày 31/10/2026, cập nhật ngày 2/11/2026. Hai ngày được 817 sao, tốc độ đó nói lên nhu cầu chứ không phải chất lượng code. Nhu cầu thì rõ: điện thoại nội địa Trung Quốc và mấy bản ROM đóng gói nhiều bloatware vẫn là chủ đề nóng với người dùng cuối lẫn dev. Ai cũng muốn biết cái app hệ thống tên lạ hoắc đang gửi gì về server nào.
Điểm khác biệt so với đám script debloat rải rác trên GitHub là NOIR làm theo hướng audit có báo cáo: JSON, Markdown, danh sách domain tách riêng theo nhóm. Nó cũng tự nhận giới hạn: không root, không sửa phân vùng hệ thống, không tự uninstall trừ khi bạn gõ --aggressive. Với một tool đụng vào app hệ thống, việc nói rõ “tôi không làm gì” quan trọng ngang việc nói “tôi làm được gì”.
Cài và chạy thử
Cách nhanh nhất là tải bản portable trong Releases. Bản macOS, Windows, Linux đều có, và gói portable mang sẵn runtime nên không cần cài Java:
noir-v0.1.1-macOS-portable.zip
noir-v0.1.1-Windows-portable.zip
noir-v0.1.1-Linux-portable.zip
SHA256SUMS.txt
Giải nén rồi bấm file khởi động: Start NOIR.command trên macOS, Start NOIR.bat trên Windows, Start-NOIR.sh trên Linux. Trên macOS nếu bị chặn Gatekeeper thì mở bằng chuột phải, hoặc gỡ quarantine:
xattr -dr com.apple.quarantine "Start NOIR.command" NOIR.app
Build từ source cũng gọn:
git clone https://github.com/Verlintas/NOIR
cd NOIR
./gradlew :cli:installDist
./cli/build/install/noir/bin/noir --about
Gõ noir không tham số là vào wizard. Nó kiểm tra adb, thiếu thì hỏi có muốn tải về ~/.noir/tools không. Không thấy thiết bị thì in luôn các bước bật developer mode và USB debugging (có ghi riêng đường đi trên HyperOS), rồi chờ tối đa 180 giây để bạn cắm cáp. Xong thì hỏi “bắt đầu scan?” và “chạy 19 hành động an toàn này?”.
Kiểm tra môi trường trước cũng được:

noir doctor
Output dạng text, không có bảng màu mè. Các lệnh chính:
noir scan # full scan, xuất JSON / Markdown / danh sách domain
noir ui # scan + render dashboard
noir auto # scan + phân loại + lập kế hoạch xử lý (dry-run)
noir auto --apply # chạy các thao tác appops an toàn (rollback được)
noir deep com.example.app # pull + jadx + grep keyword
noir block com.example.app # in lệnh xử lý
Muốn đào cả loạt app rủi ro cao:
noir deepscan --top 30
noir deepscan --jobs 4
Kết quả đổ vào thư mục noir-out: report.json, report.md, domains-trackers.txt, domains-functional.txt, plan.txt, rollback.txt. Việc tách domain thành trackers với functional khá thực dụng: mấy cái functional là push, đăng nhập, cập nhật, thanh toán, đồng bộ cloud. Chặn nhầm mấy domain này là app chết ngay, nên tách sẵn để khỏi đẩy cả file vào blocklist.
Ai nên dùng
Người dùng Android hay vọc máy, đặc biệt máy nội địa hoặc ROM nhiều app hệ thống, là đối tượng rõ nhất. Bạn scan một lượt, xem app nào vừa có quyền vị trí vừa có quyền đọc SMS vừa gửi dữ liệu về domain telemetry, rồi quyết định tắt appops cho nó.
Dev làm app Android cũng dùng được để soi chính app của mình: xem ngoài mấy SDK mình cố ý thêm thì còn thằng nào đang gọi endpoint lạ không, manifest có component export thừa không, có bật cleartext không. Chạy --only 'com\.congty\.' để giới hạn phạm vi.
Còn security researcher thì có thêm deep với jadx. Nhưng nhớ đọc phần disclaimer: tool này nhắm vào thiết bị của mình, app của mình, hoặc nghiên cứu đã được cấp phép.
So sánh nhanh
Mấy tool debloat quen thuộc (Universal Android Debloater hay các script ADB rời) chủ yếu liệt kê package rồi cho disable/uninstall, không phân tích endpoint và không chấm điểm rủi ro. Chúng giải quyết “gỡ app nào”, còn NOIR giải quyết “app nào đang làm gì với dữ liệu”. Ngược lại, nếu mục tiêu duy nhất của bạn là dọn bloatware thì mấy tool kia nhanh hơn vì không phải chờ scan và trích dex. Về mặt phân tích tĩnh APK, jadx hay MobSF làm sâu hơn nhiều, nhưng chúng không có luồng adb trên thiết bị thật và không tự sinh kế hoạch xử lý kèm rollback. NOIR đứng ở giữa: đủ nhẹ để chạy trên máy cá nhân, đủ cụ thể để ra quyết định.
Ưu điểm và mấy chỗ cần cân nhắc
Ưu điểm đáng kể nhất là tính minh bạch. Tool không gọi mạng, không telemetry, không check version, không crash report. Request ra ngoài duy nhất là noir setup khi tải adb/jadx. Báo cáo chỉ ghi vào thư mục bạn chỉ định. Với một tool đọc dữ liệu riêng tư thì đây là tiêu chuẩn tối thiểu, và NOIR làm đúng.
Thứ hai là rollback. Mọi thao tác appops đều có lệnh hoàn tác trong rollback.txt. Mấy tool debloat khác thì thường phải nhớ tay hoặc cài lại app. Cái này đáng giá, nhất là khi bạn lỡ tắt quyền của một app mình dùng hằng ngày.
Hạn chế thì có. Repo mới ra, version 0.1.1, cập nhật lần cuối ngày 2/11/2026. Tức là tính ổn định chưa được kiểm chứng nhiều, API và output format có thể đổi. README khá dài và chi tiết nhưng chủ yếu bằng tiếng Trung ở phần mô tả gốc, dù lệnh và output thì tiếng Anh. Ai không đọc được tiếng Trung vẫn dùng được vì phần usage viết rõ, nhưng phần giải thích triết lý thiết kế thì hụt.
Phân loại domain theo vendor và category phụ thuộc vào một danh sách nội bộ. Danh sách này có thể thiếu domain mới hoặc xếp nhầm domain vào trackers. Đừng coi điểm rủi ro là chân lý, nó là gợi ý để bạn xem tiếp. Tương tự với kết quả deep: grep mấy từ khóa như Runtime.exec trong code đã obfuscate thì tỉ lệ false positive khá cao, và tìm không thấy không có nghĩa là app sạch.
License MIT, thoải mái dùng và sửa. Chỉ cần nhớ báo cáo có thể chứa package name và endpoint trên máy bạn, chia sẻ công khai thì tự kiểm tra trước.
Nếu bạn có một chiếc Android với mấy chục app hệ thống mà không biết cái nào đang làm gì, dành 10 phút chạy noir scan rồi đọc report.md. Kể cả không tắt gì, bạn cũng có một danh sách cụ thể về việc dữ liệu đang đi đâu. Repo ở đây: Verlintas/NOIR.
