Sobes.tech
Middle+

Co byś zrobił, gdyby wersja produkcyjna aplikacji zawieszała się w miejscu, gdzie wersja debug działa poprawnie?

sobes.tech AI

Odpowiedź od AI

  1. Zbieranie logów i raportów o awariach: Aktywować i sprawdzić logowanie w wersji wydania (np. za pomocą Firebase Crashlytics lub analityki). Zebrać wszystkie dostępne raporty o awariach.

  2. Analiza różnic między kompilacjami:

    • Optymalizacje kompilatora: Wersja wydania często korzysta z ProGuard/R8 do zaciemniania, minimalizacji i optymalizacji kodu. Sprawdzić reguły ProGuard/R8 pod kątem błędów, które mogły usunąć potrzebny kod lub zasoby, lub zmienić zachowanie aplikacji. Przejrzeć wygenerowany plik mapping.txt do deobfuskacji stack trace'ów.
    • Podpisy (signing): Upewnić się, że wersja wydania jest podpisana poprawnym kluczem.
    • Flaga Debuggable: Upewnić się, że w wersji wydania android:debuggable jest ustawione na false.
    • Różnice w zależnościach: Sprawdzić wersje bibliotek używanych w obu typach kompilacji.
    • Konfiguracje kompilacji (build flavors/types): Przejrzeć pliki gradle pod kątem ustawień specyficznych dla wersji wydania, które mogą wpływać na zachowanie (np. różne URL API, wyłączone funkcje).
    • Weryfikacja zasobów: Upewnić się, że wszystkie niezbędne zasoby (drawable, layout, strings) są obecne i dostępne w wersji wydania.
  3. Deobfuskacja stack trace'ów: Jeśli awaria występuje w zaciemnionym kodzie, użyć mapping.txt do deobfuskacji stack trace'a, aby zrozumieć, w której części kodu występuje błąd.

  4. Reprodukcja błędu w warunkach zbliżonych do wersji wydania:

    • Spróbować zbudować wersję wydania z wyłączonymi częściami ProGuard/R8, aby zawęzić zakres poszukiwań.
    • Utworzyć lokalną wersję testową, jak najbardziej zbliżoną do wersji wydania (np. z ProGuard/R8, ale bez podpisu wydania).
  5. Stopniowe wyłączanie optymalizacji i zaciemniania: Stopniowo wyłączać optymalizacje ProGuard/R8 w wersji wydania (np. wyłączyć zaciemnianie, potem minimalizację), aby ustalić, która optymalizacja powoduje problem.

  6. Logowanie w wersji wydania: Tymczasowo dodać logowanie w krytycznych fragmentach kodu w wersji wydania, aby śledzić wykonanie do momentu awarii.

  7. Sprawdzenie czynników zewnętrznych: Wziąć pod uwagę, że zachowanie może zależeć od środowiska (np. dostęp do internetu, wersja systemu operacyjnego na urządzeniu użytkownika).

  8. Użycie debuggera: Jeśli to możliwe, podłączyć się do wersji wydania na urządzeniu (co może być trudne, jeśli debuggable jest ustawione na false) lub użyć emulatora do próby odtworzenia i debugowania.

  9. Regresja (jeśli możliwe): Sprawdzić, w którym momencie pojawił się problem (np. po dodaniu nowej funkcji lub aktualizacji biblioteki).

  10. Wyszukiwanie znanych problemów: Sprawdzić znane problemy ProGuard/R8 z używanymi bibliotekami.

android {
    buildTypes {
        release {
            // Przykład tymczasowego wyłączenia zaciemniania do debugowania
            minifyEnabled true // Pozostawiamy minimalizację
            shrinkResources true // Pozostawiamy kompresję zasobów
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            // tymczasowo wyłącz zaciemnianie
            // consumerProguardFiles 'proguard-debug.pro' // Dodaj reguły debugowania, jeśli to konieczne
        }
    }
}