За окном весенняя сырость и слякоть, а вот на осеннем Mobius-е на стенде HeadHunter было очень горячо. Первую часть quiz-а мы публиковали, сегодня — публикуем вторую, чтобы вы смогли размять мозги перед будущими конференциями.
Поехали!
![](https://habrastorage.org/webt/zp/0z/kc/zp0zkcfwzpsgr1kqdr0wzmfoenk.jpeg)
Поехали!
Вопрос 1
![](https://habrastorage.org/webt/1t/rr/gv/1trrgv2lkkr8ffgp5h8hnrxmq68.png)
Вопрос 2
![](https://habrastorage.org/webt/bh/mn/y_/bhmny_g-wr09xfklf1pix92phwc.png)
Вопрос 3
![](https://habrastorage.org/webt/ky/tw/lb/kytwlbizdmusts-8nghqm7usbiy.png)
Вопрос 4
![](https://habrastorage.org/webt/zh/jf/qq/zhjfqqptoi8qbwqmk4okpo8ezjc.png)
Вопрос 5
![](https://habrastorage.org/webt/xf/7m/2j/xf7m2jmf9asgipjpqwcj8cwbqge.png)
Вопрос 6
![](https://habrastorage.org/webt/it/_b/uv/it_buv1okvicvmkpfulvts-cuu8.png)
Вопрос 7
![](https://habrastorage.org/webt/2v/5v/n8/2v5vn8aymluc_hwdikpsogqg0bg.png)
Вопрос 8
![](https://habrastorage.org/webt/bg/go/tx/bggotxeyejprhoubjsltsacgw98.png)
Вопрос 9
![](https://habrastorage.org/webt/_g/9o/2n/_g9o2nqjlfvtly-ak_tqstt7krg.png)
Вопрос 10
![](https://habrastorage.org/webt/nm/qo/5o/nmqo5ogzhm2bepwqhd8lusybxmy.png)
Вопрос 11
![](https://habrastorage.org/webt/45/ic/4h/45ic4h5cdqvgytyhn5cphfwbcdg.png)
Вопрос 12
![](https://habrastorage.org/webt/0y/l5/gh/0yl5ghtuxiukvhxfmw_nnlb6iai.png)
Вопрос 13
![](https://habrastorage.org/webt/a2/s4/g3/a2s4g3svv8bfjuaicclwldhl_q0.png)
Вопрос 14
![](https://habrastorage.org/webt/mc/mg/ge/mcmggee7nu1fzyhevirevvc05tq.png)
Вопрос 15
![](https://habrastorage.org/webt/ya/dp/ac/yadpachdozsolfqpnckotzcuugg.png)
Поехали!
![](https://habrastorage.org/webt/zp/0z/kc/zp0zkcfwzpsgr1kqdr0wzmfoenk.jpeg)
Поехали!
Вопрос 1
![](https://habrastorage.org/webt/1t/rr/gv/1trrgv2lkkr8ffgp5h8hnrxmq68.png)
Ответ
Фотокамера
Пояснения
Вообще Android изначально разрабатывался компанией Android Inc. Создатели планировали, что он будет использован для создания “умных камер”. В 2005 году Google купил Android Inc и изменил вектор применения платформы в сторону мобильных устройств.
«Точно такая же платформа и операционная система, которую мы создавали для камер — стала Android для мобильных телефонов», — говорил сооснователь Android Энди Рубин.
Статистика ответов![](https://habrastorage.org/webt/nn/8h/k8/nn8hk8h0q-hjevho2j9_anc2p5w.png)
![](https://habrastorage.org/webt/nn/8h/k8/nn8hk8h0q-hjevho2j9_anc2p5w.png)
Вопрос 2
![](https://habrastorage.org/webt/bh/mn/y_/bhmny_g-wr09xfklf1pix92phwc.png)
Ответ
Android Debug Bridge
Пояснения
ADB (Android Debug Bridge) — это инструмент командной строки, осуществляющий выполнение команд на Android устройствах. Это клиент-серверная программа, состоящая из трех компонент:
— клиент, позволяющий отправлять команды;
— демон, выполняющий команды на устройстве;
— сервер, занимающийся управлением коммуникациями между клиентом и демоном.
Статистика ответов![](https://habrastorage.org/webt/xy/tz/an/xytzanbbw1y6youtl3levqmtpsi.png)
![](https://habrastorage.org/webt/xy/tz/an/xytzanbbw1y6youtl3levqmtpsi.png)
Вопрос 3
![](https://habrastorage.org/webt/ky/tw/lb/kytwlbizdmusts-8nghqm7usbiy.png)
Ответ
Android Package
Пояснения
APK (Android Package) — формат архивных исполняемых файлов для Android. Упаковывается инструментом aapt (Android Asset Packaging Tool). Условно работу этой утилиты можно разделить на два этапа:
— Компиляция. На данном этапе идет подготовка ресурсов: генерируется класс R, ресурсы XML переводятся в бинарный формат, производится обработка PNG и пр.
— Упаковка (линкование). Все промежуточные файлы, созданные на этапе компиляции, упаковываются в APK.
Процесс сборки Android приложения в общих чертах приведен в документации.
Статистика ответов![](https://habrastorage.org/webt/0b/5g/tr/0b5gtrbnfwg08cucfknjalmjfua.png)
![](https://habrastorage.org/webt/0b/5g/tr/0b5gtrbnfwg08cucfknjalmjfua.png)
Вопрос 4
![](https://habrastorage.org/webt/zh/jf/qq/zhjfqqptoi8qbwqmk4okpo8ezjc.png)
Ответ
Agera
Пояснения
![](https://habrastorage.org/webt/lm/hv/pt/lmhvptyc0tyoblkgqwfrnx-7c2k.png)
Agera — фреймворк для реактивного программирования под Android. В JetPack не входит.
Jetpack — набор библиотек, упрощающих разработку новых приложений под Android.
Slices — UI шаблоны для встраивания в другие приложения.
Android KTX — набор Kotlin extension функций, упрощающих разработку под Android.
Data binding — технология, с помощью которой мы можем автоматически привязывать данные прямо в XML коде.
![](https://habrastorage.org/webt/lm/hv/pt/lmhvptyc0tyoblkgqwfrnx-7c2k.png)
Статистика ответов![](https://habrastorage.org/webt/0v/ul/yj/0vulyj-pyvs1grudv56ug6hsk_i.png)
![](https://habrastorage.org/webt/0v/ul/yj/0vulyj-pyvs1grudv56ug6hsk_i.png)
Вопрос 5
![](https://habrastorage.org/webt/xf/7m/2j/xf7m2jmf9asgipjpqwcj8cwbqge.png)
Ответ
val hh = 1.
Пояснения
Вопрос был на кругозор языков программирования.
Вариант `hh = 1` можно встретить в Python, `def hh = 1` — в Groovy, а последний вариант — в Java, в которой мы обязаны указывать тип данных.
Статистика ответов![](https://habrastorage.org/webt/jk/vj/9a/jkvj9ad47xdclfxim34bf4qut6o.png)
![](https://habrastorage.org/webt/jk/vj/9a/jkvj9ad47xdclfxim34bf4qut6o.png)
Вопрос 6
![](https://habrastorage.org/webt/it/_b/uv/it_buv1okvicvmkpfulvts-cuu8.png)
Ответ
Remote
Пояснения
Normal — в данную категорию входят разрешения, которые не требуют доступа к конфиденциальным данным пользователя или не влияют на работу других приложений. Система автоматически предоставляет эти разрешения приложению во время установки и пользователи не могут отозвать их.
Signature — автоматически предоставляются приложению системой во время установки, как и normal permissions. Однако разница в том, что не каждое приложение может получить эти разрешения. Для этого необходимо, чтобы оно было подписано тем же сертификатом, что и приложение, которое это разрешение объявило.
Dangerous — в данную категорию входят разрешения, которые требуют доступа к конфиденциальным данным пользователя или могут повлиять на работу других приложений.
Special — это SYSTEM_ALERT_WINDOW и WRITE_SETTINGS.
Документация
Статистика ответов![](https://habrastorage.org/webt/ai/ok/2s/aiok2slecmeop5ha3yk4teql594.png)
![](https://habrastorage.org/webt/ai/ok/2s/aiok2slecmeop5ha3yk4teql594.png)
Вопрос 7
![](https://habrastorage.org/webt/2v/5v/n8/2v5vn8aymluc_hwdikpsogqg0bg.png)
Ответ
Principle Of Least Astonishment
Пояснения
Ох уж эти пять букв.
Single Responsibility Principle (принцип единой ответственности) — класс должен делать что-то одно.
Open Closed Principle (принцип открытости/закрытости) — программные сущности должны быть открыты для расширения, но закрыты для изменения.
Liskov Substitution Principle (принцип подстановки Барбары Лисков) — поведение класса-наследника не должно противоречить поведению, заданному классом-родителем.
Interface Segregation Principle (принцип разделения интерфейса) — программные сущности не должны зависеть от методов, которые они не используют
Dependency Inversion Principle (принцип инверсии зависимостей) — абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
А вот “Principle Of Least Astonishment” не входит в SOLID. Это правило гласит, что если назначение элемента неясно, то его поведение должно быть ожидаемым для пользователя (принцип наименьшего удивления).
Статистика ответов![](https://habrastorage.org/webt/ie/2f/ly/ie2flym7mby0uu-gns3adujlmds.png)
![](https://habrastorage.org/webt/ie/2f/ly/ie2flym7mby0uu-gns3adujlmds.png)
Вопрос 8
![](https://habrastorage.org/webt/bg/go/tx/bggotxeyejprhoubjsltsacgw98.png)
Ответ
Slices
Пояснения
Про Data Binding и Slices мы рассказывали чуть выше. Toast и Snackbar — элементы для нотификации пользователей в Android приложений и не могут быть встроены в другие приложения. Хоть Toast и может после показываться и после сворачивания приложения, в отличие от Slices он никуда не может быть встроен.
Статистика ответов![](https://habrastorage.org/webt/o4/yo/ht/o4yohtxqywaha3syitcrwdd9fse.png)
![](https://habrastorage.org/webt/o4/yo/ht/o4yohtxqywaha3syitcrwdd9fse.png)
Вопрос 9
![](https://habrastorage.org/webt/_g/9o/2n/_g9o2nqjlfvtly-ak_tqstt7krg.png)
Ответ
64K
Пояснения
Спецификация dex файла ограничивает общее количество методов на которые можно ссылаться до 65 536.
В версиях с Dalvik на борту (эпоха до API 21) для обхода данного ограничения необходимо подключать библиотеку multidex, которая становится частью основного dex файла и управляет доступом к остальным.
В свою очередь ART поддерживает загрузку множества dex файлов “из коробки”. При установке приложения ART сканирует файлы classesN.dex и компилирует их в один .oat файл для дальнейшей инициализации приложения.
Multidex
Статистика ответов![](https://habrastorage.org/webt/4r/nf/aa/4rnfaavua3o28ngldz-bjis14hy.png)
![](https://habrastorage.org/webt/4r/nf/aa/4rnfaavua3o28ngldz-bjis14hy.png)
Вопрос 10
![](https://habrastorage.org/webt/nm/qo/5o/nmqo5ogzhm2bepwqhd8lusybxmy.png)
Ответ
onPostPause()
Пояснения
onPostCreate() — вызывается после вызова onStart() и onRestoreInstanceState()
onPostResume() — вызывается после вызова onResume()
onResumeFragments() — фрагменториентированная версия метода onResume(). Вызывается внутри onPostResume(), после вызовов onResume() у фрагментов.
Статистика ответов![](https://habrastorage.org/webt/c8/nj/cu/c8njcujysxjhfmn8yq9szrxqy7q.png)
![](https://habrastorage.org/webt/c8/nj/cu/c8njcujysxjhfmn8yq9szrxqy7q.png)
Вопрос 11
![](https://habrastorage.org/webt/45/ic/4h/45ic4h5cdqvgytyhn5cphfwbcdg.png)
Ответ
Масштабируемая область
Пояснения
9-patch — это обычное .png изображение, в котором края размером в 1px содержат служебную информацию, интерпретируемая графической подсистемой Android следующим образом:
левая и верхняя границы задают область контента, которая будет растягиваться.
правая и нижняя границы задают область в которой будет размещаться контент.
Статистика ответов![](https://habrastorage.org/webt/va/ww/ab/vawwabvnsgijmu7aprjvznaiqpq.png)
![](https://habrastorage.org/webt/va/ww/ab/vawwabvnsgijmu7aprjvznaiqpq.png)
Вопрос 12
![](https://habrastorage.org/webt/0y/l5/gh/0yl5ghtuxiukvhxfmw_nnlb6iai.png)
Ответ
Zygote
Пояснения
Zygote — один из ключевых компонентов любой Android-системы. Он ответственен за инициализацию, старт системных служб, запуск и остановку пользовательских приложений и многие другие задачи. При инициализации Zygote формирует среду исполнения Java-приложений (путем загрузки всех Java-классов фреймворка) и стартует высокоуровневые системные службы (WindowManager, ActivityManager и пр.), после чего уходит в сон. При получении запроса на старт приложения, Zygote копирует сам себя (форкается) и запускает поверх полученной копии виртуальной машины нужное приложение. Такой принцип работы позволяет снизить расход памяти (Linux при форке копирует память в режиме copy-on-write) и ускорить запуск приложения (форк процесса происходит намного быстрее запуска новой виртуальной машины).
Статистика ответов![](https://habrastorage.org/webt/ls/pd/yq/lspdyqhqiqrmtuzbjv3js6da0nm.png)
![](https://habrastorage.org/webt/ls/pd/yq/lspdyqhqiqrmtuzbjv3js6da0nm.png)
Вопрос 13
![](https://habrastorage.org/webt/a2/s4/g3/a2s4g3svv8bfjuaicclwldhl_q0.png)
Ответ
Libraries
Пояснения
Уровни Android архитектуры разбирали в предыдущем квизе в 14 вопросе.
Статистика ответов![](https://habrastorage.org/webt/xv/bc/hm/xvbchm5_ms49x9ya95cmat6x2hm.png)
![](https://habrastorage.org/webt/xv/bc/hm/xvbchm5_ms49x9ya95cmat6x2hm.png)
Вопрос 14
![](https://habrastorage.org/webt/mc/mg/ge/mcmggee7nu1fzyhevirevvc05tq.png)
Ответ
Регистровая VM
Пояснения
Существует два основных способа реализации виртуальной машины: стековый (Java, .Net CLR) и регистровый (Lua VM, Dalvik VM). Основная разница между этими двумя подходами заключается в механизме, используемом для записи и получения операндов и результатов выполнения команд.
Стековая VM для хранения операндов использует стек. Операции получают данные из стека, обрабатывают их и заносят результат обратно в стек по правилу LIFO.
Регистровая VM для размещения операндов использует регистры процессора. Инструкции такой VM должны явно содержать адреса (регистры), в которых содержатся операнды.
За счет этой разницы команды в регистровой VM выполняются быстрее аналогичных команд стековой VM, однако они в среднем занимают больше памяти за счет явного указания операндов.
Еще одно преимущество регистровой VM — возможность сохранить вычисленное значение в регистре, что экономит время необходимое для пересчета выражений.
Причины выбора реализации Dalvik VM как регистровой VM (видео или слайды (35,36)
Статистика ответов![](https://habrastorage.org/webt/i6/ts/xq/i6tsxq6_iolgplxgyrcttma03le.png)
![](https://habrastorage.org/webt/i6/ts/xq/i6tsxq6_iolgplxgyrcttma03le.png)
Вопрос 15
![](https://habrastorage.org/webt/ya/dp/ac/yadpachdozsolfqpnckotzcuugg.png)
Ответ
Z
Пояснения
JNI — Java native interface — обеспечивает возможность запуска нативного C/C++ кода из Java, и наоборот.
Чтобы вызвать Java-функцию из C++ кода, нужно правильно описать ее сигнатуру. Пусть мы хотим вызвать функцию:
boolean f(String s)
Тогда в JNI мы сможем получить ссылку на нее следующим образом:
jmethodID myFunc = env->GetMethodID( activityClass, "myFunc", "(Ljava/lang/String;)Z");
Касательно типов при описании сигнатуры: 'B' используется для byte, 'C' — char, 'I' — int.
Type Signature Java Type Z boolean B byte C char S short I int J long F float D double L fully-qualified-class ; fully-qualified-class [ type type[] ( arg-types ) ret-type method type
(Источник)
Любопытно, что грабли с 'B' и 'Z', видимо, настолько популярны, что в доках к Android четко прописано: «Remember that 'B' is byte and 'Z' is boolean».
Ну что ж, мы запомнили)
Статистика ответов![](https://habrastorage.org/webt/wc/rd/vi/wcrdvizy1hh5f34covqcnzw-_bk.png)
![](https://habrastorage.org/webt/wc/rd/vi/wcrdvizy1hh5f34covqcnzw-_bk.png)