Skip to content

Latest commit

 

History

History
276 lines (218 loc) · 8.53 KB

File metadata and controls

276 lines (218 loc) · 8.53 KB

Batch Uninstaller

Projektübersicht

Batch Uninstaller ist eine native Android-App, die es Nutzern ermöglicht, mehrere installierte Apps mit nur einem Tap zu deinstallieren. Die App bietet eine benutzerfreundliche Oberfläche mit erweiterten Funktionen wie Suche, Sortierung und intelligenter Filterung.


Tech-Stack

Programmiersprache

  • Kotlin - Moderne, typsichere Programmiersprache für Android

Android Framework & Libraries

  • Android SDK 33 (compileSdk)
  • Min SDK 23 (Android 6.0+) - Unterstützung für 95%+ aller Android-Geräte
  • AndroidX Core & AppCompat - Moderne Android-Komponenten
  • Material Design Components 1.7.0 - Google's Design-System

UI-Komponenten

  • RecyclerView - Effiziente Liste für große Datenmengen
  • SwipeRefreshLayout - Pull-to-Refresh-Funktionalität
  • ConstraintLayout - Flexibles Layout-System
  • Material CardView - Moderne Kartenansicht für App-Einträge

Asynchrone Verarbeitung

  • Kotlin Coroutines 1.6.4 - Leichtgewichtige Threads für performante Hintergrundoperationen
  • Lifecycle ViewModel & Runtime - Lifecycle-aware Komponenten

Android APIs

  • PackageManager API - Zugriff auf installierte Apps und deren Metadaten
  • Intent System - Deinstallations-Workflow (ACTION_UNINSTALL_PACKAGE)

Build-System

  • Gradle 7.2.2 - Build-Automatisierung
  • Kotlin Gradle Plugin 1.7.10

Hauptfunktionen

1. App-Verwaltung

  • Vollständige App-Liste: Zeigt alle installierten User-Apps (System-Apps ausgeblendet)
  • App-Informationen: Name, Package-Name, Icon, Größe und Installationsdatum
  • Pull-to-Refresh: Aktualisierung der App-Liste per Swipe-Geste

2. Multi-Selektion

  • Checkbox-basierte Auswahl: Einzelne oder multiple Apps auswählen
  • Alle auswählen/abwählen: Schnelle Massenauswahl über Menü
  • Visuelle Feedback: Ausgewählte Apps werden hervorgehoben

3. Such- & Filterfunktion

  • Echtzeit-Suche: Filtern nach App-Name oder Package-Name
  • Case-insensitive: Groß-/Kleinschreibung wird ignoriert
  • Instant-Feedback: Ergebnisse werden sofort angezeigt

4. Sortieroptionen

  • Nach Name: Alphabetische Sortierung (A-Z)
  • Nach Größe: Größte Apps zuerst
  • Nach Installationsdatum: Neueste Apps zuerst

5. Batch-Deinstallation

  • Ein-Klick-Deinstallation: FloatingActionButton startet Batch-Prozess
  • Queue-System: Apps werden sequenziell abgearbeitet
  • Bestätigungsdialog: Sicherheitsabfrage vor Massendeinstallation
  • Fortschrittsanzeige: Zeigt Anzahl der ausgewählten Apps

Technische Highlights

1. Moderne Android-Architektur

// Separation of Concerns
MainActivity.kt          // UI-Controller & Lifecycle-Management
AppAdapter.kt           // RecyclerView-Adapter mit Selection-State
AppInfo.kt              // Data Class für App-Metadaten
UninstallHelper.kt      // Business Logic für Batch-Deinstallation

2. Asynchrone Datenverarbeitung mit Coroutines

private fun loadApps() {
    CoroutineScope(Dispatchers.Main).launch {
        swipeRefreshLayout.isRefreshing = true
        withContext(Dispatchers.IO) {
            // CPU-intensive Arbeit im Background
            val installedApps = packageManager.getInstalledApplications(...)
            // Größenberechnung, Sortierung, Filterung
        }
        // UI-Update auf Main Thread
        adapter.updateApps(appList)
    }
}

3. Queue-basiertes Batch-Processing

class UninstallHelper {
    private val uninstallQueue: Queue<AppInfo> = LinkedList()
    
    fun startBatchUninstall(activity: Activity, apps: List<AppInfo>) {
        uninstallQueue.clear()
        uninstallQueue.addAll(apps)
        uninstallNextApp(activity)
    }
    
    fun onActivityResult(resultCode: Int, activity: Activity) {
        // Nächste App aus Queue verarbeiten
        if (uninstallQueue.isNotEmpty()) {
            uninstallNextApp(activity)
        }
    }
}

