Почему подписка на уведомления не работает при сборке приложения в режиме Release с использованием react-native-ble-manager, хотя в режиме Debug всё функционирует нормально?

Я тестирую приложение на устройстве Oppo Reno 5 с Android 13, которое подключается по BLE к смарт-часам. При сборке приложения в режиме Debug все функции работают успешно: соединение происходит, подписка на уведомления осуществляется, и команды отправляются на часы. Однако, когда я собираю приложение в режиме Release, уведомления с часов не приходят.

Вот как я подписываюсь на уведомления:

```javascript
try {
  await this.BLEService.startNotification(this.device.id, appConfig.UUID_S, appConfig.UUID_C_1);
  await this.BLEService.startNotification(this.device.id, appConfig.UUID_S, appConfig.UUID_C_3);
} catch (err: any) {
  console.error(err.toString());
  this.addDebugInfo(err.toString());
}
```

При этом в одном и другом режиме ошибок не возникает. 

Также я устанавливаю слушатель событий следующим образом:

```javascript
this.bleManagerEmitter.addListener('BleManagerDidUpdateValueForCharacteristic', ...);
```

В режиме Debug все события приходят корректно, в то время как в режиме Release событий нет.

Вот содержание моего AndroidManifest.xml:

```xml
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission-sdk-23 android:name="android.permissi...
```

Почему приложение работает в режиме Debug, но не получает уведомления в режиме Release?
  • 1 октября 2024 г. 13:33
Ответы на вопрос 2
Проблема, с которой вы сталкиваетесь, может быть вызвана несколькими факторами, которые могут отличаться между режимами Debug и Release в React Native, особенно при работе с BLE (Bluetooth Low Energy). Вот несколько возможных причин и решений, которые вы можете проверить:

1. **Proguard / R8**: 
   Если вы используете Proguard или R8 для обфускации кода в режиме Release, это может повлиять на работу BLE библиотеки. Убедитесь, что у вас есть правильные правила Proguard для BLE. Возможно, вам нужно добавить исключения для библиотек, которые вы используете, чтобы они не были обфусцированы. Включите в `proguard-rules.pro` следующее (или похожие строки, в зависимости от конкретной библиотеки BLE):

   ```proguard
   -keep class com.YourBleLibrary.** { *; }
   -keep class com.facebook.react.modules.ble.** { *; }
   ```

2. **Разрешения**:
   Убедитесь, что ваше приложение получило все необходимые разрешения на использование Bluetooth и его возможностей. В Android 12 и выше требуется явно запрашивать разрешения `BLUETOOTH_SCAN` и `BLUETOOTH_CONNECT`. Проверьте, что вы запрашиваете разрешения в вашем коде:

   ```javascript
   if (Platform.OS === 'android' && Platform.Version >= 31) {
       // Запрос разрешений для Android 12+
       await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.BLUETOOTH_SCAN);
       await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.BLUETOOTH_CONNECT);
   }
   ```

3. **Логи и отладка**:
   Так как в режиме Release отладка может быть усложненной, убедитесь, что вы пишете достаточно логов, чтобы отслеживать состояние подключения и подписки на уведомления. Это поможет выявить, где именно происходит проблема. Используйте `console.log` или другие инструменты логирования.

4. **Тестирование на разных устройствах**:
   Иногда проблемы могут быть специфичны для конкретного устройства или версии Android. Попробуйте протестировать ваше приложение на других устройствах или эмуляторах.

5. **Настройки библиотеки**:
   Проверьте настройки и документацию `react-native-ble-manager` для любых упоминаний о том, как работает ваша версия библиотеки в режиме Release, и убедитесь, что вы следуете всем рекомендациям.

6. **Обновление библиотек**:
   Убедитесь, что вы используете последнюю версию `react-native-ble-manager`, так как проблемы с совместимостью могли быть исправлены в более поздних версиях.

Если после проверки всех этих пунктов проблема не решится, вы можете рассмотреть возможные ошибки в самом коде. Попробуйте создать минимальный проект, который воспроизводит эту проблему, чтобы сузить круг возможных причин.
Нужно отключить оптимизацию в build.gradle 

def enableProguardInReleaseBuilds = false

Либо настроить правила, отключающие оптимизацию react-native-ble-manager в proguard-rules.pro

-keep class it.innove.** { *; }
Похожие вопросы