Interviewfragen für erfahrene Mobile Entwickler (Android): Der ultimative Leitfaden

Milad Bonakdar
Autor
Meistern Sie die fortgeschrittene Android-Entwicklung mit wichtigen Interviewfragen zu Architekturmustern, Leistungsoptimierung, Dependency Injection, Tests, Sicherheit und Systemdesign für erfahrene Entwickler.
Einführung
Von erfahrenen Android-Entwicklern wird erwartet, dass sie skalierbare, wartbare Anwendungen entwerfen und gleichzeitig hohe Leistung und Codequalität gewährleisten. Diese Rolle erfordert fundierte Kenntnisse der Android-Frameworks, Architekturmuster, Dependency Injection, Teststrategien und die Fähigkeit, fundierte technische Entscheidungen zu treffen.
Dieser umfassende Leitfaden behandelt wichtige Interviewfragen für erfahrene Android-Entwickler, die fortgeschrittene Kotlin-Konzepte, Architekturmuster, Leistungsoptimierung, Dependency Injection, Tests und Systemdesign umfassen. Jede Frage enthält detaillierte Antworten, eine Seltenheitseinschätzung und Schwierigkeitsgrade.
Fortgeschrittene Kotlin- und Sprachfunktionen (5 Fragen)
1. Erläutern Sie Kotlin-Coroutinen und ihre Vorteile gegenüber Threads.
Antwort: Coroutinen sind leichtgewichtige Nebenläufigkeitsprimitive, die es ermöglichen, asynchronen Code sequentiell zu schreiben.
- Vorteile gegenüber Threads:
- Leichtgewichtig: Kann Tausende von Coroutinen ohne Leistungsprobleme erstellen
- Strukturierte Nebenläufigkeit: Eltern-Kind-Beziehung gewährleistet ordnungsgemäße Bereinigung
- Unterstützung für Abbruch: Integrierte Abbruchweiterleitung
- Ausnahmebehandlung: Strukturierte Ausnahmebehandlung
- Schlüsselkomponenten:
- CoroutineScope: Definiert den Lebenszyklus
- Dispatchers: Steuern den Ausführungskontext (Main, IO, Default)
- suspend functions: Können pausiert und fortgesetzt werden
Seltenheit: Sehr häufig Schwierigkeit: Schwer
2. Was sind Sealed Classes und wann sollten Sie sie verwenden?
Antwort: Sealed Classes stellen eingeschränkte Klassenhierarchien dar, in denen alle Unterklassen zur Kompilierzeit bekannt sind.
- Vorteile:
- Erschöpfende
when-Ausdrücke - Typsichere Zustandsverwaltung
- Besser als Enums für komplexe Daten
- Erschöpfende
- Anwendungsfälle: Darstellung von Zuständen, Ergebnissen, Navigationsereignissen
Seltenheit: Häufig Schwierigkeit: Mittel
3. Erläutern Sie Kotlin Flow und wie es sich von LiveData unterscheidet.
Antwort: Flow ist Kotlin's kalter asynchroner Stream, der Werte sequentiell ausgibt.
- Flow vs LiveData:
- Flow: Kalter Stream, unterstützt Operatoren, nicht lebenszyklusabhängig, flexibler
- LiveData: Heißer Stream, lebenszyklusabhängig, Android-spezifisch, einfacher für UI
- Flow-Typen:
- Flow: Kalter Stream (beginnt bei Sammlung)
- StateFlow: Heißer Stream mit aktuellem Zustand
- SharedFlow: Heißer Stream für Ereignisse
Seltenheit: Sehr häufig Schwierigkeit: Schwer
4. Was sind Inline Functions und wann sollten Sie sie verwenden?
Antwort: Inline-Funktionen kopieren den Funktionskörper an die Aufrufstelle und vermeiden so den Overhead von Funktionsaufrufen.
- Vorteile:
- Eliminiert den Overhead der Lambda-Zuordnung
- Ermöglicht nicht-lokale Rückgaben von Lambdas
- Bessere Leistung für Funktionen höherer Ordnung
- Anwendungsfälle: Funktionen höherer Ordnung mit Lambda-Parametern
- Trade-off: Erhöht die Codegröße
Seltenheit: Mittel Schwierigkeit: Schwer
5. Erläutern Sie Delegation in Kotlin.
Antwort: Delegation ermöglicht es einem Objekt, einige seiner Verantwortlichkeiten an ein anderes Objekt zu delegieren.
- Klassendelegation:
by-Schlüsselwort - Eigenschaftsdelegation: Lazy, observable, delegates
- Vorteile: Codewiederverwendung, Komposition statt Vererbung
Seltenheit: Mittel Schwierigkeit: Mittel
Architekturmuster (6 Fragen)
6. Erläutern Sie die MVVM-Architektur und ihre Vorteile.
Antwort: MVVM (Model-View-ViewModel) trennt die UI-Logik von der Geschäftslogik.
- Model: Datensicht (Repositories, Datenquellen)
- View: UI-Schicht (Activities, Fragments, Composables)
- ViewModel: Präsentationslogik, überlebt Konfigurationsänderungen
- Vorteile: Testfähig, Trennung von Belangen, lebenszyklusabhängig
Seltenheit: Sehr häufig Schwierigkeit: Mittel
7. Was ist Clean Architecture und wie implementieren Sie sie in Android?
Antwort: Clean Architecture trennt Code in Schichten mit klaren Abhängigkeiten.
- Presentation: UI, ViewModels
- Domain: Use Cases, Business Logic, Entities
- Data: Repositories, Data Sources (API, Database)
- Dependency Rule: Innere Schichten kennen die äußeren Schichten nicht
Seltenheit: Häufig Schwierigkeit: Schwer
8. Erläutern Sie Dependency Injection und Dagger/Hilt.
Antwort: Dependency Injection stellt Klassen Abhängigkeiten bereit, anstatt sie intern zu erstellen.
- Vorteile: Testbarkeit, lose Kopplung, Wiederverwendbarkeit
- Dagger: Compile-time DI-Framework
- Hilt: Vereinfachtes Dagger für Android
Seltenheit: Sehr häufig Schwierigkeit: Schwer
9. Was ist das Repository-Muster und warum sollte man es verwenden?
Antwort: Das Repository-Muster abstrahiert Datenquellen und bietet eine saubere API für den Datenzugriff.
- Vorteile:
- Single Source of Truth
- Zentralisierte Datenlogik
- Einfaches Wechseln von Datenquellen
- Testfähig
- Implementierung: Koordiniert zwischen mehreren Datenquellen
Seltenheit: Sehr häufig Schwierigkeit: Mittel
10. Erläutern Sie die Single Activity-Architektur.
Antwort: Die Single Activity-Architektur verwendet eine Activity mit mehreren Fragments, die von der Navigationskomponente verwaltet werden.
- Vorteile:
- Vereinfachte Navigation
- Gemeinsame ViewModels zwischen Fragments
- Bessere Animationen
- Einfacheres Deep Linking
- Navigationskomponente: Behandelt Fragmenttransaktionen, Back Stack, Argumente
Seltenheit: Häufig Schwierigkeit: Mittel
11. Was ist die MVI-Architektur (Model-View-Intent)?
Antwort: MVI ist eine unidirektionale Datenflussarchitektur, die von Redux inspiriert ist.
- Komponenten:
- Model: Stellt den UI-Zustand dar
- View: Rendert den Zustand, gibt Intents aus
- Intent: Benutzeraktionen/Ereignisse
- Vorteile: Vorhersagbarer Zustand, einfacheres Debugging, Time-Travel-Debugging
Seltenheit: Mittel Schwierigkeit: Schwer
Leistung und Optimierung (5 Fragen)
12. Wie optimieren Sie die RecyclerView-Leistung?
Antwort: Mehrere Strategien verbessern die Scrollleistung von RecyclerView:
- ViewHolder-Muster: Wiederverwendung von Views (eingebaut)
- DiffUtil: Effiziente Listenaktualisierungen
- Stabile IDs: Überschreiben Sie
getItemId()undsetHasStableIds(true) - Prefetching: Erhöhen Sie die Prefetch-Distanz
- Image Loading: Verwenden Sie Bibliotheken wie Glide/Coil mit korrekter Größe
- Vermeiden Sie schwere Operationen: Führen Sie keine teuren Berechnungen in
onBindViewHolderdurch - Nested RecyclerViews: Setzen Sie
setRecycledViewPool()undsetHasFixedSize(true)
Seltenheit: Sehr häufig Schwierigkeit: Mittel
13. Wie erkennen und beheben Sie Speicherlecks in Android?
Antwort: Speicherlecks treten auf, wenn Objekte länger als nötig im Speicher gehalten werden.
- Häufige Ursachen:
- Kontextlecks (Activity/Fragment-Referenzen)
- Statische Referenzen
- Anonyme innere Klassen
- Nicht abgemeldete Listener
- Nicht abgebrochene Coroutinen
- Erkennungswerkzeuge:
- LeakCanary-Bibliothek
- Android Studio Memory Profiler
- Heap Dumps
Seltenheit: Sehr häufig Schwierigkeit: Mittel
14. Wie optimieren Sie die App-Startzeit?
Antwort: Schnellerer Start verbessert die Benutzererfahrung:
- Lazy Initialization: Initialisieren Sie Objekte nur bei Bedarf
- Vermeiden Sie schwere Arbeit in Application.onCreate():
- Verschieben Sie sie in den Hintergrund-Thread
- Verschieben Sie die nicht kritische Initialisierung
- Content Providers: Minimieren oder Lazy-Load
- Reduzieren Sie Abhängigkeiten: Weniger Bibliotheken = schnellerer Start
- App Startup Library: Strukturierte Initialisierung
- Baseline Profiles: Ahead-of-Time-Kompilierungshinweise
Seltenheit: Häufig Schwierigkeit: Mittel
15. Wie behandeln Sie das Laden und Caching von Bitmaps effizient?
Antwort: Eine effiziente Bildverarbeitung ist entscheidend für die Leistung:
- Bibliotheken: Glide, Coil (behandeln das Caching automatisch)
- Manuelle Optimierung:
- Downsampling (kleinere Bilder laden)
- Memory Cache (LruCache)
- Disk Cache
- Bitmap Pooling
Seltenheit: Häufig Schwierigkeit: Schwer
16. Was ist ANR und wie verhindern Sie es?
Antwort: ANR (Application Not Responding) tritt auf, wenn der Haupt-Thread zu lange blockiert ist.
- Ursachen:
- Schwere Berechnungen im Haupt-Thread
- Netzwerkaufrufe im Haupt-Thread
- Datenbankoperationen im Haupt-Thread
- Deadlocks
- Prävention:
- Verschieben Sie schwere Arbeit in Hintergrund-Threads
- Verwenden Sie Coroutinen mit geeigneten Dispatchern
- Vermeiden Sie synchronisierte Blöcke im Haupt-Thread
- Verwenden Sie WorkManager für Hintergrundaufgaben
Seltenheit: Häufig Schwierigkeit: Einfach
Testen (3 Fragen)
17. Wie schreiben Sie Unit Tests für ViewModels?
Antwort: ViewModels sollten isoliert mit simulierten Abhängigkeiten getestet werden.



