Skip to content

gpetuhov/AndroidInterview

Repository files navigation

Android Interview Questions and Code Samples

Basic plan and some typical questions and code samples for Android interview.

Latest update: 2024.10.22

Previous experience / Soft skills

  • Tell us about yourself and your previous experience.
  • What was the project you worked on your previous job?
  • What was your role in the project?
  • Which part of the project you worked on?
  • Is there anything you are particularly proud of?
  • Who was in the team?
  • How collaboration inside the team was organized? Who set tasks?
  • Вам поставили задачу и срок выполнения. Решить задачу не получается, изучение документации и поиск в сети не помогает. Ваши действия?
  • Вы получили замечания на код-ревью, с которыми не согласны. Ваши действия?
  • Приведите пример конфликтной ситуации и ваших действий в ней
  • Какая самая сложная задача, которую вы решали за последний спринт?
  • Приведите пример цели, которую вы себе ставили
  • Give an example of the situation, when you disagreed with the management
  • Tell us about an example, when you and your colleague have completely different styles of work
  • Какая ваша самая большая ошибка/неудача?
  • Приведите пример вашего решения, которое хотелось бы изменить. Что бы вы сейчас сделали иначе?
  • Приведите пример, когда вы были не согласны с менеджером
  • Назовите ваши сильные и слабые стороны
  • What’s the most challenging project you’ve worked on? What technical challenges did you face? How did you overcome them?
  • Tell me about a time when something went wrong in your project. What did you do?
  • What’s the most interesting project you’ve worked on? What tools did you use?
  • Why did you choose this technology or programming language for the project?
  • What user problem did you solve?
  • How did this choice affect the business?
  • What other technologies could help you solve this problem?
  • Would you like to take any on-the-job courses?
  • So you mentioned that you have a lot of experience building applications. What is one piece of advice you would give to a junior developer in this respect?
  • Most software engineers work for a few years before taking on this role. How did you manage to do that in a year?
  • Could you give me an example of technology that inspires you?
  • What’s your favorite part about bringing a new product to the market?
  • Tell me about the project you’re proud of
  • Tell me about the time when you had to deal with an unexpected issue
  • Why did you choose this technology or programming language for the project?

Use STAR framework

Быть готовым ответить на эти вопросы по предыдущим 3 проектам (3 местам работы)

OOP and SOLID

https://medium.com/@ruberoid55/grasp-principles-lead-by-examples-for-android-development-part-1-ed9e087b5fe1

https://bool.dev/blog/detail/grasp-printsipy

https://habr.com/ru/company/otus/blog/491636/

https://habr.com/ru/company/otus/blog/505618/

https://habr.com/ru/company/otus/blog/505852/

https://habr.com/ru/company/otus/blog/507600/

https://habr.com/ru/company/otus/blog/521476/

  • Почему композиция лучше наследования? - https://stackoverflow.com/questions/49002/prefer-composition-over-inheritance
  • Какие минусы у наследования?
  • Чем композиция отличается от наследования? - При наследовании мы меняем функционал класса, а при композции можем расширить функционал класса, не изменяя сам класс.
  • Clean code
  • Как в алгоритмах оценивают потребление памяти? - Тоже в терминах O(), как и вычислительную сложность - https://www.geeksforgeeks.org/analysis-algorithms-big-o-analysis/
  • Проблемы множественного наследования - почему в Java от него отказались?
  • Чем ООП отличается от других парадигм программирования?
  • Какие еще существуют парадигмы программирования, кроме ООП?
  • Агрегация и композиция, отличия

https://habr.com/ru/post/354046/

https://ru.stackoverflow.com/questions/596697/%D0%90%D0%B3%D1%80%D0%B5%D0%B3%D0%B0%D1%86%D0%B8%D1%8F-%D0%B8-%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D1%8F

  • Привести примеры инкапсуляции, наследования и полиморфизма
  • KISS, DRY, YAGNI
  • Преимущества и недостатки ООП

https://tproger.ru/articles/pljusy-minusy-i-perspektivy-oop-v-sovremennoj-razrabotke/

https://tproger.ru/translations/oop-the-trillion-dollar-disaster/?utm_referrer=recommendation-banner

Design Patterns

  • Design Patterns: creational, behavioral, structural

https://habr.com/ru/company/vk/blog/325492/

https://habr.com/ru/post/210288/

Git

https://learngitbranching.js.org/

  • Gitflow
  • Git merge vs rebase

Java

https://github.com/enhorse/java-interview

https://javarush.ru/groups/posts/646-kak-proiskhodit-zagruzka-klassov-v-jvm

https://www.baeldung.com/java-classloaders

  • Когда ClassLoader грузит класс - при первом обращении к классу
  • Java Memory Model - Структура памяти в JVM

http://tutorials.jenkov.com/java-concurrency/java-memory-model.html

https://habr.com/ru/post/510454/

https://habr.com/ru/post/510618/

https://java-online.ru/garbage-collection.xhtml

https://habr.com/ru/post/269621/

https://habr.com/ru/post/269707/

https://habr.com/ru/post/269863/

https://habr.com/ru/post/680038/

https://habr.com/ru/post/681116/

https://habr.com/ru/post/681256/

https://www.geeksforgeeks.org/garbage-collection-java/

  • В какой момент Garbage Collector может собрать объект?
  • Как GC поймет, что на объект никто не ссылается

https://www.dynatrace.com/resources/ebooks/javabook/how-garbage-collection-works/

https://stackoverflow.com/questions/27186799/what-are-gc-roots-for-classes

https://www.yourkit.com/docs/java/help/gc_roots.jsp

  • Что является root для Garbage Collection? - https://www.baeldung.com/java-gc-roots
  • Ссылочный граф
  • Как GC идет по ссылочному графу? - От листьев к корню. Если не может дойти до корня, то объекты, от которых нет пути к корню, помечаются к удалению.
  • Стратегии очистки памяти g1, serial, parallel
  • В памяти находятся два объекта и ссылаются друг на друга, больше на них никто не ссылается. Соберет ли их GC? - да, это называется island of isolation
  • Для чего нужен Object? - Объявляет ряд базовых методов, в том числе для организации многопоточности, также нужен для того, чтобы garbage collector мог собрать объекты
  • Что произойдет, если после очистки памяти памяти все равно будет недостаточно? - OutOfMemory Exception
  • Что произойдет, если память закончится в резульате рекурсивных вызовов функции? - StackOverflow
  • Методы Object - https://www.geeksforgeeks.org/object-class-in-java/
  • Object.clone() можно ли вызвать? - Нет, если не имплеменить Cloneable интерфейс - https://en.wikipedia.org/wiki/Clone_(Java_method)
  • Object.finalize()

https://www.tutorialspoint.com/java/lang/object_finalize.htm#:~:text=finalize()%20is%20called%20by,or%20to%20perform%20other%20cleanup.

https://www.baeldung.com/java-finalize

  • Зачем нужны методы equals и hashcode
  • Если переопределил equals, то надо ли переопределять hashcode? - надо
  • Контракт между equals и hashcode - если equals true, то хешкоды равны. Обратное может не выполняться - если хешкоды равны, то equals не обязательно true, так как для разных объектов существует вероятность получить одинаковый хешкод (коллизия) - https://www.baeldung.com/java-equals-hashcode-contracts
  • Можно ли использовать мутабельные поля для вычисления equals и hashcode? - нет, это может создать проблемы например в хештаблице

https://dzone.com/articles/java-hashing

https://jqno.nl/equalsverifier/errormessages/mutability-equals-depends-on-mutable-field/

  • Каким свойствам должен отвечать хешкод? - Скорость, разброс, иммутабельность (иммутабельность полей, на основе которых вычисляется хешкод)
  • Как вычисляется hashcode по умолчанию (если его не переопределить)? - В разных JVM по-разному: это может быть случайное число или адрес объекта
  • Как вычисляется hashcode в Dalvik (Android 4.4) - Адрес объекта >> 3 бита
  • Что может вернуть x.equals(null) - Если x == null, то NPE, иначе false
  • Есть класс A с полями x, y и методом equals. От него наследуется класс B с полем z и класс C с полем m. Надо ли в B и C переопределять equals? - Надо

http://www.angelikalanger.com/Articles/JavaSolutions/SecretsOfEquals/Equals.html

http://www.angelikalanger.com/Articles/JavaSolutions/SecretsOfEquals/Equals-2.html

  • Почему в equals вместо instanceOf делают getClass? - чтобы сравнение с потомками не вернуло true
  • Как сделать equals для двух массивов? - Arrays.deepEquals()

https://www.baeldung.com/java-arrays-deepequals

https://www.geeksforgeeks.org/equals-and-deepequals-method-to-compare-two-arrays-in-java/

