[recovery mode] Прототип читерского ASO продвижения

-mlc7xdxtk9xg1h6sr_gdjmf6sk.pngВсем привет!
Сразу скажу, что ещё ни одно мое приложение не пользовалось популярностью, поэтому скорее неверны мои личные суждения о бесполезности настройки ключевых фраз и описания приложения в Google Play. Но знаете, первое желание после публикации долгожданного приложения, чтобы пользователи, наконец, начали его устанавливать и пользоваться. Какое же это разочарование, когда этого не происходит и спустя длительное время, думаю, многие знают. Кажется, что вовсе нет смысла создавать что-то стоящее, если все равно его судьба храниться на свалке маркета.


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


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


Техническая сторона вопроса


Во-первых, нужны рут права на устройстве. Из ui думаю здесь и нечего создавать для обеспечения самой работы.


Также нужен, например, один foreground сервис с таймером и несколько ресиверов системных событий (интернет, экран и тп) при необходимости.


Какой собственно алгоритм? Вход в аккаунт — открытие страницы приложения — скачивание приложения — завершение установки приложения — удаление приложения — выход из аккаунта, т.е. смена аккаунта.


Что касается открытия страницы приложения, тут все просто:


startActivity(new Intent(Intent.ACTION_VIEW, 
    Uri.parse("market://details?id=" + pckg)));


С удалением тоже сложностей нет (построчно команды для выполнения)


"rm -rf /data/app/" + packageName + "*"
"rm -rf /data/data/" + packageName
"am broadcast -a " + Intent.ACTION_PACKAGE_REMOVED +
    " -d \"package:" + packageName + "\"" +
    " --ez android.intent.extra.REMOVED_FOR_ALL_USERS true" +
    " --ez " + Intent.EXTRA_DATA_REMOVED + " true" +
    " --ez " + Intent.EXTRA_DONT_KILL_APP + " false" +
    " --ei " + Intent.EXTRA_UID + " " + applicationInfo.uid +
    " --ei android.intent.extra.user_handle 0"


Если не послать оповещение об удалении, то иконка в меню не пропадет.


Как узнать об завершении установки скачиваемого приложения? Для этого наследуем NotificationListenerService и слушаем появление уведомления об окончании установки. Причем с рут правами проще дать себе на это разрешение:


// проверка
"settings get secure enabled_notification_listeners"
// разрешение
"settings put secure enabled_notification_listeners " + packageWithClassName
// надо учитывать здесь, что могут быть и другие слушатели


Для выхода из аккаунта можно попробовать удалить системную базу данных (может быть в разных местах) account.db. Не пробовал, поэтому не знаю точно, будет ли работать. Вообщем, во всяком случае, для этого есть более трудная альтернатива.


Также для контроля смены аккаунтов следует использовать класс OnAccountsUpdateListener.


Остается самое сложное: вход в аккаунт и скачивание приложения (и выход из аккаунта, если с удалением бд не получается). То, что пользователю легче всего, сложнее приложению. По началу думал об эмулировании нажатий по экрану, но быстро понял, что это запредельно сложно (либо невозможно). Оказалось гораздо проще эмулировать нажатие клавиш (enter, tab, menu, up, left и тп). Соотвественно нужно знать их коды


public static final int CODE_UP = 19;
public static final int CODE_DOWN = 20;
public static final int CODE_LEFT = 21;
public static final int CODE_RIGHT = 22;
public static final int CODE_POWER = 26;
public static final int CODE_TAB = 61;
public static final int CODE_ENTER = 66;
public static final int CODE_MENU = 82;


И команды для их вызова:


"input keyevent " + code
// для ввода текста (например, логин с паролем)
"input text " + text


Все бы хорошо, но как узнать, что нажатия по нужному окну происходят? Для этого есть команда dumpsys window windows. Grepim нужные данные и должны справиться с этим (Работает, но 100% точность не гарантирует все равно; бывает выползет какой-н. exception окошко и облом). Также пытался отталкиваться от разметки текущего экрана (иерархия виджетов, идентификаторы), но не нашел простого решения для этого (было какое-то, но там даже не стоит пробовать, так как просто гигантский и непонятный output выдает).


Еще был вопрос, как контролировать, что, например, Google Play (кстати, логина это тоже касается; по-сути за авторизацию отвечает тоже системное приложение, т.е. никакой магии) загрузил данные (картинки, описание, отзывы), иначе просто не туда будут нажатия идти. Для начала узнаем uid требуемого приложения:


"dumpsys package " + packageName + " | grep -E 'userId'"


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


"cat proc/uid_stat/" + uid + "/" +  (rcvIf ? "tcp_rcv" : "tcp_snd")


Вроде все по этой части.


Экономическая сторона вопроса


59ccfe1539355173168800.gif

— Зачем тебе человеческие души?
 — При нынешней экономике? Да это единственная стоящая вещь!
Бальтазар

Как можно уже понять, для данной цели требуется много «гугловских душ». Хорошо, их можно купить (либо создавать, пока не надоест для самых экономных). В среднем, цена одного аккаунта Google составляет 10 руб. Простая арифметика, мне нужно 1к установок => плачу 10к рублей.

По-моему, грустные цифры. Из моего опыта подобных покупок скажу, что вы запросто можете потерять всех их в любой момент (всмысле Google забанит). Даже дело не в перепродаже аккаунтов больше, сколько в ошибках использования, хотя это и может быть следствием первого. Не знаю точно, какие существуют способы борьбы гугла с этим. Скорее всего они определяют такую активность по данным ip адресов (не думаю, что и прокси здесь хороший помощник), частоте использования аккаунта (в том числе входе и выходе из него) и тд. Вообщем весь этот огород скорее всего себя не оправдает.


PS Не подставляйте рабочий аккаунт, поскольку все описанное выше нарушает политику использования сервисов Google Play, его также могут попросту забанить.


PPS По поводу опроса, если победит да, то скорее всего опубликую наработки здесь https://github.com/androidovshchik/CheatASO

© Habrahabr.ru