# Runtime-детекция Google Services и Firebase ## 📋 Обзор Приложение SoundWaveRadio теперь поддерживает **универсальную работу** на устройствах как **с Google Services**, так и **без них** (FOSS-устройства, Huawei без GMS, и т.д.). **Важно:** Firebase библиотеки включены в APK, но используются **только при наличии Google Play Services на устройстве**. Файл `google-services.json` всегда присутствует в проекте, но детекция происходит в runtime на основе реального наличия GMS на устройстве. ## ✅ Что было реализовано ### 1. **GoogleServicesHelper** - Централизованная система детекции Создан класс `GoogleServicesHelper.kt`, который обеспечивает: - ✅ Runtime-проверку доступности Google Play Services - ✅ Runtime-проверку доступности Firebase - ✅ Безопасную инициализацию Firebase - ✅ Безопасное получение Firebase Analytics - ✅ Безопасное получение FCM токенов - ✅ Логирование аналитических событий (с fallback) - ✅ Кэширование результатов проверки ### 2. **Gradle конфигурация** #### `app/build.gradle`: ```gradle plugins { id 'com.google.gms.google-services' id 'com.google.firebase.crashlytics' // Плагины всегда применяются } // Firebase зависимости включены в APK implementation platform("com.google.firebase:firebase-bom:33.12.0") implementation "com.google.firebase:firebase-analytics" implementation "com.google.firebase:firebase-crashlytics" implementation "com.google.firebase:firebase-config" implementation "com.google.firebase:firebase-messaging" implementation "com.google.firebase:firebase-perf" // Google Play Services для runtime-детекции implementation "com.google.android.gms:play-services-base:18.5.0" implementation "com.google.android.gms:play-services-ads-identifier:18.2.0" ``` **Важно:** Firebase библиотеки включены в APK, но `GoogleServicesHelper` проверяет наличие Google Play Services на устройстве в runtime и использует Firebase только если GMS доступен. ### 3. **Обновленные классы** #### `URLRadio.kt`: - ✅ Использует `GoogleServicesHelper` для инициализации - ✅ Graceful fallback при отсутствии Firebase - ✅ Логирует статус сервисов при запуске #### `MainActivity.kt`: - ✅ Безопасная инициализация Firebase Analytics - ✅ Безопасная инициализация Firebase Messaging - ✅ Nullable типы для Firebase объектов #### `ReviewManager.kt`: - ✅ Опциональная поддержка Firebase Analytics - ✅ Логирование событий через `GoogleServicesHelper` #### `PermissionHelper.kt`: - ✅ Упрощенное логирование без прямой зависимости от Firebase ### 4. **AndroidManifest.xml** Все Google/Firebase компоненты помечены как опциональные: ```xml ``` ## 🚀 Как это работает ### Сценарий 1: Устройство С Google Services 1. APK содержит Firebase библиотеки 2. При запуске `GoogleServicesHelper` проверяет наличие Google Play Services на устройстве 3. GMS обнаружен → Firebase инициализируется 4. Firebase Analytics, Crashlytics, Messaging работают нормально 5. Приложение получает FCM токен для push-уведомлений **Логи:** ``` ✓ Google Play Services available ✓ Firebase available ✓ Firebase Analytics initialized successfully ✓ FCM Token: [token] ``` ### Сценарий 2: Устройство БЕЗ Google Services (FOSS/Huawei) 1. APK содержит Firebase библиотеки (но они не используются) 2. При запуске `GoogleServicesHelper` проверяет наличие Google Play Services на устройстве 3. GMS НЕ обнаружен → Firebase НЕ инициализируется 4. Приложение продолжает работать без аналитики и push-уведомлений 5. Все основные функции (радио, плейлисты, настройки) работают нормально **Логи:** ``` ⚠ Google Play Services not available ⚠ Firebase not available ⚠ Firebase services are unavailable - running in FOSS mode ⚠ Firebase Messaging not available - push notifications disabled ``` ## 📱 Тестирование ### Тест 1: На устройстве С Google Services 1. Соберите APK: `./gradlew assembleRelease` 2. Установите на устройство с Google Play Services (обычный Android) 3. Проверьте логи - должны быть сообщения об успешной инициализации Firebase 4. Проверьте получение FCM токена 5. Проверьте работу основного функционала ### Тест 2: На устройстве БЕЗ Google Services (Huawei, эмулятор без GMS) 1. Соберите тот же APK: `./gradlew assembleRelease` 2. Установите на устройство без Google Play Services 3. Проверьте логи - должны быть предупреждения о FOSS режиме 4. Проверьте основной функционал - всё должно работать без крашей 5. Firebase функции будут отключены автоматически ### Тест 3: Эмулятор без GMS 1. Создайте эмулятор без Google Play Services 2. Установите APK 3. Приложение должно запуститься и работать стабильно 4. Проверьте отсутствие крашей при попытке использования Firebase ## 🔧 API GoogleServicesHelper ### Основные методы: ```kotlin // Проверка доступности Google Play Services GoogleServicesHelper.isGooglePlayServicesAvailable(context): Boolean // Проверка доступности Firebase GoogleServicesHelper.isFirebaseAvailable(): Boolean // Безопасная инициализация Firebase GoogleServicesHelper.initFirebaseSafely(context): Boolean // Получение Firebase Analytics (nullable) GoogleServicesHelper.getFirebaseAnalytics(context): Any? // Логирование событий (с fallback) GoogleServicesHelper.logAnalyticsEvent(context, eventName, params) // Получение FCM токена GoogleServicesHelper.getFirebaseMessagingToken(onSuccess, onFailure) // Проверка необходимости Google функций GoogleServicesHelper.shouldEnableGoogleFeatures(context): Boolean // Получение статуса сервисов GoogleServicesHelper.getServicesStatus(context): String ``` ### Пример использования: ```kotlin // В Activity или Fragment if (GoogleServicesHelper.isFirebaseAvailable()) { val analytics = GoogleServicesHelper.getFirebaseAnalytics(this) // Используем analytics } else { // Работаем без аналитики } // Логирование события GoogleServicesHelper.logAnalyticsEvent( context, "user_action", mapOf("action" to "button_click", "screen" to "main") ) // Получение FCM токена GoogleServicesHelper.getFirebaseMessagingToken( onSuccess = { token -> // Отправить токен на сервер }, onFailure = { exception -> // Обработать ошибку } ) ``` ## 📦 Сборка приложения ### Универсальная сборка (для всех магазинов) ```bash # Один APK для всех типов устройств ./gradlew assembleRelease ``` **Результат:** - APK содержит Firebase библиотеки - На устройствах с GMS → Firebase работает - На устройствах без GMS → Firebase не используется - Один APK подходит для Google Play, RuStore, F-Droid, Huawei AppGallery ## ⚠️ Важные замечания 1. **Firebase библиотеки**: Всегда включены в APK, но используются только при наличии GMS на устройстве: - Код компилируется с Firebase API - Библиотеки включены в APK (~15-20 МБ) - Runtime-детекция определяет доступность GMS - Если GMS нет - Firebase не инициализируется 2. **Размер APK**: - Универсальный APK: ~15-20 МБ (включая Firebase) - Firebase библиотеки занимают ~5-8 МБ - На устройствах без GMS библиотеки просто не используются 3. **Функциональность**: - **На устройствах с GMS**: Полная функциональность + аналитика + push-уведомления - **На устройствах без GMS**: Полная функциональность радио, но без аналитики и push 4. **Crashlytics**: В release сборке отключен через: ```gradle manifestPlaceholders = [crashlyticsCollectionEnabled: "false"] ``` 5. **google-services.json**: Файл всегда присутствует в проекте и используется для конфигурации Firebase, но реальное использование зависит от наличия GMS на устройстве. ## 🎯 Преимущества решения ✅ **Универсальность**: Один APK для всех типов устройств и магазинов ✅ **Безопасность**: Нет крашей при отсутствии Google Services ✅ **Простота**: Не нужно собирать разные версии APK ✅ **Автоматизация**: Runtime-детекция работает автоматически ✅ **Совместимость**: Работает на Huawei, китайских устройствах, эмуляторах ✅ **Поддержка**: Легко поддерживать и тестировать ✅ **Единая сборка**: Один APK для Google Play, RuStore, F-Droid, Huawei AppGallery ## 🔍 Отладка Для проверки статуса сервисов в runtime: ```kotlin // В любом месте приложения val status = GoogleServicesHelper.getServicesStatus(context) Timber.d(status) ``` Вывод: ``` Google Services Status: - Google Play Services: ✓ Available - Firebase: ✓ Available ``` или ``` Google Services Status: - Google Play Services: ✗ Not Available - Firebase: ✗ Not Available ``` ## 📝 Дополнительная информация - Все изменения обратно совместимы - Существующий функционал не затронут - Приложение автоматически адаптируется к окружению - Нет необходимости в разных build flavors (хотя можно добавить при желании) --- **Дата создания**: 2025 **Версия**: 1.0 **Статус**: ✅ Готово к использованию