https://www.geeksforgeeks.org/java-util-arrays-deepequals-java/

  • Методы wait() (их несколько), notify(), notifyAll()

https://jenkov.com/tutorials/java-concurrency/thread-signaling.html

https://www.baeldung.com/java-wait-notify

  • Types of references in Java (Strong, Weak, Soft, Phantom)

https://www.geeksforgeeks.org/types-references-java/

https://www.baeldung.com/java-weak-reference

https://www.baeldung.com/java-phantom-reference

https://www.baeldung.com/java-soft-references

https://javarush.ru/quests/lectures/questcollections.level04.lecture03

https://javarush.ru/quests/lectures/questcollections.level04.lecture05

https://javarush.ru/groups/posts/2291-osobennosti-phantomreference

https://stackoverflow.com/questions/299659/whats-the-difference-between-softreference-and-weakreference-in-java/299702#299702

https://medium.com/google-developer-experts/finally-understanding-how-references-work-in-android-and-java-26a0d9c92f83

  • Практический пример использования SoftReference

https://javarush.ru/groups/posts/1267-otlichija-mezhdu-slabihmi-mjagkimi-fantomnihmi-i-obihchnihmi-ssihlkami-v-java

https://habr.com/ru/post/169883/

https://javarush.ru/groups/posts/2291-osobennosti-phantomreference

https://developer.android.com/reference/java/lang/ref/PhantomReference#:~:text=Phantom%20references%20are%20most%20often,with%20the%20Java%20finalization%20mechanism.&text=Unlike%20soft%20and%20weak%20references,collector%20as%20they%20are%20enqueued.

https://stackoverflow.com/questions/53822132/java-phantomreference-vs-finalize

https://o7planning.org/13697/java-phantomreference

http://www.quizful.net/post/Java-Collections

https://habr.com/ru/post/162017/

  • Почему Map не Collection - у Collection есть методы доступа по индексу, которые не нужны в Map
  • int i - это value или reference? - value
  • What is boxing, unboxing (Integer, Double, ...)
  • Можно ли примитивы класть в коллекции (int, double, ...) - нет
  • ArrayList vs LinkedList. Which one takes less time to add an item in the middle? Which one takes less time to get n-th element?
  • Какие накладные расходы для хранения двусвязного списка? - На каждую ноду: инстанс самой ноды, ссылка на следующий элемент, ссылка на предыдущий элемент.
  • ArrayList под капотом - это динамический массив с изначальным размером 10
  • List vs Set - https://www.geeksforgeeks.org/difference-between-list-and-set-in-java/
  • ArrayList vs Vector - https://www.geeksforgeeks.org/vector-vs-arraylist-java/
  • SparseArray

https://developer.android.com/reference/android/util/SparseArray

https://stackoverflow.com/questions/25444226/difference-between-sparsearray-vs-arraylist#:~:text=2%20Answers&text=The%20purpose%20of%20a%20SparseArray,that%20will%20be%20quite%20wasteful.

  • Binary search - https://www.baeldung.com/java-binary-search
  • Какие свойства должны быть у коллекции для бинарного поиска
  • Какая сложность поиска элемента в упорядоченном массиве? - Для этого применяем бинарный поиск. Его сложность - O(logn)
  • Какие еще бывают оценки сложности, кроме большое O?
  • малое O описывает верхнюю границу, исключая точную оценку

  • омега описывает нижнюю границу сложности

  • тета описывает точную оценку сложности

  • Как работает HashMap?
  • Что будет, если в Map положить два значения с одинаковым ключом? - Последнее значение перезапишет предыдущеe
  • Что такое коллизия?
  • HashMap - защита от коллизий - Запись в LinkedList в случае коллизий
  • What will Hashmap become, if all the elements will have the same hashcode? - HashMap will become a LinkedList
  • Можно ли в HashMap положить элемент с ключом null? - можно - https://stackoverflow.com/questions/25932730/hashmap-with-null-key-and-null-value#:~:text=HashMap%20puts%20null%20key%20in,linked%20list%20data%20structure%20internally.&text=In%20Entry%20class%20the%20K,value%20passed%20in%20put%20method.
  • Есть ли в HashMap LinkedList по ключу null - Нет, там только один элемент, так как у null не может быть equals
  • HashMap - что такое бакеты? - Это и есть те элементы, которые адресуются на основе хешкода (бакетами могут быть связанные списки или бинарные деревья) - https://www.baeldung.com/java-hashmap
  • Изменения в HashMap, начиная с Java 8 - При превышении порогового значения количества элементов вместо LinkedList используется дерево (см. следующий вопрос) - https://habr.com/ru/post/421179/
  • Всегда ли в бакетах в HashMap используется LinkedList? - Нет. При большом количестве элементов в бакете LinkedList заменяется на binary tree. Тогда время поиска элемента становится O(logn) вместо O(n) Примечение: log по основанию 2
  • Как выбрать изначальный размер массива в HashMap
  • Почему изначальный размер массива в HashMap выбран 16
  • Можно ли коллекцию использовать в качестве ключа? - Да, можно, но важно при этом правильно вычислять хешкод на основе иммутабельных данных
  • Как устроен HashSet под капотом? - это HashMap, у которой ключом является элемент множества, а значением константа

https://javarush.ru/groups/posts/2147-hashset-v-java

https://habr.com/ru/company/otus/blog/495032/

https://javarush.ru/groups/posts/2584-osobennosti-treemap

https://www.geeksforgeeks.org/treemap-in-java/

https://www.baeldung.com/java-treemap

https://www.journaldev.com/1377/java-singleton-design-pattern-best-practices-examples

https://habr.com/ru/post/129494/

https://www.baeldung.com/java-singleton

  • Виды сортировок - пузырьком O(n^2), слиянием O(nlogn), быстрая сортировка O(nlogn), сортировка подсчетом (применим только в некоторых случаях) O(n+k) где k - количество различных элементов
  • IntegerCache - https://www.geeksforgeeks.org/java-integer-cache/
  • Чтение из файла
  • Битовые операции, побитовые сдвиги
  • Big endian, little endian

https://www.geeksforgeeks.org/little-and-big-endian-mystery/

https://howtodoinjava.com/java/basics/little-endian-big-endian/

  • Как сравнить объекты? - https://www.baeldung.com/java-comparing-objects
  • Где хранятся статические поля/классы? - В куче
  • Как в Java сделать синглтон? Что такое синглтон с точки зрения Java?

Generics

Multithreading

https://github.com/gpetuhov/MultithreadingTutorial

https://habr.com/ru/companies/otus/articles/353414/

  • Процессы и потоки

https://developer.android.com/guide/components/processes-and-threads

https://techdifferences.com/difference-between-process-and-thread-in-java.html

  • Чем отличается асинхронность, многопоточность и конкурентность?

https://medium.com/swift-india/concurrency-parallelism-threads-processes-async-and-sync-related-39fd951bc61d

https://www.baeldung.com/cs/async-vs-multi-threading

https://codewala.net/2015/07/29/concurrency-vs-multi-threading-vs-asynchronous-programming-explained/

https://www.baeldung.com/java-executor-service-tutorial

  • Какие состояния может иметь поток и каков смысл каждого состояния Thread.getState()

https://www.baeldung.com/java-thread-lifecycle

https://www.geeksforgeeks.org/lifecycle-and-states-of-a-thread-in-java/

  • Race condition - точное определение
  • synchronized vs volatile

https://jenkov.com/tutorials/java-concurrency/synchronized.html

https://jenkov.com/tutorials/java-concurrency/volatile.html

https://www.baeldung.com/java-synchronized

https://stackoverflow.com/questions/3519664/difference-between-volatile-and-synchronized-in-java

  • Поможет ли volatile от гонки? - нет - Почему не помогает?

https://www.javatpoint.com/volatile-keyword-in-java

https://www.baeldung.com/java-volatile-variables-thread-safety

https://jenkov.com/tutorials/java-concurrency/deadlock.html

https://jenkov.com/tutorials/java-concurrency/deadlock-prevention.html

https://www.baeldung.com/java-deadlock-livelock

https://www.baeldung.com/java-dining-philoshophers

https://jenkov.com/tutorials/java-concurrency/starvation-and-fairness.html

https://blog.katastros.com/a?ID=01750-09f35317-998a-46e0-898f-90568ca53cdc

https://ru.stackoverflow.com/questions/616278/%D0%90%D1%82%D0%BE%D0%BC%D0%B0%D1%80%D0%BD%D1%8B%D0%B5-%D0%B8-%D0%BD%D0%B5%D0%B0%D1%82%D0%BE%D0%BC%D0%B0%D1%80%D0%BD%D1%8B%D0%B5-%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8-java

