Впечатления от Yandex Mobile Camp

На конференции можно было послушать доклады ведущих разработчиков Yandex, e-Legion и ABBYY. Было круто.

Доклады, которые заинтересовали меня больше всего

Провязки веба и мобильных приложений, Александр Бакшеев

Как подтолкнуть пользователя к переходу с сайта в мобильное приложение. Какие есть стандартные виды баннеров, как их установить на сайт. Какие преимущества и недостатки нестандартных баннеров, насколько отличается конверсия. Как сделать ссылку, которая, если приложение не установлено, ведёт в маркет, а если установлено — на то содержимое, которое сейчас открыто.

Поддержка многозадачности на iPad под управлением iOS 9, Николай Лихогруд

В iOS 9 теперь можно в двух приложениях одновременно искать одну и ту же информацию, например, читая Википедию, вытащить из-за края экрана карты и найти в них место, о котором читаешь. Приложения могут занимать 2/3 и 1/3 экрана либо по половине.

Безопасность Android-приложений, Дмитрий Лукьяненко

По-моему, это был самый интересный из докладов. Автор рассказал о некоторых уязвимостях Android-приложений.

Сериализация в Bundle

В Intent можно положить Serializable-объект и передать это какой-нибудь Activity. Как только будет запрошено любое Extra, Bundle (тот, что внутри Intent) будет распакован, а объект — десериализован. Во-первых, классу не обязательно реализовывать интерфейс Serializable. Это проверяется при упаковке, но не при распаковке. Во-вторых, этот объект когда-нибудь будет финализирован. И если этот объект является обёрткой для чего-нибудь native, то в методе finalize() он, вероятно, вызывает native-метод для освобождения памяти. В качестве этого указателя можно передать произвольное число, и тогда произвольная область памяти будет освобождена. Кому-то даже таким образом удалось подменить приложение Facebook, хотя я не представляю, как.

Решение этой проблемы очень простое — сделать указатель transient. Но мне кажется, что проблема в другом. Есть замечательный интерфейс Parcelable, который разработан специально для быстрой упаковки объекта и транспорта внутри устройства. И если программист не удосужился его реализовать, ему стоит либо передавать сериализованный объект как byte[], либо явно указать в манифесте, что ему плевать на производительность. Во всех остальных ситуациях нужно запретить класть сериализованные объекты в Bundle. Не место им там.

Общие компоненты

Любой Content Provider может стать дырой, если он явно экспортирован в манифесте или передан другому приложению. Broadcast Receiver'ы ещё более подвержены этому — их можно зарегистрировать без указания в манифесте. Так что следите, что ваши компоненты делают.

Интересная лазейка в WebView

  1. Создаём в своём каталоге файл, например, /data/data/cracker/exploit.html. Просим какое-нибудь приложение с WebView показать этот файл. Секунд через десять подменяем этот файл на символическую ссылку, допустим, на /data/data/weakly.secured.browser/databases/cookies.sqlite.
  2. exploit.html к тому моменту уже подгрузился и содержит iframe. Скрипт ждёт 10 секунд, а затем грузит в iframe тот же адрес — /data/data/cracker/exploit.html.
  3. Если браузер не проверит canonicalPath, то загрузит этот файл в iframe.
  4. ?????
  5. PROFIT!!!

Если ссылка жёсткая, то даже canonicalPath не помогает. В силу того что команды системного интерпретатора в Android очень ограниченные, проверить количество жёстких ссылок на файл довольно проблематично. Если интересно — пишите, обсудим, покажу код.

Кэш на карте памяти

Некоторые приложения (видимо, чтобы не замедлять работу системного раздела) в определённых условиях сливают файлы из /data/data/application.dir/ на карту памяти. Можно спровоцировать приложение слить на карту что-нибудь конфиденциальное, а затем считать это.

Data Binding. Свяжи свои данные! Руслан Ким

Как установить дополнение для Android Studio и Gradle и пользоваться записями вида android:text="@{user.name == null ? "не задано" : user.name}". Весь код строится до компиляции, а в качестве значения XML-аттрибута может выступать любое Java-выражение.

Видишь метрику?.. А она есть! Алексей Витенко

Как создавалась мобильная Яндекс.Метрика.

Одну библиотеку взяли не в полном, а в урезанном издании. Из Volley убрали кэширование. По мере роста функционала объём библиотеки уменьшался.

Когда приложение будет запущено, Метрика проверит, не работает ли уже служба Метрики (от другого приложения). Если работает, то новый экземпляр запускаться не будет, вся отсылка пройдёт через запущенную службу.

Служба, в свою очередь, не будет открывать соединение ради маленького объёма данных (уменьшение накладных расходов) и не будет будить передатчик, пока это не произойдёт добровольно.

Организация и фоточки

От метро и до метро подвезли на автобусах. В офисе угостили чаем/кофе и ланчем.

Слоган компании на стене Как бы диакритический знак.

Позитивные розетки Тумбочка с розетками.

Чай и ланч Можно было просто так брать и есть разные вкусности.

Урна для отработавших батареек Такая штука должна быть в каждой компании, в которой есть беспроводные мыши или клавиатуры. Смерть батарейкам!

Вебмастерская <!-- Наклейка на опоре -->

Странная держалка для телефона, фонарь для палатки, 200 подарочных облачных ГиБ. Ништяки, доставшиеся мне на конференции.

В этот день я увидел Яндекс с другой стороны. И мне понравилось.


← клик, если это интересно   |   ↓ место для вопросов и идей