За окном весенняя сырость и слякоть, а вот на осеннем Mobius-е на стенде HeadHunter было очень горячо. Первую часть quiz-а мы публиковали, сегодня — публикуем вторую, чтобы вы смогли размять мозги перед будущими конференциями.
Поехали!
Поехали!
Вопрос 1
Вопрос 2
Вопрос 3
Вопрос 4
Вопрос 5
Вопрос 6
Вопрос 7
Вопрос 8
Вопрос 9
Вопрос 10
Вопрос 11
Вопрос 12
Вопрос 13
Вопрос 14
Вопрос 15
Поехали!
Поехали!
Вопрос 1
Ответ
Фотокамера
Пояснения
Вообще Android изначально разрабатывался компанией Android Inc. Создатели планировали, что он будет использован для создания “умных камер”. В 2005 году Google купил Android Inc и изменил вектор применения платформы в сторону мобильных устройств.
«Точно такая же платформа и операционная система, которую мы создавали для камер — стала Android для мобильных телефонов», — говорил сооснователь Android Энди Рубин.
Статистика ответов
Вопрос 2
Ответ
Android Debug Bridge
Пояснения
ADB (Android Debug Bridge) — это инструмент командной строки, осуществляющий выполнение команд на Android устройствах. Это клиент-серверная программа, состоящая из трех компонент:
— клиент, позволяющий отправлять команды;
— демон, выполняющий команды на устройстве;
— сервер, занимающийся управлением коммуникациями между клиентом и демоном.
Статистика ответов
Вопрос 3
Ответ
Android Package
Пояснения
APK (Android Package) — формат архивных исполняемых файлов для Android. Упаковывается инструментом aapt (Android Asset Packaging Tool). Условно работу этой утилиты можно разделить на два этапа:
— Компиляция. На данном этапе идет подготовка ресурсов: генерируется класс R, ресурсы XML переводятся в бинарный формат, производится обработка PNG и пр.
— Упаковка (линкование). Все промежуточные файлы, созданные на этапе компиляции, упаковываются в APK.
Процесс сборки Android приложения в общих чертах приведен в документации.
Статистика ответов
Вопрос 4
Ответ
Agera
Пояснения
Agera — фреймворк для реактивного программирования под Android. В JetPack не входит.
Jetpack — набор библиотек, упрощающих разработку новых приложений под Android.
Slices — UI шаблоны для встраивания в другие приложения.
Android KTX — набор Kotlin extension функций, упрощающих разработку под Android.
Data binding — технология, с помощью которой мы можем автоматически привязывать данные прямо в XML коде.
Статистика ответов
Вопрос 5
Ответ
val hh = 1.
Пояснения
Вопрос был на кругозор языков программирования.
Вариант `hh = 1` можно встретить в Python, `def hh = 1` — в Groovy, а последний вариант — в Java, в которой мы обязаны указывать тип данных.
Статистика ответов
Вопрос 6
Ответ
Remote
Пояснения
Normal — в данную категорию входят разрешения, которые не требуют доступа к конфиденциальным данным пользователя или не влияют на работу других приложений. Система автоматически предоставляет эти разрешения приложению во время установки и пользователи не могут отозвать их.
Signature — автоматически предоставляются приложению системой во время установки, как и normal permissions. Однако разница в том, что не каждое приложение может получить эти разрешения. Для этого необходимо, чтобы оно было подписано тем же сертификатом, что и приложение, которое это разрешение объявило.
Dangerous — в данную категорию входят разрешения, которые требуют доступа к конфиденциальным данным пользователя или могут повлиять на работу других приложений.
Special — это SYSTEM_ALERT_WINDOW и WRITE_SETTINGS.
Документация
Статистика ответов
Вопрос 7
Ответ
Principle Of Least Astonishment
Пояснения
Ох уж эти пять букв.
Single Responsibility Principle (принцип единой ответственности) — класс должен делать что-то одно.
Open Closed Principle (принцип открытости/закрытости) — программные сущности должны быть открыты для расширения, но закрыты для изменения.
Liskov Substitution Principle (принцип подстановки Барбары Лисков) — поведение класса-наследника не должно противоречить поведению, заданному классом-родителем.
Interface Segregation Principle (принцип разделения интерфейса) — программные сущности не должны зависеть от методов, которые они не используют
Dependency Inversion Principle (принцип инверсии зависимостей) — абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
А вот “Principle Of Least Astonishment” не входит в SOLID. Это правило гласит, что если назначение элемента неясно, то его поведение должно быть ожидаемым для пользователя (принцип наименьшего удивления).
Статистика ответов
Вопрос 8
Ответ
Slices
Пояснения
Про Data Binding и Slices мы рассказывали чуть выше. Toast и Snackbar — элементы для нотификации пользователей в Android приложений и не могут быть встроены в другие приложения. Хоть Toast и может после показываться и после сворачивания приложения, в отличие от Slices он никуда не может быть встроен.
Статистика ответов
Вопрос 9
Ответ
64K
Пояснения
Спецификация dex файла ограничивает общее количество методов на которые можно ссылаться до 65 536.
В версиях с Dalvik на борту (эпоха до API 21) для обхода данного ограничения необходимо подключать библиотеку multidex, которая становится частью основного dex файла и управляет доступом к остальным.
В свою очередь ART поддерживает загрузку множества dex файлов “из коробки”. При установке приложения ART сканирует файлы classesN.dex и компилирует их в один .oat файл для дальнейшей инициализации приложения.
Multidex
Статистика ответов
Вопрос 10
Ответ
onPostPause()
Пояснения
onPostCreate() — вызывается после вызова onStart() и onRestoreInstanceState()
onPostResume() — вызывается после вызова onResume()
onResumeFragments() — фрагменториентированная версия метода onResume(). Вызывается внутри onPostResume(), после вызовов onResume() у фрагментов.
Статистика ответов
Вопрос 11
Ответ
Масштабируемая область
Пояснения
9-patch — это обычное .png изображение, в котором края размером в 1px содержат служебную информацию, интерпретируемая графической подсистемой Android следующим образом:
левая и верхняя границы задают область контента, которая будет растягиваться.
правая и нижняя границы задают область в которой будет размещаться контент.
Статистика ответов
Вопрос 12
Ответ
Zygote
Пояснения
Zygote — один из ключевых компонентов любой Android-системы. Он ответственен за инициализацию, старт системных служб, запуск и остановку пользовательских приложений и многие другие задачи. При инициализации Zygote формирует среду исполнения Java-приложений (путем загрузки всех Java-классов фреймворка) и стартует высокоуровневые системные службы (WindowManager, ActivityManager и пр.), после чего уходит в сон. При получении запроса на старт приложения, Zygote копирует сам себя (форкается) и запускает поверх полученной копии виртуальной машины нужное приложение. Такой принцип работы позволяет снизить расход памяти (Linux при форке копирует память в режиме copy-on-write) и ускорить запуск приложения (форк процесса происходит намного быстрее запуска новой виртуальной машины).
Статистика ответов
Вопрос 13
Ответ
Libraries
Пояснения
Уровни Android архитектуры разбирали в предыдущем квизе в 14 вопросе.
Статистика ответов
Вопрос 14
Ответ
Регистровая VM
Пояснения
Существует два основных способа реализации виртуальной машины: стековый (Java, .Net CLR) и регистровый (Lua VM, Dalvik VM). Основная разница между этими двумя подходами заключается в механизме, используемом для записи и получения операндов и результатов выполнения команд.
Стековая VM для хранения операндов использует стек. Операции получают данные из стека, обрабатывают их и заносят результат обратно в стек по правилу LIFO.
Регистровая VM для размещения операндов использует регистры процессора. Инструкции такой VM должны явно содержать адреса (регистры), в которых содержатся операнды.
За счет этой разницы команды в регистровой VM выполняются быстрее аналогичных команд стековой VM, однако они в среднем занимают больше памяти за счет явного указания операндов.
Еще одно преимущество регистровой VM — возможность сохранить вычисленное значение в регистре, что экономит время необходимое для пересчета выражений.
Причины выбора реализации Dalvik VM как регистровой VM (видео или слайды (35,36)
Статистика ответов
Вопрос 15
Ответ
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».
Ну что ж, мы запомнили)
Статистика ответов