https://www.baeldung.com/java-atomic-variables

https://www.baeldung.com/java-concurrent-map

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html

  • ThreadLocal

https://jenkov.com/tutorials/java-concurrency/threadlocal.html

https://www.baeldung.com/java-threadlocal

https://habr.com/ru/post/108016/

https://javarush.ru/quests/lectures/jru.module2.lecture26

  • Средства синхронизации потоков (семафор, фазер)

https://jenkov.com/tutorials/java-concurrency/semaphores.html

https://habr.com/ru/post/277669/

  • ReentrantLock
  • ReadWriteLock
  • Семафоры - CountDownLatch, CyclicBarrier, Phaser

https://www.baeldung.com/java-semaphore

https://www.baeldung.com/java-countdown-latch

https://www.baeldung.com/java-cyclic-barrier

https://www.baeldung.com/java-phaser

https://javarush.ru/groups/posts/2174-v-chem-raznica-mezhdu-mjhjuteksom-monitorom-i-semaforom

https://www.baeldung.com/java-mutex

https://stackoverflow.com/questions/37026/java-notify-vs-notifyall-all-over-again

https://www.geeksforgeeks.org/difference-between-notify-and-notifyall-in-java/

  • Какие два метода класса Object можно использовать для реализации простого сценария producer / consumer?

https://www.baeldung.com/java-producer-consumer-problem

https://www.geeksforgeeks.org/inter-thread-communication-java/

https://jenkov.com/tutorials/java-concurrency/java-happens-before-guarantee.html

https://www.geeksforgeeks.org/happens-before-relationship-in-java/#:~:text=Happens%2Dbefore%20is%20not%20any,code%20that%20produces%20incorrect%20output.

  • Дефолтный приоритет нового потока в Java и его аналог Linux

https://www.baeldung.com/java-thread-priority

https://medium.com/@vikas.singh_67409/deep-dive-into-thread-priority-in-java-be1a5da30a34

Kotlin

https://kotlinlang.org/docs/sealed-classes.html

https://jorgecastillo.dev/sealed-interfaces-kotlin

  • lateinit vs lazy
  • Lazy потокобезопасный? - По умолчанию, да
  • Типы делегатов - property, interface
  • Property delegates

https://medium.com/nuances-of-programming/%D0%B4%D0%B5%D0%BB%D0%B5%D0%B3%D0%B0%D1%82%D1%8B-%D0%B2-kotlin-%D0%B4%D0%BB%D1%8Fandroid-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D0%B9%D1%82%D0%B5-%D1%81%D0%B8%D0%BB%D1%83-%D0%B4%D0%B5%D0%BB%D0%B5%D0%B3%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2-%D0%B2-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B5-%D0%BF%D0%BE%D0%B4-android-ca4d88d42800

https://kotlinlang.org/docs/delegation.html#overriding-a-member-of-an-interface-implemented-by-delegation

https://kotlinlang.org/docs/delegated-properties.html#property-delegate-requirements

  • Delegates - как там реализована потокобезопасность?

https://www.codementor.io/@packt/delegated-properties-in-kotlin-kqda9rze4

https://medium.com/androiddevelopers/built-in-delegates-4811947e781f

https://www.baeldung.com/kotlin/inline-functions

https://www.baeldung.com/kotlin/crossinline-vs-noinline

https://developer.android.com/codelabs/basic-android-kotlin-training-collections?hl=en#0

https://developer.android.com/codelabs/basic-android-kotlin-collections?hl=en#0

https://developer.android.com/codelabs/basic-android-kotlin-compose-collections?hl=en#0

https://developer.android.com/codelabs/basic-android-kotlin-compose-higher-order-functions?hl=en#0

  • Разница между == в Java и Kotlin? - В Java - это сравнение ссылок, в Kotlin - equals. Чтобы в Kotlin сравнить ссылки, надо ===
  • Разница исключений в Java и Kotlin? - В Java есть проверяемые исключения, на которые будет ругаться компилятор. В Kotlin такого нет, то есть проверка исключений будет только в рантайме.

RxJava

https://github.com/gpetuhov/RxJavaTutorial

https://www.baeldung.com/rxjava-testing

https://medium.com/@vanniktech/testing-rxjava-code-made-easy-4cc32450fc9a

Kotlin coroutines

Marcin Moskala - Kotlin Coroutines: Deep Dive

https://developer.android.com/kotlin/coroutines

https://developer.android.com/kotlin/flow

https://developer.android.com/courses/pathways/android-coroutines

https://github.com/Kotlin/kotlinx.coroutines/blob/master/docs/topics/coroutines-guide.md

https://kotlinlang.org/docs/exception-handling.html

https://victorbrandalise.com/coroutines-part-iii-structured-concurrency-and-cancellation/

https://kotlinlang.org/docs/shared-mutable-state-and-concurrency.html

https://kt.academy/article/cc-state

  • Что будет, если использовать synchronized в корутинах? - ошибка компиляции

https://blog.danlew.net/2020/01/28/coroutines-and-java-synchronization-dont-mix/

https://jacquessmuts.github.io/post/coroutine_sync_mutex/

https://www.javaadvent.com/2021/12/are-kotlin-coroutines-enough-to-replace-rxjava.html

https://proandroiddev.com/from-rxjava-2-to-kotlin-flow-threading-8618867e1955

https://habr.com/ru/company/simbirsoft/blog/534706/

https://developer.android.com/kotlin/flow

https://developer.android.com/codelabs/advanced-kotlin-coroutines?hl=en#0

https://stackoverflow.com/questions/46227462/how-to-use-code-that-relies-on-threadlocal-with-kotlin-coroutines

https://kotlinlang.org/docs/coroutine-context-and-dispatchers.html#thread-local-data

https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-thread-context-element/

https://kt.academy/article/cc-job

https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-job/

https://proandroiddev.com/kotlin-coroutine-job-hierarchy-finish-cancel-and-fail-2d3d42a768a9

  • Supervisor Job

https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-supervisor-job.html

https://victorbrandalise.com/coroutines-part-ii-job-supervisorjob-launch-and-async/

https://codingwithmohit.com/coroutines/coroutines-job-structure/

https://habr.com/ru/post/432942/

  • async начинает ли сразу выполняться? - Да. Если надо ленивый запуск, то async(start = CoroutineStart.LAZY)

https://medium.com/@sampsonjoliver/achieving-async-await-in-the-android-wasteland-a6fe30dbaaa1

https://medium.com/@sampsonjoliver/promises-in-android-and-java-d6b1c418ea6c

https://medium.com/@sampsonjoliver/lazy-evaluated-coroutines-in-kotlin-bf5be004233

  • Как работать с исключениями в корутинах? Можно ли launch обернуть в try-catch?

https://kt.academy/article/cc-exception-handling

https://kotlinlang.org/docs/exception-handling.html

https://medium.com/androiddevelopers/exceptions-in-coroutines-ce8da1ec060c

https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/suspend-cancellable-coroutine.html

https://medium.com/swlh/kotlin-coroutines-in-android-suspending-functions-8a2f980811f8

Android

Low level details

  • JVM vs Dalvik vs ART

https://habr.com/ru/post/471772/

https://habr.com/ru/post/513928/

https://medium.com/programming-lite/android-core-jvm-dvm-art-jit-aot-855039a9a8fa

https://russianblogs.com/article/1180831184/

https://habr.com/ru/company/mailru/blog/451894/

https://habr.com/ru/post/99162/

  • JIT, AOT

https://source.android.com/devices/tech/dalvik/jit-compiler

https://stackoverflow.com/questions/40336455/difference-between-aot-and-jit-compiler-in-the-art

https://itsobes.ru/JavaSobes/v-chyom-raznica-mezhdu-interpretatorom-aot-i-jit-kompilyatorom/

  • Из какого кода в какой компилируется JIT и AOT компиляторами? - из java bytecode в машинный

https://habr.com/ru/company/skillbox/blog/441798/

https://ru.stackoverflow.com/questions/1033427/%D0%9A%D0%B0%D0%BA-%D0%BF%D1%80%D0%BE%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%B8%D1%82-%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9-%D0%BD%D0%B0-android

  • Можно ли разрабатывать под Андроид на Python, Scala или других языках? - Можно, если есть возможность компиляции языка в Java байт-код

https://tproger.ru/translations/python-development-on-android/

https://habr.com/ru/post/327782/

https://habr.com/ru/post/521522/

https://habr.com/ru/post/522670/

https://medium.com/android-news/android-application-launch-explained-from-zygote-to-your-activity-oncreate-8a8f036864b

https://proandroiddev.com/android-internals-101-how-android-os-starts-you-application-e1c98a014c05

  • Zygote
  • ActivityTaskManager
  • Уровни архитектуры Android

