О том как я написал блокировщик рекламы и трекеров для смартфонов Samsung на Android. Adhell

в 5:48, , рубрики: adblock, adhell, android, api, open source, Samsung, Разработка под android

Представляю сообществу проект, которым занимался в последнее время: блокировщик рекламы и трекеров для смартфонов Samsung на Android с открытым исходным кодом.

Реклама блокируется на уровне устройства, то есть не только в стандартном браузере, но и во всех остальных приложениях (например, в Chrome и YouTube).

Предыстория

Я пользуюсь блокировщиками на всех своих компьютерах, но все чаще захожу в интернет со смартфона.
Мне нравится мобильный Chrome больше чем Mozilla или Opera, но в Chrome нет поддержки расширений, а присутствие рекламы на смартфоне критичнее чем на десктопе, так как часто ограничен трафик и дисплей в несколько раз меньше.
Плюс мне нравится иногда смотреть видео на YouTube, но реклама, которую нельзя пропустить здорово мешает процессу.
Исходя из таких предпосылок я занялся поиском решения блокировки рекламы на смартфоне.

О том как я написал блокировщик рекламы и трекеров для смартфонов Samsung на Android. Adhell - 1
Пример работы приложения на Samsung Galaxy Tab 4 10.1. m.habr.ru

Готовых решений по блокировке рекламы довольно много, но, к сожалению, все они имеют хотя бы один крупный недостаток:

  1. Браузеры с поддержкой расширения для блокировки (Mozilla, Opera).
  2. Браузеры со встроенной блокировкой рекламы (от Ghostery, от AdBlockPlus).
  3. Блокировщики рекламы для стандартного браузера Samsung.
  4. Блокировщики на базе VPN.
  5. Полу-работающие решения (https://adblockplus.org/android-about).
  6. Блокировщики работающие на базе root.

Первые три варианта блокируют только в браузере. Я пробовал пользоваться ими, но Chrome мне нравится больше даже с рекламой. Четвертый вариант хорош, но не стабилен. Пятый не фильтрует мобильные данные.
Шестой вариант самый идеальный, если у вас есть root или вы не прочь его получить.

В каждом из вариантов приходиться чем-то жертвовать, поэтому я начал думать, могу ли сделать что-нибудь сам. Решения на тот момент не нашел и прошло много времени пока не наткнулся на платформу от Samsung.

Samsung Knox Standard SDK

Knox это решение разработанное Samsung. Под брендом Knox существуют много продуктов, но остановлюсь на одном, который я использовал.

Knox Standard SDK это бесплатная библиотека, которая работает почти на всех Android смартфонах Samsung и обладает богатым API (около 1100 методов). Если бы меня попросили описать Knox Standard SDK в двух словах, то я бы сказал, что это легальный почти root.

В общем, очень полезная штука, которая позволяет делать много интересных вещей. Например, полноценно заблокировать устройство на одно приложение, тихо включать GPS и запретить его выключение, тихо включать Wi-Fi/Bluetooth, тихо устанавливать/удалять не системные приложения, тихо включать/выключать любые приложения, запретить изменение настроек, запретить выключение устройства и много чего другого.

Вот ссылка на официальный сайт, там есть примеры, гайды и API Reference.

Неизвестность решения в широких кругах, я для себя объясняю тем, что оно создавалось для Enterprise + на мой взгляд, недостаточный маркетинг Samsung.

Идея

Просматривая документацию я понял, что с помощью API можно добиться блокировки рекламы на уровне устройства (как будто есть root доступ как в 6 пункте выше), а не на уровне приложений. Но блокировщик подойдет только владельцам смартфонов Samsung. Я решил, что лучше полное решение на одном устройстве, чем половинчатое на всех. И начал разработку.

Получение ключа

Чтобы начать использовать API нужно зарегестрироваться на сайте seap.samsung.com и сгенерировать бесплатный девелоперский ключ, с помощью которого на устройстве активируется работа библиотеки. Когда проект закончен, нужно получить продакшн ключ.
Девелоперский ключ работает три месяца, по окончанию срока можно сгенерировать новый. Продакшн ключ бессрочный, его нужно привязать к имени пакета и ключу, которым подписывается приложение В этом случае только ваше приложение сможет использовать полученный ключ.

Использование API

Далее нужно импортировать три .jar которые скачиваются после регистрации, в Gradle их нет, поэтому придется копировать вручную.
Не буду тут подробно описывать код: вы можете посмотреть его на GitHub и там все довольно просто сделано. Остановлюсь только на некоторых особенностях.

1. Для работы Knox Standard SDK нужно попросить пользователя ввести приложение в режим администратора, потом активировать полученный ключ и согласиться в сплывающем окне.

2. Оказалось, что на разных версиях Android от Samsung установлены разные версии Knox Standard SDK и обновляются они только с обновлением прошивки.
Поэтому нужно было поддерживать разные версии, в чем в общем-то я преуспел и сейчас блокировщик работает (надеюсь, что) на всех устройствах начиная с версии 2.0. Версию SDK можно посмотреть в информации об устройстве в настройках телефона.

Я буду благодарен, если в случае проблем с приложением, вы напишите в комментариях или откроете issue на GitHub.

А что блокировать?

В первой версии я заходил на популярные сайты из моего списка в Feedly и вылавливал рекламных провайдеров вручную, в сумме получилось около 200 доменов и все работало, но часто реклама просачивалась.
После того как я опубликовал приложение в Google Play, мне на почту прислали письмо со списком рекламных провайдеров:

  1. adaway.org/hosts.txt
  2. pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext
  3. hosts-file.net/ad_servers.txt

Отмечу, что пока в проекте используются первые две ссылки, что в сумме ~2600 ссылок и этого хватает, чтобы не видеть рекламу на 95% сайтов.
В версия Knox Standard SDK 5.6 все 2600 ссылок блокируются нормально.
Но на более старых 2600 ссылок смартфон принимать отказывается, стабильно блокируется только 1500.

И вот возникает задачка, какие 1500 из 2600 ссылок выбрать? Как отсортировать список по популярности? Я начал думать и гуглить.
Довольно быстро нашел, что Alexa Rank отдает файлом в .csv 1 млн самых посещаемых доменов в мире за последний месяц в порядке популярности. Я предположил, что если домен содержится в этом списке и одновременно домен (или его поддомен) содержится в списке провайдеров рекламы, то значит провайдер рекламы популярный и часто встречается на различных сайтах.
С помощью данной гипотезы получилось отсортировать список из 2700 ссылок. Те, домены, которые не встречались в списке 1М я добавлял в конец.
В итоге, тех что встречаются списке получилось ~1300, что вполне подходит под наши ограничения.

На самом деле, я пробовал провернуть тоже самое не только с двумя, но и с тремя списками провайдеров рекламы, что на выходе дает больше 10 тысяч ссылок, и быстрая прокрутка списка показывает, что там много не релеватных сайтов (например, индиийских или китайских). Поэтому пока было решено оставить первые два провайдера.

Хотелось бы в будущем сделать возможность блокировать рекламных провайдеров по языкам (как это делается в расширении AdBlockPlus, например).

Первый блин комом

Где-то в марте, я за неделю сделал прототип, почти вручную собрал провайдеров рекламы (на тот момент около 200). Просто заходил на сайты, на которые обычно хожу и вылавливал рекламные ссылки. Потестил немного, выложил в Google Play, написал на 4pda.ru и начал рассказывать про него всем знакомым.

Через две недели было около 300 скачиваний и 60 активных (в тот момент поддерживался только Marshmallow). Примерно в тоже время мне прислали ссылки с провайдерами рекламы и я на радостях обновил приложение.

А утром пришло письмо от Google, что приложение заблокировано. Видимо не нужно было писать в обновлении большими буквами: «Блокировщик рекламы и трекеров. Блокирует не только в стандартном браузере, а во всех приложениях». Если перефразировать с юмором, то в письме от Google было сказано: «Ты хороший разработчик, но ставишь весь наш бизнес под угрозу, поэтому мы выпилили твое приложение.» Вот так и началась эта история.

Чтобы проект не зависел от Google Play и при этом выжил, решил сделать сайт (где можно скачать приложение напрямую), сделать проект открытым и написать об этом на Хабр.

Что в итоге?

В итоге получили мобильный интернет без рекламы, ускоренную загрузку страниц и бонусом экономию трафика.

Я пользуюсь двумя смартфонами Galaxy S7 и OnePlus 2 и возвращаясь в Chrome или YouTube на OnePlus удивляюсь как, оказывается, мешает и много места занимает реклама на мобильном дисплее.

Вот несколько примеров с работающим блокировщиком и без него. Тест проводился на одинковых смартфонах с выключенным и включенным блокировщиком. Я только вбивал домен в браузер и ждал пока загрузиться страница.

О том как я написал блокировщик рекламы и трекеров для смартфонов Samsung на Android. Adhell - 2
habr.ru

О том как я написал блокировщик рекламы и трекеров для смартфонов Samsung на Android. Adhell - 3
theverge.com

О том как я написал блокировщик рекламы и трекеров для смартфонов Samsung на Android. Adhell - 4
adme.ru

О том как я написал блокировщик рекламы и трекеров для смартфонов Samsung на Android. Adhell - 5
rbc.ru

Заключение

Большим плюсом решения является простота и удобство для пользователя, но и минусом — платформозависимость.

Благодарности

За то, что поделились ссылками на провайдеров рекламы, выражаю благодарность Вячеславу Рудковскому (не знаю его ник на Хабре).

За подготовку сайта большое спасибо yelnar.

Проект на GitHub

Создал организацию https://github.com/adhell, в ней содержится три репозитория.
Само приложение под Android https://github.com/adhell/android
Сортировщик рекламных ссылок по популярности https://github.com/adhell/adprovider
Сайт https://github.com/adhell/adhell.github.io

Ссылка на сайт проекта: getadhell.com
Ссылка на Google Play (до тех пор пока не заблокируют)

Автор: raiym

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js