ГлавнаяБлогПочему скриншоты Netflix чёрные? Объяснение FLAG_SECURE
Алгоритмы

Почему скриншоты Netflix чёрные? Объяснение FLAG_SECURE

Узнайте, почему скриншоты Netflix и банковских приложений чёрные. Разбираем механизм FLAG_SECURE и TEE. Начните понимать защиту контента уже сейчас.

Al
Редакция Algolitalgolit.ru
8 мин чтения17 июля 2026 г.

Почему скриншоты Netflix чёрные?

Вы нажимаете скриншот во время просмотра Netflix — и получаете чёрный прямоугольник. Кнопка воспроизведения есть, ползунок есть, а само видео исчезло. То же самое с записью экрана: вы видите фильм, а в сохранённом файле — чернота. Большинство думает: «Netflix заблокировал». Но механизм куда интереснее. Давайте разберёмся по слоям.

Как на самом деле работает скриншот

Моя первоначальная модель была такой: я нажимаю скриншот, что-то это обнаруживает и закрашивает защищённую область чёрным. Получается цензурированное изображение. Логично, но полностью неверно. Ничего не обнаруживает, ничего не закрашивает. Запомните это — остальное вытекает отсюда.

Два потребителя, два композита

Ключевая идея: экран и скриншот видят разные изображения. Я долго думал, что есть один буфер кадров, одна «каноническая картинка» телефона, и скриншот просто её копия. Нет. Android SurfaceFlinger не рендерит одно изображение для всех. Он создаёт отдельный композит для каждого вывода: физическая панель — один, сервис скриншотов — другой, трансляция — третий.

Для каждого вывода SurfaceFlinger проходит по слоям и задаёт один вопрос: принадлежит ли этот слой этому выводу? Для панели ответ всегда «да». Для вывода скриншота любой слой с флагом FLAG_SECURE пропускается. Видеослой никогда не удаляется из скриншота — он просто не добавляется.

Почему именно чёрный

Это моя любимая часть. Буфер захвата выделяется и обнуляется. Обычные слои пишут в него данные, защищённый слой — нет. Затем буфер кодируется и отдаётся. Нули — это чёрный цвет. Всё. Никто не выбирал чёрный. В AOSP нет функции paintItBlack(). Чёрный — это просто цвет нетронутой памяти, когда вы интерпретируете её как пиксели. Прямоугольник не зацензурен — он пуст. Это отсутствие решения.

Это объясняет и то, что я видел сотни раз: чёрный цвет в точности повторяет форму видео, а UI вокруг сохраняется. Кнопка воспроизведения, ползунок, текст — все присутствуют. Это отдельные слои, и только один из них имел флаг.

Банковские приложения делают то же самое

Я сделал скриншот банковского приложения — тот же чёрный прямоугольник. Менеджер паролей — то же. Фотография в WhatsApp с одноразовым просмотром — тоже. Вот вся реализация:

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_SECURE,
    WindowManager.LayoutParams.FLAG_SECURE
);

Один вызов. Тридцать секунд работы. Вот и вся защита.

Netflix играет в другую игру

Всё, что мы обсудили — это политика. SurfaceFlinger выбирает соблюдать FLAG_SECURE. Пиксели всё это время находятся в обычной памяти. Композитор просто вежливо отказывается их копировать. Это значит: рутируйте телефон, пропатчите SurfaceFlinger — флаг игнорируется, скриншоты банков работают. Вся защита — джентльменское соглашение, подкреплённое кодом, которым владеет root.

Netflix HD — не то. В Widevine L1 декодированные кадры живут внутри TEE (доверенная среда выполнения) — отдельном защищённом мире на том же SoC. Расшифрованное видео никогда не попадает в память, доступную процессору приложений. Оно идёт из TEE в защищённый буфер, компонуется, попадает в глаза — и ядро ни разу не касается ни одного пикселя. Там нет кода для патча, потому что это не код. Это контроллер памяти, говорящий «нет» на уровне кремния.

МеханизмПринуждениеОбход
Банковское приложениеFLAG_SECUREОС добровольноRoot
Netflix HDFLAG_SECURE + L1 защищённые буферыЧипНичем на устройстве

А работает ли рутирование?

Для FLAG_SECURE — да, думаю, работает. Это политика, и root владеет политикой. Пропатчите SurfaceFlinger, перестаньте соблюдать флаг — скриншоты банков вернутся. Netflix HD — тут я застрял. Кадры в TEE. Root даёт вам ядро, но ядро не то, что говорит «нет». Что на самом деле получится на выходе? Я не пробовал — нет запасного устройства. Кто-нибудь делал это? Кастомщики, что у вас вышло?

Практический вывод

Теперь вы знаете точный механизм: FLAG_SECURE не скрывает видео, а просто не включает его в скриншот. Если вы разработчик — используйте этот флаг для защиты контента в своих приложениях. Если пользователь — понимайте, что рутирование может помочь с банковскими приложениями, но не с Netflix HD. А если просто любопытны — запомните: чёрный цвет — это не цензура, а пустота.

#FLAG_SECURE#скриншоты#безопасность Android#Netflix#TEE
Al
Редакция Algolit

Пишем про алгоритмы, подготовку к собеседованиям и карьеру в IT — так, чтобы было понятно и полезно.

Хочешь закрепить знания на практике?

Решай задачи на Algolit — интерактивная платформа для обучения

Начать бесплатно →