Application - уровень приложений

Application Framework - уровень фреймворков для работы приложений (так же называется каркас): View, ContentProviders, ResourceManager, ActivityManager и т.д.

Library - уровень с/с++ библиотек для работы разных компонентов ос, например System C Library (libc для linux), MediaLibraries, SurfaceManager, SQLite, SGL, SSL и т.д.

Android Runtime - среда выполнения, набор утилит для ядра и виртуальная машина (Dalvik, Art)

Linux Kernel - уровень ядра Linux, основные службы по работе с железом находятся тут, например IPC Driver, Power Manager и другие

https://data-flair.training/blogs/android-architecture/#:~:text=Now%2C%20we%20will%20start%20with,Android%20runtime%2C%20and%20System%20applications.

https://developer.android.com/guide/platform

https://www.guru99.com/android-architecture.html

  • Детали ОС Android:

https://habr.com/ru/company/solarsecurity/blog/334796/

https://habr.com/ru/company/solarsecurity/blog/338292/

https://habr.com/ru/company/solarsecurity/blog/338494/

https://habr.com/ru/company/solarsecurity/blog/427431/

  • Можно ли запустить компоненты разных приложений в одном процессе? - да, это дефолтное поведение (например в случае Intent.ACTION_VIEW), но можно вообще сделать разные приложения, работающие в одном процессе - https://stackoverflow.com/questions/17664090/can-multiple-android-applications-share-a-single-process-and-application-context
  • Можно ли запустить компоненты одного приложения в разных процессах? - да
  • AIDL

https://habr.com/ru/post/537660/

https://developer.android.com/guide/components/aidl

  • RenderThread

https://medium.com/@workingkills/understanding-the-renderthread-4dc17bcaf979

https://habr.com/ru/company/edison/blog/271811/

https://russianblogs.com/article/58471210856/

Basics

  • Android components and what are they used for (Activity, Service, Content Provider, Broadcast Receiver)
  • Почему Application не компонент? - Потому что это не точка входа в приложение
  • Как Андроид компоненты влияют на приоритет процесса

https://developer.android.com/guide/components/activities/process-lifecycle

https://medium.com/androiddevelopers/who-lives-and-who-dies-process-priorities-on-android-cb151f39044f

  • Project structure of an Android application (modules, manifest, source, res, assets, Gradle scripts)
  • What is AndroidManifest.xml?
  • Состав манифеста: permissions, intent filters, features, meta
  • Манифест многомодульного проекта, manifest merge - https://android-doc.github.io/tools/building/manifest-merge.html
  • Как с помощью flavors убрать из смерженного манифеста некоторые теги (например, определенные permissions) только в одном флейворе

https://developer.android.com/studio/build/manage-manifests

https://stackoverflow.com/questions/66382274/removing-permissions-from-manifest-depending-on-build-flavor

https://stackoverflow.com/questions/10641144/difference-between-getcontext-getapplicationcontext-getbasecontext-and

https://stackoverflow.com/questions/1026973/whats-the-difference-between-the-various-methods-to-get-an-android-context

https://stackoverflow.com/questions/4128589/difference-between-activity-context-and-application-context

https://medium.com/@ali.muzaffar/which-context-should-i-use-in-android-e3133d00772c

https://medium.com/@banmarkovic/what-is-context-in-android-and-which-one-should-you-use-e1a8c6529652

  • Отличие контекста активити и апп контекста? - Отличаются временем жизни. Апп контекст только один, а активити может быть много. Активити имеет связку с Window и много знает про тему и кастомизацию. Когда LayoutInflater создает вьюшку из лейаута, то он берет тему из parent ViewGroup и из контекста и на основе этого формируется вьюшка. Тема может быть в апп и в активити. В LayoutInflater в идеале надо передавать тему вьюгруппы, потому что начиная с Android 5.0 есть theme overlay и тему можно переопределить локально в рамках какой-то группы
  • В случае какого Context может быть утечка памяти? - В случае, если сохранять где-то Activity Context. Если сохранять Application Context, то утечки не будет, так как Application Context всегда имеет один экземпляр в одном запущенном приложении.
  • Отображение AlertDialog из app context - https://nhancv.medium.com/android-show-dialog-without-activity-context-94661d48400f
  • Сменится ли тема у диалога, отображенного из app context, если пользователь поменяет тему на темную? - нет, так как при смене темы пересоздается только активити, но не всё приложение
  • Сменится ли язык при смене языка в системе, если строки получали с помощью app context? - нет, так как приложение не пересоздается при смене языка
  • Старт активити из контекста сервиса - нельзя, начиная с Android 10 - https://stackoverflow.com/questions/3606596/start-activity-from-service-in-android === https://developer.android.com/guide/components/activities/background-starts
  • BaseContext
  • ContextThemeWrapper - https://ataulm.com/2019/11/20/using-context-theme-wrapper.html
  • raw vs assets - что где хранить, отличия? (в raw доступ через R.raw.id, в assets через asset manager) - https://stackoverflow.com/questions/5583608/difference-between-res-and-assets-directories
  • Что такое утечки памяти, как они возникают, как их диагностировать (профилировщик, Leak Canary)?

https://www.raywenderlich.com/4690472-memory-leaks-in-android

https://dropbox.tech/mobile/detecting-memory-leaks-in-android-applications

https://proandroiddev.com/everything-you-need-to-know-about-memory-leaks-in-android-d7a59faaf46a

  • В чем проблема утечки памяти в случае активити? - Активити утекает вместе со всеми своими вьюхами. Вьюха может содержать картинку (bitmap) и иметь размер в несколько мегабайт. Поэтому при каждом повороте экрана будет терять несколько мегабайт. Еще одна проблема: контекст вьюхи - это чаще всего контекст активити, поэтому если утекает вьюха, то утекает и активити.
  • На основе какого принципа основана Leak Canary? - Взять активити, создать на нее PhantomReference, после поворота экрана посмотреть ее поле mDestroyed. Если оно true и активити нет в ReferenceQueue, то активити скорее всего утекает. Если такая ситуация повторяется несколько раз, то делаем вывод, что утечка есть

http://developer.alexanderklimov.ru/android/debug/leakcanary.php

https://russianblogs.com/article/80601561279/

https://developpaper.com/android-leakcanary-memory-leak-detection-principle/

польователь может закрыть foreground service одной кнопкой

требуются разрешения на показ уведомлений

приложение не может запустить foreground service из фона

  • Где залогировать место старта приложения? - ContentProvider создается раньше класса приложения
  • Почему в Application есть метод onCreate, но нет onDestroy? - в Андроиде нет такого понятия, как "закрыть" приложение, пользователь просто уходит - https://stackoverflow.com/questions/17278201/android-ondestroy-or-similar-method-in-application-class
  • Если бы мы писали приложение Будильник, то с какими проблемами бы столкнулись?
  • Какой из компонентов можно не указывать в манифесте? - BroadcastReceiver
  • Как иконка приложения попадает на рабочий стол устройства? - В манифесте у нужной активити надо прописать intent filter с категорией launcher
  • Что будет, если launcher укажем у нескольких активити? - Тогда будет несколько иконок на рабочем столе - по каждой будет запускаться соответствующая активити

Activity

  • Single Activity vs Multiple Activity

https://stackoverflow.com/questions/44880822/multiple-activity-or-single-activity-and-multiple-fragments

https://oozou.com/blog/reasons-to-use-android-single-activity-architecture-with-navigation-component-36

  • Когда обязательно надо использовать активити, а не фрагменты? - Когда нам надо сделать несколько точек входа в приложение (например, открывать разные экраны нашего приложения в ответ на разные неявные интенты)
  • Можно ли сделать несколько MainActivity? - да, тогда на HomeScreen будет несколько иконок приложения. Пример - когда используешь библиотеку LeakCanary
  • Activity lifecycle

https://medium.com/androiddevelopers/the-android-lifecycle-cheat-sheet-part-i-single-activities-e49fd3d202ab

https://medium.com/androiddevelopers/the-android-lifecycle-cheat-sheet-part-ii-multiple-activities-a411fd139f24

https://medium.com/androiddevelopers/the-android-lifecycle-cheat-sheet-part-iii-fragments-afc87d4f37fd

