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: 2023.05.05

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

  • Где используется ключевое слово final? - константы, классы, методы
  • Как запретить переопределение метода в потомках? - Пометить метод как final
  • Модификаторы доступа в Java - public, protected, private, package private (когда нет никакого ключевого слова) - https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
  • Как можно менять модификаторы доступа в потомках? - Можно расширять, но нельзя сужать - https://docs.oracle.com/javase/tutorial/java/IandI/override.html
  • What is an interface? - https://www.baeldung.com/java-interfaces
  • Существует ли множественное наследование (extends) в Java? Если да, то к чему оно применимо? - Множественное наследование не поддерживается в классах, но оно поддерживается в интерфейсах (интерфейс может экстендить несколько интерфейсов, класс может имплементить несколько интерфейсов) - https://javarush.ru/groups/posts/731-mnozhestvennoe-nasledovanie-v-java-kompozicija-v-sravnenii-s-nasledovaniem
  • Отличие interface от abstract class - в интерфейсе все методы public, не может быть private, абстрактный класс может хранить состояние и может иметь конструктор
  • ClassLoader, getClass

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?
  • Ссылочный граф
  • Стратегии очистки памяти 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 в 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/

  • TreeMap under the hood

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/

Generics

Multithreading

https://github.com/gpetuhov/MultithreadingTutorial

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

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
  • Типы делегатов - 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

RxJava

https://github.com/gpetuhov/RxJavaTutorial

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

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

Kotlin coroutines

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

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 из фона

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()

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 компилятор сразу это подсвечивает)
  • Как под капотом устроен 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

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/

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

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

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
  • Недостатки @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

Jetpack Compose

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

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 библиотеки загрузки изображений

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