4. Effiziente RecyclerView-Implementation

  • ViewHolder-Pattern: Recycling von Views für optimale Performance
  • DiffUtil-ready: Vorbereitet für effiziente Listen-Updates
  • Item-Click-Handling: Lambda-basierte Callbacks für Selektion

5. Material Design Best Practices

  • Theming: Konsistente Farbpalette (Primary: #FF5722, Accent: #FFC107)
  • Elevation & Shadows: CardView mit 4dp Elevation
  • Typography: Roboto-Font mit klarer Hierarchie
  • Interactive Elements: FloatingActionButton für Primary Action

6. Android Permissions-Handling

<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" 
    android:minSdkVersion="30" />

7. App-Größen-Berechnung

val appSize = try {
    val appInfo = packageManager.getApplicationInfo(packageName, 0)
    File(appInfo.sourceDir).length()
} catch (e: Exception) { 0L }

Projektstatus

✅ Abgeschlossen

  • Vollständige Projektstruktur erstellt
  • Alle Core-Features implementiert
  • UI/UX Design mit Material Design
  • Asynchrone Datenverarbeitung mit Coroutines
  • Batch-Deinstallations-System
  • Such- und Sortierfunktionen
  • Multi-Selektions-Mechanismus
  • Gradle-Build-Konfiguration
  • AndroidManifest mit Permissions

🔄 Bereit für

  • Build in Android Studio
  • Testing auf physischem Gerät/Emulator
  • UI/UX Optimierungen basierend auf User-Feedback
  • Play Store Deployment

💡 Mögliche Erweiterungen

  • Deinstallations-Statistiken
  • Backup-Funktion vor Deinstallation
  • App-Kategorisierung
  • Dark Mode Support
  • Mehrsprachige Unterstützung
  • Export von App-Listen
  • Automatische Deinstallation inaktiver Apps

Projektstruktur

batch-uninstaller/
├── app/
│   ├── src/
│   │   └── main/
│   │       ├── java/com/batchuninstaller/
│   │       │   ├── MainActivity.kt
│   │       │   ├── AppAdapter.kt
│   │       │   ├── AppInfo.kt
│   │       │   └── UninstallHelper.kt
│   │       ├── res/
│   │       │   ├── layout/
│   │       │   │   ├── activity_main.xml
│   │       │   │   └── item_app.xml
│   │       │   ├── menu/
│   │       │   │   └── main_menu.xml
│   │       │   ├── values/
│   │       │   │   ├── strings.xml
│   │       │   │   ├── colors.xml
│   │       │   │   └── themes.xml
│   │       │   └── drawable/
│   │       └── AndroidManifest.xml
│   └── build.gradle
├── build.gradle
├── settings.gradle
└── gradle.properties

Entwicklungs-Workflow

Lokale Entwicklung

  1. Projekt in Android Studio öffnen
  2. Gradle Sync durchführen
  3. Emulator starten oder Gerät verbinden
  4. App ausführen (Run 'app')

Build-Kommandos

# Debug Build
./gradlew assembleDebug

# Release Build
./gradlew assembleRelease

# Installation auf verbundenem Gerät
./gradlew installDebug

Performance-Optimierungen

  • Lazy Loading: Apps werden asynchron im Hintergrund geladen
  • Efficient Filtering: In-Memory-Filterung ohne DB-Zugriffe
  • View Recycling: RecyclerView nutzt ViewHolder-Pattern
  • Coroutine-Scopes: Lifecycle-aware Coroutines vermeiden Memory Leaks
  • Minimal Dependencies: Nur essenzielle Libraries für kleine APK-Größe

Sicherheitsaspekte

  • Permission-basiert: Nutzt offizielles Android Permission-System
  • User Confirmation: Bestätigungsdialog vor Batch-Deinstallation
  • System Apps Protection: System-Apps werden standardmäßig ausgeblendet
  • No Root Required: Funktioniert ohne Root-Zugriff

Zielgruppe

  • Android-Nutzer, die regelmäßig Apps testen und wieder entfernen
  • Entwickler, die Test-Apps aufräumen möchten
  • Power-User, die ihr Gerät optimieren wollen
  • Alle, die Speicherplatz durch schnelles Entfernen mehrerer Apps freigeben möchten

Lizenz & Verwendung

Dieses Projekt wurde als MVP-Demonstration entwickelt und zeigt moderne Android-Entwicklungspraktiken mit Kotlin, Coroutines und Material Design.

Entwickelt: November 2025
Version: 1.0
Min. Android Version: 6.0 (API 23)
Target Android Version: 13 (API 33)


Kontakt & Portfolio

Dieses Projekt ist Teil meines Android-Entwicklungsportfolios und demonstriert:

  • Saubere Kotlin-Programmierung
  • Moderne Android-Architektur
  • Asynchrone Programmierung mit Coroutines
  • Material Design Implementation
  • Complex UI-Interaktionen
  • Android System API Integration