https://medium.com/androiddevelopers/the-android-lifecycle-cheat-sheet-part-iv-49946659b094

  • Для чего нужны onStart() и onResume() - Они нужны с точки зрения UI, Например, позволяют подписаться/отписаться на интенты. Если пользователь не смотрит на экран, то нет смысла ему что-то показывать. Например, в onPause и тем более onStop не имеет смысла проигрывать анимацию
  • Why do we need to setContentView() in onCreate(), not in onStart()? (Because onCreate() is triggered only once)
  • How to prevent activity from being destroyed on orientation change via manifest? - Use configChanges attribute - https://developer.android.com/guide/topics/manifest/activity-element#config
  • Activity.onDestroy() - гарантируется ли вызов? - Нет. Если ОС убивает процесс, то onDestroy у активити не будет вызван - https://developer.android.com/reference/android/app/Activity.html#onDestroy%28%29
  • Вызовется ли onPause() при уничтожении процесса? - Это тоже не гарантируется, но вероятность того, что процесс будет уничтожен, когда его активити в состоянии Resumed мала (означает критическую нехватку памяти на устройстве)
  • When only onDestroy is called for an activity without onPause() and onStop()? (If finish() is called in the onCreate method of an activity, the system will call onDestroy() method directly.)
  • Методы Activity onContentChanged, onPostCreate, onPostResume, onAttachedToWindow, onUserInteraction, onWindowFocusChanged, onDetachedFromWindow
  • Жизненный цикл Activity с retain фрагментом - https://habr.com/ru/post/280586/
  • Что такое Window?

https://developer.android.com/reference/android/view/Window

https://stackoverflow.com/questions/9451755/what-is-an-android-window

https://developer.android.com/guide/components/activities/tasks-and-back-stack

https://habr.com/ru/company/otus/blog/493802/

https://medium.com/mobile-app-development-publication/android-activity-launchmode-made-simple-df7f0ec5e037

  • Два способа как задать launch mode? - манифест и intent flags
  • Общая особенность singleTask и singleInstance - эти режимы очистят активити стоящие сверху заданной активити
  • Запущены последовательно 4 активити ABCD. Как сделать так, чтобы остались активити AB - использовать launch mode или прописать логику с возвратом результата из активити (startActivityForResult)
  • Для чего запускать разные активити в разных тасках?

https://developer.android.com/guide/components/activities/tasks-and-back-stack

https://medium.com/androiddevelopers/tasks-and-the-back-stack-dbb7c3b0f6d4

https://habr.com/ru/company/otus/blog/493802/

https://iammert.medium.com/android-launchmode-visualized-8843fc833dbe

  • Task Affinity

https://stackoverflow.com/questions/17872989/android-task-affinity-explanation

https://medium.com/@veeresh.charantimath8/playing-with-android-task-affinity-and-launch-modes-5c36a0421e83

  • Можно ли запустить активити из контекста приложения? - Можно, но обязательно надо указать task, иначе будет исключение
  • What are the means of data transfer between activities? (Intents, Shared preferences, DB, file, Eventbus, Singleton class)
  • How to transfer a class between activities inside an Intent? (it must be Serializable or Parcelable)
  • Активити A вызвала активити B. Как из B вернуть результат в A - B.setResult(), A.onActivityResult()
  • Кто вызывает onActivityResult? - ActivityManager
  • Activity Result API

https://developer.android.com/training/basics/intents/result

https://habr.com/ru/company/e-legion/blog/545934/

  • Что происходит при повороте экрана? - активити пересоздается
  • При каких еще условиях активити пересоздается? - поворот экрана, смена языка, смена темы, активити уничтожена в бэкстеке, активити уничтожена вместе с приложением
  • How to save screen state on screen rotation (saveInstanceState, Presenter, ViewModel)?
  • How to save state of an EditText? (provide an id, but it uses Bundle under the hood)
  • Почему сохранение данных при повороте экрана в Bundle, а не в SharedPreferences? - Bundle хранится в памяти, поэтому быстрее === https://stackoverflow.com/questions/24822101/when-to-use-getsharedpreferences-vs-savedinstancestate
  • ActivityLifecycleCallbacks - https://habr.com/ru/company/yoomoney/blog/482476/
  • Открыты экраны ABCD. Как закрыть экраны C и D, если это активити и если это фрагменты?
  • Есть Activity и в ней внутренний класс. В чем может быть проблема и как это исправить? - Внутренний класс (inner class) хранит ссылку на внешний класс, поэтому если хранить где-то экземпляр этого внутреннего класса, то может произойти утечка памяти (GC не сможет собрать активити). Чтобы это исправить, надо сделать внутренний класс статическим классом или вообще вынести его из активити.
  • Как в ситуации из предыдущего примера сделать так, чтобы методы класса работали с активити и не было утечки памяти? - Надо передавать активити в методы через WeakReference
  • onRetainNonConfigurationInstance - https://developer.android.com/reference/android/app/Activity#onRetainNonConfigurationInstance()
  • Window insets

https://developer.android.com/develop/ui/views/layout/insets

https://habr.com/ru/companies/oleg-bunin/articles/488196/

  • В стеке 4 активити A, B, C, D. Как перейти из D в A, очистив при этом стек?
  • Что мы не можем сделать в Activity.onCreate() ?

Intents

https://stackoverflow.com/questions/3323074/android-difference-between-parcelable-and-serializable

https://medium.com/android-news/parcelable-vs-serializable-6a2556d51538

  • Проблемы Serializable - 1. Рефлексия, 2. Если поле в Serializable классе будет не Serializable, то при десериализации оно будет просто null (а в случае Parcelable компилятор сразу это подсвечивает)
  • Почему Parcelable быстрее, чем Serializable? - Serializable основан на рефлексии
  • Как под капотом устроен Serializable? - https://www.infoworld.com/article/2072752/the-java-serialization-algorithm-revealed.html
  • Когда использовать Serializable? - https://proandroiddev.com/serializable-or-parcelable-why-and-which-one-17b274f3d3bb
  • Всегда ли оправдано применение Parcelable? - Только при большом количестве операций в единицу времени (1000 и больше), а также в IPC (Binder, AIDL), и когда большие объекты
  • Можно ли использовать Parcelable для записи на диск? - нет - https://guides.codepath.com/android/using-parcelable
  • Как под капотом устроен Parcelable?
  • Быстрее Serializable или Parcelable? - Если в Serializable реализовать сериализацию вручную вместо использования рефлексии, то быстрее будет Serializable
  • На диске в файле лежит предыдущая версия класса в сериализованном виде. Мы добавили новое поле в класс и пытаемся десериализовать его из файла с предыдущей версией. Что будет? - Будет исключение. Это можно обойти с помощью serialVersionUID - https://www.baeldung.com/java-serial-version-uid
  • Difference between implicit and explicit intents.
  • How to open url in browser?
val uri = Uri.parse(websiteUrl)
val intent = Intent(Intent.ACTION_VIEW, uri)

Fragments

  • What is the purpose of Fragments? Limitations (2-3 fragments per activity)
  • Способы добавления фрагмента в активити - Вручную с помощью FragmentManager, прописать жестко фрагмент в макете (но под капотом все равное будет использован FragmentManager), Jetpack Navigation, Cicerone
  • FragmentManager - https://developer.android.com/guide/fragments/fragmentmanager
  • Что такое транзакция применительно к фрагментам? Что вообще такое транзакция?
  • Как FragmentManager управляет жизненным циклом фрагмента? - https://developer.android.com/guide/fragments/lifecycle
  • FragmentTransaction разница методов add() и replace()

https://rohitksingh.medium.com/difference-between-add-and-replace-in-fragmenttransaction-in-android-87289b00824f

https://stackoverflow.com/questions/18634207/difference-between-add-replace-and-addtobackstack

https://developer.android.com/reference/android/app/FragmentTransaction#commit()

https://stackoverflow.com/questions/38566628/how-is-the-new-fragmenttransaction-commitnow-working-internally

https://medium.com/@bherbst/the-many-flavors-of-commit-186608a015b1

https://luboganev.dev/blog/headless-fragments/

https://stackoverflow.com/questions/22799759/what-is-the-difference-between-a-headless-fragment-and-a-service-in-android

https://medium.com/@ali.muzaffar/use-headless-fragment-for-android-m-run-time-permissions-and-to-check-network-connectivity-b48615f6272d

  • Можно ли заинжектить что-то в конструктор фрагмента? - да, с помощью FragmentFactory - https://medium.com/@diousk507/using-fragmentfactory-with-dagger-2-c3ec136c860d
  • Что будет, если сделать приватный конструктор у фрагмента? - Будет исключение при попытке пересоздания фрагмента после уничтожения
  • Когда вызывается onDestroyView?

https://developer.android.com/guide/fragments/lifecycle

https://medium.com/androiddevelopers/fragments-rebuilding-the-internals-61913f8bf48e

Services

https://stackoverflow.com/questions/10334901/how-to-get-results-from-an-intentservice-back-into-an-activity

https://proandroiddev.com/intentservice-and-resultreceiver-70de71e5e40a

https://stackoverflow.com/questions/48765700/what-is-the-advantage-of-running-a-service-in-a-different-process

