Безоблачное мобильное приложение — жизнь без Google Play
Чуть раньше мы с вами думали про то, какие есть альтернативы Google Play, и как можно обходить разные способы блокировки на мобильных приложениях при помощи Google Compression Proxy и тора. Сегодня хочется поговорить о том, можно ли запустить и поддерживать полноценное мобильное приложение на Android без помощи какой либо обязательной внешней инфраструктуры. Рассказывать буду на примере всё того же приложения для просмотра рутрекера. Оно ничем особо не примечательно, но очень наглядно.
Для кого это
Сразу уточню, кому это может быть актуально. Злонамеренное использование приходит в голову в первую очередь, но мне скорее хочется помочь разработчикам, которые в силу каких-то условностей не могут выложить приложение, или же не смогли прорваться через роботов, сидящих на поддержке Google по вопросам несправедливого бана приложения. Так же есть просто приложения для узкого круга пользователей или приложения для некой компании. Ну или вы просто можете внезапно оказаться связаны такими условиями, что не можете публиковать своё приложение на Google Play (сталкивался, да).Этап первый. Установка
На самом деле, это самый сложный этап - ваше приложение должно как-то попасть пользователю на устройство. Если приложение рассчитано на казуальных пользователей, которые могут поставить что-то только из Google Play, то тут, конечно, увы и ах. С другой стороны, если у вас приложение именно такого рода, то вы, скорее всего, сможете воспользоваться Google Play.Ранее я думал про Yandex.Store - но опыт использования показывает, что он просто медленно тухнет, покинутый и забытый (даже сотрудники Яндекса не могут ответить на вопросах о планах на его счёт - а я спрашивал).
Далее в голову приходит F-Droid. Вариант неплохой, но обладает несколькими минусами, которые могут быть для вас фатальны:
- Вы должны предоставить исходный код проекта;
- У пользователя должно стоять приложение F-Droid, или надо его как-то на это уломать;
- Обновления без предварительного удаления в таком случае смогут устанавливаться только из F-Droid (они сами собирают и подписывают ваше приложение из исходного кода);
- Обновление программы сможет происходить только раз в сутки;
- В результате вы остаётесь намертво привязаны к F-Droid, что тоже не очень круто.
Что же делать? Ответ довольно топорен в своей простоте - просто распространяйте приложение без каких либо сторов - в виде apk файла! Можно хранить его на любом сервере - от FTP и HTTP до шары на дропбоксе. Это, конечно, затребует галочку на “установку приложений из сторонних источников” - но она нам нужна в любом случае. Да и пользователи уже давно научились ставить всё, что им нужно - те же покемоны, установленные на пике популярности чуть ли не на каждом десятом телефоне (при отсутствии их в русском гугл плее) это наглядно показывают (да, покемонов я тоже люблю за то, как они наглядно показывают многие вещи). В этом случае вы можете разложить яйца по куче разных корзин - у вас может быть множество источников установки и обновления вашего приложения.
Серьёзный минус только один - в момент установки никак нельзя проверить, действительно ли это ваше приложение, или злой фейк. Ну увы. Для хардкорных параноиков можно публиковать хэш на доверенном ресурсе, например.
В моём случае я использовал инфраструктуру github, поскольку разрабатываю приложение с открытым кодом (и люблю совместную работу, пулл реквесты и всё это). Но повторюсь - можно было бы использовать всё что угодно - 4pda, торренты, FTP, HTTP, Dropbox, передачу apk через телеграмм, хостинг на narod.ru и так далее. Любое извращение, которое только придёт вам в голову.
Этап второй. Отладка
Казалось бы, без отчётов гугла жизнь больше не мила, и мы больше ничего не сможем отладить. Но это не так. Есть большое количество сервисов, которые предлагают нам гораздо больше всего интересного, чем гугл. Как вы думаете - почему внутри каждого пятого приложения оказываются бинарники crashalytics? Просто потому, что это гораздо удобнее!Итак, вы можете собирать информацию о падениях сторонними инструментами. Сам я использовал crashalytics и Acra. Сrashalytics даёт вам из коробки всё, что можно - но в своём облаке. Acra даёт вам даже больше и предлагает кучу вариантов бэкенда - но это надо делать и думать, что не всегда хочется. Так что Acra я выбирал в том случае, если данные просто нельзя было передавать в чужое облако. Для Acra был написан простенький бэкенд, который складывал репорты в Elasticsearch, после чего их можно было смотреть в Kibana (просто пользуясь текущей инфраструктурой).
Так что после получения репорта всё зависит только от вашей фантазии - собранные данные можно передавать по емейлу, через веб сервера, через сервера в торе, почтой России, отправлять гонцами и так далее.
Этап третий. Обновление.
Да, мы давно вышли из того времени, когда обновления поставлялись на красивых дискетах раз в несколько лет. Наверное, это к лучшему. Итак, вы скорее всего захотите иметь возможность обновлять приложение как минимум раз в сутки.На текущий момент рассматриваем вариант с тем, что вы не используете никакие сторы, которые об этом заботятся. В таком случае, вам нужно иметь некий пул серверов с метеданными об обновлении и собственно бинарниками. Как и ранее - всё ограничивается только вашей фантазией. А гарантом того, что это всё ещё ваше приложение, является подпись, несовпадение которой проигнорирует только очень бестолковый пользователь (вряд ли он является вашей ЦА). Ну и ничто не мешает вам провалидировать скачанное обновление любыми своими методами.
В моём случае использовался всё тот же github - там есть удобное API для получения данных о релизах, и мне не нужно беспокоиться о трафике, доступности и прочих вещах. Если же ваше приложение банят где ни попадя - вполне можно при запуске запускать тор и скачивать обновление оттуда.
Единственная тонкость этого этапа - чрезвычайно важно не облажаться в написании алгоритма обновления. В будущем обновлении вы можете поправить любой баг в приложении - кроме того, который помешает поставить это обновление… Ну и важно, чтобы ваше приложение не упало до момента обновления. Конечно, можно запрещать любую активность в приложении до проверки и установки обновления - но для пользователя это не очень удобно. Ещё можно пробовать ловить любые крэши и… Не крэшиться… Но если у вас в приложении есть нативные библиотеки и прочие способы выстрелить себе в ногу, то креш всё равно возможен.
Этап четвёртый. Аналитика.
Всё хорошо, у вас есть работающее активное приложение и пользователи. Непонятно одно - какого чёрта там происходит?!Если в Google Play вы это решали при помощи Google Analytics для Android, то теперь… Вы можете это решать это при помощи любого другого сервиса аналитики. Включая возможности того же Fabric. Дальше повторяться не буду - вы полностью контролируете, что, куда и как вы шлёте.
Пример с Fabric (я собираю только данные о тайтлах просмотренных страниц из чистого любопытства).
Кстати, на гитхабе можно получить небольшую статистику по посещениям репозитория, что тоже любопытно.
Этап пятый. Монетизация
До того, как впадать в отчаяние при мысли о том, что без гугла вы больше не сможете продавать своё приложение, можно подумать и решить что… Не так уж он нам и нужен. Если вы монетизируете приложение при помощи рекламы, то можно взять любой не гугловый движок (тысячи их). Если при помощи покупок - никто не помешает вам интегрировать любое платёжное решение - от Stripe до перевода биткоинов...Итог
Внезапно оказывается, что принципиальных проблем-то нет. Приложение может полноценно работать - не так чтобы сферически в вакууме, но по крайней мере со множеством различных взаимозаменяемых инфраструктур, не опираясь при этом на гугл. Так что если вас забанили - не отчаивайтесь! Способ выжить есть. Конечно, будет труднее - но это уже бесконечно лучше, чем просто сворачиваться и расходиться. И я очень надеюсь, что многие так поступят, появится много популярных приложений, которые работают автономно, и это, в том числе, окажет влияние на Google - возможно, они наконец посадят несколько человек из плоти и крови на разбор вопросов по блокировке.Касательно моего приложения, которое я использовал в качестве примера - гитхаб говорит, что у него 20.000 загрузок. Даже если половина из них это обновления, мне всё равно кажется, что результат всё равно весьма достойный - с учётом того, что я нигде его не рекламировал (зачем?), и оно описано только на хабре, рутрекере и 4pda.
P.S. На всякий случай предупреждаю - гугл запрещает обновление приложения из альтернативных источников.
P.S.2 Вы, вероятно, уже слышали, что Google купил Fabric. Остаётся только надеяться, что он его не сломает и не сделает обязательную привязку к Google Play. Но даже если так, у нас ещё есть много запасных вариантов.
Ссылки
- Петиция в Google, которая просит уважать маленьких разработчиков и не банить их и их приложения за просто так. Закрыта, подписать нельзя - но просто для осознания масштаба проблемы. Не то чтобы 4000 человек не могло ошибаться, но всё же;
- Занимательная история про удаление и восстановление приложения в Google Play. По-моему, случилось редкое чудо. А что если бы чуда не случилось?
- Приложение для рутрекера, которое я использовал в качестве примера. Можно использовать его код, в том числе код механизма обновления - но внимательно его отсматривайте, разработка под Android - моё хобби, так что косяки высоко вероятны;
- Пример интерфейса Fabric;
- Идеальный релиз в Fabric.