Chú thích:
- adb nên được thiết lập trong PC.
- Đối với Android sớm hơn phiên bản 4.4.x, có thể cần truy cập root.
- Một số lệnh sẽ không hoạt động trên Android sớm hơn phiên bản 5.1.
- Chuyển đến tiêu đề " Ứng dụng cho ứng dụng " nếu bạn không quen hoặc không thoải mái với dòng lệnh và / hoặc dòng lệnh không giải quyết được vấn đề của bạn.
Chỉnh sửa: cắt đuổi theo giải pháp trước đó và chỉ làm theo phần được chỉnh sửa này.
Thiết lập adb và chạy lệnh này:
adb shell "dumpsys window windows | toybox grep -i system_alert_window"
Bạn sẽ nhận được đầu ra của tất cả các lớp phủ hoạt động trên màn hình. Ví dụ về đầu ra với Trình ghi màn hình DU, Trình quản lý tác vụ và Trình ghi màn hình AZ hiển thị lớp phủ hoạt động trên màn hình:
bash-4.3 # adb shell "dumpsys window windows | toybox grep -i system_alert_window"
mOwnerUid = 10087 mShowToOwnerOnly = true gói = net.dinglisch.android.tasker appop = HỆ THỐNG_ALERT_WINDOW
mOwnerUid = 10604 mShowToOwnerOnly = true gói = com.hecorat.screenrecorder.free appop = HỆ THỐNG_ALERT_WINDOW
mOwnerUid = 10604 mShowToOwnerOnly = true gói = com.hecorat.screenrecorder.free appop = HỆ THỐNG_ALERT_WINDOW
mOwnerUid = 10649 mShowToOwnerOnly = true gói = com.duapps.recorder appop = HỆ THỐNG_ALERT_WINDOW
mOwnerUid = 10649 mShowToOwnerOnly = true gói = com.duapps.recorder appop = HỆ THỐNG_ALERT_WINDOW
mOwnerUid = 10604 mShowToOwnerOnly = true gói = com.hecorat.screenrecorder.free appop = HỆ THỐNG_ALERT_WINDOW
mOwnerUid = 10604 mShowToOwnerOnly = true gói = com.hecorat.screenrecorder.free appop = HỆ THỐNG_ALERT_WINDOW
mOwnerUid = 10638 mShowToOwnerOnly = true gói = ninja.sesame.app.edge appop = HỆ THỐNG_ALERT_WINDOW
Văn bản được tô sáng bên cạnh gói = và trước khi xuất hiện là tên gói của (các) ứng dụng hiện đang vẽ lớp phủ trên màn hình. Trong trường hợp của bạn, đầu ra bao gồm (các) tên gói sẽ khác nhau.
Lưu ý (các) tên gói (từ đó là PKG) và thực hiện lệnh này:
adb shell am force-stop PKG
Thay thế PKG bằng tên gói bạn ghi chú. Nếu bạn có nhiều tên gói, lặp lại lệnh với một tên gói một lần.
Lệnh sẽ dừng ứng dụng một cách mạnh mẽ và do đó loại bỏ lớp phủ. Điều này nên làm việc. Bạn cũng có thể tước quyền "Vẽ trên các ứng dụng khác" (viết tắt là lớp phủ màn hình) khỏi các ứng dụng bằng lệnh này:
adb shell appops set PKG SYSTEM_ALERT_WINDOW ignore
Một lần nữa, thay thế PKG bằng tên gói khi cần thiết. Hơn nữa, bạn có thể phải lặp lại lệnh dừng lực lượng cho PKG. Nếu bạn quyết định hoàn nguyên các thay đổi, thay thế bỏ qua bằng lệnh cho phép ở trên.
Bạn cũng có thể sử dụng Ops ứng dụng để quản lý các quyền từ GUI.
Để biết tên gói nào tương ứng với ứng dụng nào bạn có thể thử một ứng dụng nguồn mở như Thông tin ứng dụng . Tìm kiếm theo tên gói và bạn sẽ nhận được tên của Ứng dụng.
Chỉnh sửa xong
Bạn thực sự không cần phải đọc nữa . Tôi vẫn để nguyên giải pháp trước đó (tức là phần sau) vì 21 người đã bỏ phiếu đã thấy điều đó hữu ích và tôi không muốn gây rối nữa.
Một cách đơn giản là tìm ra tất cả các ứng dụng có quyền "rút ra các ứng dụng khác" và sau đó chọn chúng từ những ứng dụng hiện đang hoạt động trên màn hình. Sau đó, tham gia bắt buộc dừng các ứng dụng phổ biến đó cho đến khi bạn xác định chính xác ứng dụng chịu trách nhiệm cho lớp phủ hoạt động.
Liệt kê các ứng dụng có quyền cho lớp phủ
Sự cho phép được yêu cầu bởi một ứng dụng để tạo lớp phủ là android.permission.SYSTEM_ALERT_WINDOW
(rút ra các ứng dụng khác).
Chúng tôi cần tìm ra tất cả các ứng dụng đã cài đặt có sự cho phép nói trên. Tùy thuộc vào bạn để tìm ra một phương pháp cho việc này. Câu trả lời của tôi ở đây có thể giúp bạn.
Lưu ý rằng chúng tôi cần tên gói của ứng dụng chứ không phải nhãn của chúng.
Cherry-pick từ các cửa sổ đang hoạt động
Thực hiện lệnh
adb shell dumpsys window windows
Điều này sẽ cung cấp cho bạn thông tin chi tiết về bất cứ điều gì khiến thứ gì đó được hiển thị trên màn hình, bao gồm cả tên thành phần của ứng dụng gây ra nó.
Làm thế nào bạn sẽ trích xuất tên là tùy thuộc vào bạn. Bạn có thể thử lệnh này tuy nhiên
adb shell 'dumpsys window windows | grep "Window #"'
Nếu bạn nhận được lỗi: 'grep' không được nhận dạng là lệnh nội bộ hoặc bên ngoài , trên Windows hãy thử lệnh thay thế này:
adb shell "dumpsys window windows | grep 'Window #'"
Đầu ra demo
Cửa sổ số 4 Cửa sổ {42065d50 u0 com.android.phone/com. Liềnk.phone.UssdAlertActivity}:
Cửa sổ số 5 Cửa sổ {42197468 u0 ginlemon.flowerpro / ginlemon.flower.HomeScreen}:
Cửa sổ số 6 Cửa sổ {420fdb58 u0 com.android.systemui.ImageWallapers}:
Cửa sổ số 7 Cửa sổ {421e3b88 u0 com.android.contacts / com.android.contacts.activities.DialtactsActivity}:
Trong đầu ra trên, bất cứ điều gì thành công u0
và trước đó /
là tên gói của một ứng dụng. Một ứng dụng có thể có nhiều thành phần hiển thị một cái gì đó trên màn hình.
Bạn đã tạo một danh sách các tên gói đó. Nếu bạn đã cài đặt BusyBox , bạn có thể làm
adb shell 'dumpsys window windows | grep "Window #" | sed -e "s/.*u0 //g" -e "s/\/.*//g" -e "s/}://g"'
Dù sao đi nữa, bây giờ bạn sẽ có hai danh sách:
- Danh sách đầu tiên chứa tất cả các ứng dụng có sự cho phép
android.permission.SYSTEM_ALERT_WINDOW
.
- Danh sách thứ hai chứa tất cả các ứng dụng tích cực hiển thị một cái gì đó trên màn hình.
So sánh hai danh sách này và các ứng dụng duy nhất phổ biến trong cả hai danh sách. Danh sách thứ ba này sẽ tạo thành các ứng dụng có quyền vẽ lớp phủ và hiện đang vẽ một lớp phủ hoạt động trên màn hình.
Thời gian để giết
Giết từng ứng dụng từ danh sách thứ ba từng cái một và chú ý trạng thái lớp phủ. Bạn có thể sử dụng am force-stop PACKAGE_NAME --user 0
hoặc bất kỳ phương pháp nào phù hợp với bạn. PACKAGE_NAME
là tên gói của ứng dụng.
EDIT : Không cần thiết phải giết một ứng dụng. Bạn có thể xem xét từ chối ứng dụng cho phép vẽ trên các ứng dụng khác. Sử dụng lệnh này:
adb shell 'appops set PACKAGE SYSTEM_ALERT_WINDOW deny' # replace PACKAGE with package name of the app
Để hoàn nguyên các thay đổi, thay thế từ chối bằng cho phép trong lệnh đã nói và thực hiện nó.
Nếu bạn đang chạy Android Marshmallow, câu trả lời này của Andrew T. có thể được sử dụng.
Lưu ý: Lệnh nói trên được thử nghiệm thành công trên Android 5.1.1 và 6.0.1 (bản dựng CM). Cũng có thể lệnh này hoạt động trên Android 5.0.x nhưng tôi không thể đảm bảo . Việc thực thi lệnh đó trên phiên bản Android được phát hành trước Lollipop sẽ gây ra lỗi.
Vì thường lớp phủ có thể nhận thấy được, nó sẽ biến mất ngay lập tức khoảnh khắc ứng dụng gây ra nó bị giết, do đó, bạn sẽ biết ứng dụng nào gây ra lớp phủ đó.
Ứng dụng cho ứng dụng
Được đề xuất ban đầu bởi Izzy, bạn có thể sử dụng một ứng dụng có chức năng cho phép liệt kê được cấp cho các ứng dụng đã cài đặt, để loại bỏ các ứng dụng có quyền "rút ra các ứng dụng khác". Bạn có thể tự mình tìm kiếm một ứng dụng như vậy hoặc sử dụng trình kiểm tra Quyền cho phép được duy trì bởi Izzy trên trang web của anh ấy.
Bạn cũng sẽ cần một trình quản lý quy trình / ứng dụng để buộc dừng / hủy một số quy trình. Tôi khuyên dùng OS Monitor nhưng bạn có quyền tự do sử dụng bất kỳ ứng dụng có thẩm quyền nào. Xem các ứng dụng liên quan dưới Thông tin hệ thống .
Chỉ dành cho mục đích trình diễn
Tôi đã thử Trình quản lý cấp phép nâng cao để liệt kê các ứng dụng có quyền "thu hút các ứng dụng khác". Sau đó, tôi chuyển sang OS Monitor để xem các ứng dụng đang chạy ở nền trước và nền. Tôi đã khớp với đầu ra từ cả hai ứng dụng và cá nhân dừng các ứng dụng phổ biến trong cả hai ứng dụng. Bạn có thể giết một quá trình từ bên trong Màn hình hệ điều hành, do đó không cần phải chuyển sang cài đặt Ứng dụng.
(Bấm vào hình để phóng to)