https://habr.com/ru/post/139432/

Broadcast receivers

  • Broadcast Receivers

https://developer.android.com/guide/components/broadcasts

http://developer.alexanderklimov.ru/android/broadcast.php

Content Providers

  • Content Providers - https://developer.android.com/guide/topics/providers/content-provider-basics?hl=ru
  • Когда вызывается onCreate()? - Перед вызовом onCreate() у Application. Поэтому библиотеки иногда используют контент провайдеры для своей инициализации еще до вызова Application.onCreate(). Это может увеличить время запуска приложения. Для решения проблемы можно удалить эти провайдеры из смерженного манифеста и добавлять провайдеры динамически по мере необходимости.
  • Что будет, если прописать authority, какой уже есть в системе? - Приложение не будет установлено
  • На каком потоке исполняется? - Если обращение идет из своего же приложения, то на главном потоке. Если из другого приложения, то ContentProvider выполняется на BinderThread, а взаимодействие с ним идет с помощью IPC

https://stackoverflow.com/questions/3491747/which-thread-runs-contentprovider

https://stackoverflow.com/questions/15222041/android-what-is-binder-thread

https://medium.com/swlh/binder-threading-model-79077b7c892c

  • Как под капотом устроен FileProvider?
  • Что именно под капотом возвращает ContentProvider?
  • Как сделать так, чтобы данные передавались только между своими приложениями? - С помощью механизма своих пермишнов: создать свой пермишн и задать ему в манифесте protection level - signature - тогда запросить и получить это разрешение смогут только приложения, подписанные одним ключом разработчика.

ViewModel

https://developer.android.com/codelabs/basic-android-kotlin-training-viewmodel?hl=en#0

https://developer.android.com/codelabs/basic-android-kotlin-training-livedata?hl=en#0

https://developer.android.com/codelabs/android-lifecycles?hl=en#0

https://developer.android.com/codelabs/basic-android-kotlin-training-shared-viewmodel?hl=en#0

Layouts

Animation

https://developer.android.com/codelabs/advanced-android-kotlin-training-property-animation?hl=en#0

https://codelabs.developers.google.com/codelabs/motion-layout#0

Views

https://developer.android.com/guide/topics/ui/custom-components

https://developer.android.com/guide/topics/ui/accessibility/custom-views

https://developer.android.com/codelabs/advanced-android-kotlin-training-custom-views?hl=en#0

https://developer.android.com/codelabs/advanced-android-kotlin-training-canvas#0

https://developer.android.com/codelabs/advanced-android-kotlin-training-clipping-canvas-objects#0

https://developer.android.com/codelabs/advanced-android-kotlin-training-shaders#0

https://bit.ly/3nQ1QnJ

https://www.youtube.com/watch?v=BfMjZTw0iT4&t=13s

  • View Lifecycle

https://proandroiddev.com/the-life-cycle-of-a-view-in-android-6a2c4665b95e

https://proandroiddev.com/android-custom-view-level-3-81e767c8cc75

  • Custom Views

https://developer.android.com/guide/topics/ui/custom-components

https://medium.com/@Zielony/guide-to-android-custom-views-basics-7dfed4583841

https://medium.com/@Zielony/guide-to-android-custom-views-constructors-df47476e334c

https://medium.com/@Zielony/guide-to-android-custom-views-attributes-ab28de3e54b7

https://www.netguru.com/blog/how-to-correctly-save-the-state-of-a-custom-view-in-android

https://stackoverflow.com/questions/3542333/how-to-prevent-custom-views-from-losing-state-across-screen-orientation-changes

https://medium.com/rosberryapps/how-to-cook-the-60-fps-recyclerview-3e7f3885a55

https://www.geeksforgeeks.org/how-to-improve-recyclerview-scrolling-performance-in-android/

  • RecyclerView пул вьюхолдеров - что это и пример использования (например, когда есть вертикальный список из горизонтальных списков - у горизонтальных списков можно переиспользовать вьюхолдеры с помощью пула)
  • RecyclerView Delegate Adapter

https://hannesdorfmann.com/android/adapter-delegates/

https://habr.com/ru/post/341738/

https://habr.com/ru/companies/tbank/articles/665930/

https://pavan-careers5208.medium.com/understand-how-view-renders-in-android-763f0adfb95c

https://betterprogramming.pub/android-internals-for-rendering-a-view-430cd394e225

  • ViewStub

http://developer.alexanderklimov.ru/android/views/viewstub.php

https://developer.android.com/reference/android/view/ViewStub

https://developer.android.com/reference/android/text/PrecomputedText

https://medium.com/appnroll-publication/what-is-new-in-android-p-precomputedtext-2a62ec9e8613

  • Можем ли View обновить не из UI потока? - Нет - С чем это связано?
  • Как отобразить 3D-объекты?

Jetpack Compose

Jorge Castillo - Jetpack Compose internals

https://www.youtube.com/watch?v=_hI2vwei9Rg

https://www.youtube.com/watch?v=MtEW9O-Qrr4

https://www.youtube.com/watch?v=OPwJnx5p1tc

https://developer.android.com/courses/jetpack-compose/course

  • Что такое Jetpack Compose? - Позволяет декларативно описывать интерфейс
  • Можно ли его применять где-то еще? - Есть Kotlin Compose, но это больше технология. Под конкретную платформу своя реализация. Например, Jetpack Compose - для Android
  • Из каких компонентов состоит компоуз? - Runtime, Compile, Annotation, набор библиотек (Foundation в случае Jetpack Compose, Material)
  • Могли бы мы использовать Foundation на десктопе?
  • Что из себя представляет composable функция?
  • Можно из обычных функций вызывать композабл функцию? - Нет, потому что нам нужен компоузер. Во время компиляции в каждую композабл функцию добавляется параметр Composer. Его смысл схож с контекстом Андроида: где мы находимся, что отрисовываем, куда отрисовываем
  • Что еще можно делать через компоузер?
  • Что такое группы restartable, movable и др?
  • Что такое Positional Memoization?
  • Куда записываются группы? - У компоуза есть специальная структура данных. По ключу получаем данных. Это некая комбинация стека и хештаблицы
  • Все ли операции в этой структуре выполняются за O(1)? - Нет, если меняется структура UI, то тогда будет линейное время.
  • Как в итоге после вызова композабл функций получается пользовательский интерфейс? - При выполнении композабл функции оставляют отпечатки
  • Раньше у нас были вьюшки, которые были суперклассом всех вьюх. Есть ли что-то подобное в компоузе? - Да, это Layout Node, но там не наследование, а композиция
  • Какая зона ответственности у Layout Node?
  • Жизненный цикл композабл функции
  • Где мы можем начать вызывать композабл функции? - Мы привязываемся к вьюшке и там начинаем композицию
  • Где-то может быть сабкомпозиция или параллельная композиция? Где это может быть полезно?
  • Как компоуз при рекомпозиции понимает, какую часть экрана надо перерисовать? - Есть иерархия нод, иерархия композабл функций, и есть флаг, который указывает, какая нода поменялась
  • Когда вызывается рекомпозиция?
  • @Stable - С помощью этой аннотации мы говорим компоузу, что если ссылка на объект не изменилась, значит содержимое объекта не изменилось. Это позволяет не проверять каждый раз содержимое объекта. Мы должны гарантировать, что все публичные поля не изменяются со временем.
  • Какие классы автоматически помечаются как @Stable ? - Дата классы с val полями, которые не имеют внутри нон-стейбл классы (например, списки)
  • @Immutable - Мы должны гарантировать, что вообще никакие поля внутри класс не будут изменяться.
  • Как Compose понимает, что поменялись данные и надо перерисовать лейаут?
  • Куда remember сохраняет состояние?
  • Как remember понимает, что нужно удалить состояние при выходе с экрана, чтобы не было утечки памяти?
  • Эффекты LaunchedEffect, DisposableEffect, SideEffect

LaunchedEffect - предназначен для выполнения асинхронных операций или обработки эффектов, которые связаны с жц Composable автоматически запускается, когда Composable создается и запускается только один раз при создании.

SideEffect - используется для выполнения побочных эффектов внутри Composable, которые не зависят от жц composable вызывается всегда, когда происходит рекомпозиция

https://stackoverflow.com/questions/76760860/what-is-disposableeffect-and-under-the-hood-in-jetpack-compose

Notifications

Permissions

Multithreading in Android

