В современных коротких видео формат рекламы сместился от официальных промо-постов к прямым интеграциям, которые авторы монтируют прямо в середину ролика. Для YouTube эту проблему решает SponsorBlock, но перенос подобной механики в Android-клиент TikTok требует решения специфических технических задач. Статья описывает Proof of Concept, демонстрирующий, как устроен проприетарный плеер TikTok, как стабильно перехватывать его методы через патч ReVanced и как организовать базу меток без слежки за пользователями.
Стандартные методы блокировки рекламы, такие как сетевые фильтры или фильтрация ленты API, здесь не работают, так как ролик со вшитой рекламой отдается единым файлом с того же CDN, что и обычный контент. Единственный рабочий вариант — перехват воспроизведения в самом приложении и программная перемотка в нужный момент. TikTok использует собственный закрытый движок TTVideoEngine, работающий в связке с нативными библиотеками, а не системный MediaPlayer или ExoPlayer. Код приложения плотно обфусцирован R8, что меняет имена классов и методов при обновлениях, однако ключевые методы плеера сохраняют неизменные сигнатуры типов, что позволяет использовать поиск по типам аргументов и возвращаемых значений вместо поиска по именам.
Для реализации патча в ReVanced используются хуки на методы запуска воспроизведения и перемотки. Важно применять инструкцию invoke-static/range, так как оптимизатор R8 часто выносит регистр this за пределы первых 16 регистров, и обычный вызов приведет к ошибке. Алгоритм автопропуска оптимизирует частоту проверок таймлайна: вместо постоянного опроса каждые 16 мс используется динамический расчет интервала через бисекцию. Это снижает медианное число вызовов getCurrentPlaybackTime() с 60 до 1.6 вызова в секунду, не теряя точности момента перемотки. Также реализована защита от зацикливания и обработка склейки соседних меток.
Для работы системы необходима база таймкодов, но прямой запрос идентификатора ролика нарушит приватность пользователей. В качестве решения используется схема k-анонимности, аналогичная той, что применяется в SponsorBlock. Клиент отправляет на сервер только первые два байта (16 бит) хэша SHA-256 от ID ролика. Сервер, реализованный на Cloudflare Workers с базой D1, возвращает все известные отрезки для роликов с таким префиксом. Клиент находит нужный ролик локально в полученном списке, а сервер не знает, какое именно видео открыто на устройстве. Идентификаторы пользователей при отправке меток анонимизируются через HMAC-SHA256, а новые отметки валидируются по порогу голосов в системе консенсуса.