https://developer.android.com/guide/background

  • Which operations are prohibited to run on the main thread?
  • What is the disadvantage of AsyncTask? - 1. Пересоздается при пересоздании активити, 2. Держит ссылку на активити, что влечет за собой memory leaks
  • Handler, Looper, HandlerThread - https://blog.mindorks.com/android-core-looper-handler-and-handlerthread-bd54d69fe91a
  • Как устроена MessageQueue? - MessageQueue обеспечивает асинхронный механизм выполнения и позволяет запланировать выполнение операций вместо того, чтобы они терялись. Упорядочен по timestamp. Если вызываем Handler.postDelayed, то message записывается в очередь со значением currentTimeStamp + delay. Если в очереди остались только элементы, запланированные в будущем (у которых timestamp > currentTimeStamp), то лупер будет просто в цикле крутиться и не будет забирать элементы из очереди
  • Как будет работать MessageQueue, если вызывать Handler.postDelayed() - Очередь упорядочивается по времени - https://stackoverflow.com/questions/27240015/does-postdelayed-cause-the-message-to-jump-to-the-front-of-the-queue
  • Если в Handler передать Runnable, то где он будет храниться? - У Message есть поле callback типа Runnable, там и будет храниться (см исходники Handler и Message)
  • Как с помощью Handler сделать таймер, срабатывающий точно каждую 1 секунду? - Есть метод Handler.postAtTime(), второй вариант - использовать Timer - https://stackoverflow.com/questions/23007641/correct-handler-postdelay-time
  • Для чего нужен MainLooper? - На главном потоке абсолютно всё работает через MainLooper. Без него Java-приложение завершится сразу же после старта (после завершения метода main)
  • Почему Looper.loop() не вызывает ANR (всегда ли там гоняется вечный цикл)?

https://blog.karatos.in/a?ID=01000-2fa77d6e-e7da-4365-b7c6-7ddddc6fd826

https://blog.krybot.com/a?ID=00400-4706c861-f02b-4e61-aee5-6b07b1eeb5dc

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

Network

https://www.geeksforgeeks.org/what-is-web-socket-and-how-it-is-different-from-the-http/#:~:text=WebSocket%3A%20WebSocket%20is%20bidirectional%2C%20a,ws%3A%2F%2F%20or%20wss%3A%2F%2F.&text=When%20the%20connection%20is%20established,channel%20until%20it%20is%20terminated.

https://stackoverflow.com/questions/14703627/websockets-protocol-vs-http

  • OkHttp Websocket

https://ssaurel.medium.com/learn-to-use-websockets-on-android-with-okhttp-ba5f00aea988

https://square.github.io/okhttp/4.x/okhttp/okhttp3/-web-socket/

  • Scarlet - https://github.com/Tinder/Scarlet
  • SignalR
  • Альтернатива сокетам
  • What is JSON?
  • How to set up a name of the serialized property different from the property name? (Use @SerializedName("name") annotation)
  • How to exclude a property from the serialization? (mark property as transient (keyword in Java or annotation in Kotlin))
  • The app starts crashing on network call. What can be wrong? (Network call on the main thread, not added in the manifest)
  • Последовательность работы с Retrofit: какие классы нужно создать и что в них нужно описать?
  • Retrofit - what to do, if an app needs to interact with 2 different hosts? (create 2 different retrofit objects)
  • How to append some parameter (for example "platform=android") to all network queries? (Use interceptors)
  • Multipart передача данных
  • Как в JSON передавать бинарные данные без использования Base64 - https://stackoverflow.com/questions/1443158/binary-data-in-json-string-something-better-than-base64
  • How to load images? (Use Glide, Picasso or Fresco)
  • GraphQL
  • Protobuf, для чего файл proto?
  • Другие библиотеки для работы с сетью, кроме Retrofit - Volley, Fuel
  • Как установить соединение без использования библиотек? - HttpUrlConnection

https://stackoverflow.com/questions/8654876/http-get-using-android-httpurlconnection

https://developer.android.com/reference/java/net/HttpURLConnection

  • Другие протоколы прикладного уровня OSI, кроме HTTP - SMTP, POP и др
  • Разница между REST и gRPC

https://www.baeldung.com/rest-vs-grpc

https://habr.com/ru/post/565020/

https://vc.ru/selectel/76371-chto-proishodit-kogda-polzovatel-nabiraet-v-brauzere-adres-sayta

https://habr.com/ru/company/karuna/blog/568702/

https://habr.com/ru/company/htmlacademy/blog/254825/

  • Как работает автоматическая настройка сети (RARP, DHCP) - http://heap.altlinux.org/modules/corpnet.kirill.next/index.html
  • Как работает DNS, на базе какого протокола, какие его функции, что такое записи Triple A?
  • TTL - что это и как работает?
  • TCP - как работает?
  • Что такое окно подтверждения?
  • HTTP vs HTTPS
  • Сертификаты - как работают, как проверяется подлинность сертификата?
  • HTTP 1.1, 2.0, квик - отличия
  • HTTP pipelining
  • Connection keep alive
  • Как понять, что сообщение закончилось (content length, chunk encoding)
  • Что делаем Nginx при получении HTTP запроса, как сервер общается с Nginx?
  • Timestamp-based syncing - https://stackoverflow.com/questions/4186542/what-are-common-pitfalls-of-timestamp-based-syncing

WorkManager

https://developer.android.com/codelabs/android-workmanager?hl=en#0

https://developer.android.com/codelabs/android-adv-workmanager?hl=en#0

Data persistence

  • Какие есть способы сохранить данные - shared preferences, db, file, Realm, AccountManager, другие внешние приложения с помощью ContentResolver+ContentProvider
  • Shared preferences persist after app has been uninstalled. How to prevent it? (Add android:allowBackup="false" in the application in the manifest)
  • Shared preferences apply vs commit - https://stackoverflow.com/questions/5960678/whats-the-difference-between-commit-and-apply-in-sharedpreferences
  • Shared preferences потокобезопасность - https://stackoverflow.com/questions/4693387/sharedpreferences-and-thread-safety
  • Как работает SharedPreferences под капотом? - Это XML файл, в котором хранятся ключ-значение. Это не защищенные данные.
  • Особенности и различия разных типов БД (sql, nosql, строковые, колоночные)
  • Где хранить защищенные данные? - EnryptedSharedPreferences, EncryptedFile

https://developer.android.com/topic/security/data

https://proandroiddev.com/encrypted-preferences-in-android-af57a89af7c8

Room

https://developer.android.com/codelabs/basic-android-kotlin-training-persisting-data-room?hl=en#0

https://developer.android.com/codelabs/basic-android-kotlin-training-intro-room-flow?hl=en#0

Dagger

https://developer.android.com/training/dependency-injection

https://developer.android.com/training/dependency-injection/manual

https://developer.android.com/training/dependency-injection/dagger-basics

https://developer.android.com/codelabs/android-dagger?hl=en#0

https://developer.android.com/codelabs/android-dagger-to-hilt?hl=en#0

  • What is Dependency Injection?
  • Преимущества Dependency Inversion (Dagger) - зависимости предоставляются извне - легко менять составные части объектов, Dagger берет на себя генерацию графа зависимостей, упрощается тестирование - в тестах вместо реальных объектов можно подсовывать замоканные
  • Dependency Injection vs Service Locator - https://habr.com/ru/post/465395/
  • Плюсы-минусы Dagger - Dagger берет на себя генерацию графа зависимостей, но в больших проектах генерится много кода и увеличивается время сборки из-за кодогенерации
  • What is the purpose of @Inject annotation?
  • Modules and Components
  • Is it possible not to use Modules and how?
  • Можно ли делать модуль в модуле? - да
  • Можно ли делать компонент в компоненте?
  • Можно ли делать компонент в модуле?
  • Можно ли делать модуль в компоненте?
  • Dagger в многомодульном приложении

https://developer.android.com/training/dependency-injection/dagger-multi-module

https://www.raywenderlich.com/12275430-dagger-in-multi-module-clean-applications

  • Dagger в мультипроцессном приложении - в каждом процессе свой экземпляр Application, свой Dagger со своими инстансами
  • Dagger @Binds vs @Provides - https://stackoverflow.com/questions/52586940/what-is-the-use-case-for-binds-vs-provides-annotation-in-dagger2
  • Можно ли использовать Binds и Provides в одном класс? - Да, но так делать не рекомендуется по соображениям код стайла, так как легко можно запутаться
  • Недостатки @Provides - @Provides генерит больше кода, чем @Binds. Поэтому по возможности лучше использовать @Binds, а @Provides используется, когда по сути у объекта нет конструктора и нужно использовать билдер.
  • Multibindings

https://habr.com/ru/post/336414/

https://dagger.dev/dev-guide/multibindings.html

https://medium.com/mobile-app-development-publication/dagger-2-multibindings-reference-rewrite-70c23842b782

Clean architecture

  • Clean Architecture - https://habr.com/ru/company/mobileup/blog/335382/
  • Android Guide to App Architecture - https://developer.android.com/topic/architecture
  • Modern Android App Architecture Pathway - https://developer.android.com/courses/pathways/android-architecture
  • UseCases лучше разбивать на отдельные функции (под каждую функцию свой UseCase)
  • Для чего нужна Clean Architecture? - Переиспользование бизнес-логики в разных проектах, развязывание классов (отсутствие сильной связанности, возможность замены компонентов), возможность подменять реализацию слоя независимо от других, тестопригодность, уменьшение порога входа в проект для новых разработчиков (все понимают, что на каждом слое находится), единообразие модулей в многомодульном проекте
  • Почему разделили именно на слои data, presentation, domain, а не на другие?

https://proandroiddev.com/clean-architecture-data-flow-dependency-rule-615ffdd79e29

https://markonovakovic.medium.com/clean-architecture-is-not-domain-data-presentation-e368d7ff8579

  • MVP, достоинства и недостатки

https://stackoverflow.com/questions/40766185/advantage-of-mvp-in-android

https://www.bornfight.com/blog/mvp-vs-mvvm-choosing-the-right-android-architecture/

  • MVVM
  • MVI
  • На каком слое располагаются MVP, MVVM, MVI? - Это способ организации презентационного слоя
  • Как сделать презентер без Moxy?

https://startandroid.ru/ru/blog/473-mvp-na-primere-jekrana-s-pin-kodom.html

https://www.raywenderlich.com/7026-getting-started-with-mvp-model-view-presenter-on-android

Modularization (multi-module projects)

  • Для чего используют многомодульность?

https://proandroiddev.com/the-abc-of-modularization-for-android-in-2021-e7b3fbe29fca

https://www.techyourchance.com/modularization-android/

https://habr.com/ru/company/kaspersky/blog/422555/

https://proandroiddev.com/modularization-in-android-architecture-point-of-view-from-a-to-z-part-i-7a86e6e03799

https://proandroiddev.com/modularization-in-android-architecture-point-of-view-from-a-to-z-part-ii-8baea5b2e4fd

https://proandroiddev.com/modularization-of-android-applications-in-2021-a79a590d5e5b

https://proandroiddev.com/modularization-of-android-applications-with-explicit-initialization-90efdb79db4a

https://proandroiddev.com/modularization-of-android-applications-with-lazy-initialization-a091eaaa284a

https://proandroiddev.com/greatest-android-modularization-mistake-and-how-to-undo-it-50eda336a595

https://medium.com/@mydogtom/modularization-part-2-dagger-structure-5c2daf5e849c

https://itnext.io/multi-module-navigation-in-android-63cb9924ffbd

Moxy

  • How to organize application? (View, Presenter)
  • Что такое очередь команд?
  • Strategies

Testing

https://developer.android.com/codelabs/advanced-android-kotlin-training-testing-basics?index=..%2F..index#0

https://developer.android.com/codelabs/advanced-android-kotlin-training-testing-test-doubles#0

https://developer.android.com/codelabs/advanced-android-kotlin-training-testing-survey#0

  • Когда вызываются @Before, @After
  • Когда вызывается @BeforeClass
  • Как выполнить юнит-тестирование класса, если он зависит от класса, обращающегося к сети? - Использовать Mockito для создания класса-заглушки
  • Как в Espresso нажать на элемент списка
  • Интеграционные тесты

https://proandroiddev.com/writing-integration-tests-in-android-b0436978ed7b

https://habr.com/ru/company/rambler_and_co/blog/279799/

Gradle

Kotlin Multiplatform Mobile

https://kotlinlang.org/docs/multiplatform-mobile-getting-started.html

Other

https://developer.android.com/codelabs/exoplayer-intro?hl=en#0

https://exoplayer.dev/hello-world.html

https://developer.android.com/guide/topics/media/exoplayer

Practice

  • Problems and improvements in the provided code samples:

https://github.com/gpetuhov/AndroidInterview/blob/master/app/src/main/java/com/gpetuhov/androidinterviewcodesamples/Utils.kt

https://github.com/gpetuhov/AndroidInterview/blob/master/app/src/main/java/com/gpetuhov/androidinterviewcodesamples/Solid.kt

https://github.com/gpetuhov/AndroidInterview/blob/master/app/src/main/java/com/gpetuhov/androidinterviewcodesamples/MainActivity.kt

  • How to implement a layout shown on the screenshot.
  • Пример по многопоточности - https://youtu.be/M5Jl643cP34?t=1456
  • Выполнить рефакторинг кода с RxJava/Flow

Algorithm coding task

https://www.youtube.com/watch?v=0yxjWwoZtLw

https://www.youtube.com/watch?v=zU-LndSG5RE

Требуется умение писать код на бумаге с первого раз без переписываний, дебажить в голове, проверять краевые условия, оценивать вычислительную сложность и потребление памяти в терминах O()

OR

  • HackerRank
  • LeetCode

Примеры задач:

  • Собрать стек из двух очередей

  • Собрать очередь из двух стеков

  • Найти максимальную глубину дерева

  • Leetcode — задачи с уровня easy и medium с тегами Array, String, Tree, Binary Search, Hash table, Depth-first Search, Breadth first Search, Two Pointers, Stack, Backtracking; задачи с разным уровнем acceptance

  • More examples:

https://leetcode.com/problems/valid-palindrome

https://leetcode.com/problems/reverse-linked-list

https://leetcode.com/problems/string-compression

https://leetcode.com/problems/longest-substring-without-repeating-characters

https://leetcode.com/problems/valid-mountain-array/

https://leetcode.com/problems/remove-duplicates-from-sorted-array/

https://leetcode.com/problems/plus-one/

https://leetcode.com/problems/find-the-distance-value-between-two-arrays/

https://leetcode.com/problems/validate-ip-address/

https://leetcode.com/problems/valid-anagram

https://leetcode.com/problems/word-pattern/

https://leetcode.com/problems/merge-intervals/

Android coding task

  • Task: download list of items from the server and display them on screen. How would you organize your code?

Example of Clean Architecture in Android: https://github.com/gpetuhov/AndroidFundamentals2021/tree/master/01-CleanArchitecture

  • Требуется сделать экран списка чатов. Как организовать архитектуру - нарисовать схему верхнего уровня (слои data, presentation, domain и основные сущности на этих слоях)
  • Требуется сделать музыкальное приложение типа Яндекс Музыки. Какие экраны и фичи должны быть у такого приложения? Как реализовать UI, загрузку данных, проигрывание музыки, поиск, пагинацию, кеширование, защиту от копирования, взаимодействие с другими музыкальными приложениями? Какие использовать протоколы для загрузки данных? Какие библиотеки использовать в проекте?
  • Спроектировать API библиотеки загрузки изображений

Архитектурная секция

https://www.youtube.com/watch?v=p7QIEzIFzdQ

Открытые собеседования

https://youtu.be/KH0vLN1siI8?si=ca9GSY84dR-JlbaM

https://www.youtube.com/live/c8Sdcw6AlCk?si=GHgMWp5Q-NPf9Vu6

https://www.youtube.com/live/kKcwi0w5c8A?si=-Bi3V_SZRShTlvPY

https://www.youtube.com/watch?v=61aFEG97GrE&t=3505s

https://www.youtube.com/watch?v=2cgIoGOL0lA&t=1763s

https://www.youtube.com/watch?v=FmgzRI47NiA&t=5382s

https://www.youtube.com/watch?v=qb0Ezy-WO_k

Books

«Карьера программиста» — Г. Лакман Макдауэлл

«Совершенный код» — С. Макконнелл

«Чистый код» — Р. Мартин

«Алгоритмы. Построение и анализ» — Т. Кормен, Ч. Лейзерсон, и др.

«Приемы объектно-ориентированного проектирования. Паттерны проектирования» — Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес

«Программист–прагматик» — Д. Томас, Э. Хант

«Введение в системы баз данных» — К. Дейт

«Java Concurrency in Practice» — Brian Goetz, Tim Peierls

«Java. Полное руководство» — Г. Шилдт

«Java. Эффективное программирование» — Д. Блох

«Философия Java» — Б. Эккель

«Kotlin в действии» — Д. Жемеров, С. Исакова

«Learning Concurrency in Kotlin» — Miguel Angel Castiblanco Torres

«Эффективное использование потоков в операционной системе Android» — Андрес Ёранссон

«Джедайские техники» — Максим Дорофеев

Reference

https://github.com/MindorksOpenSource/android-interview-questions

https://yandex.ru/jobs/pages/mobdev-interview

https://www.tinkoff.ru/career/it/interview/mobile/

https://habr.com/ru/company/tinkoff/blog/648825/

About

Code samples for Android interview

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages