Не работает autolinking библиотек в react-native

Рейтинг: 0Ответов: 1Опубликовано: 13.06.2023

В React-Native приложении не работает автоматическая линковка(autolinking) устанавливаемых библиотек, которые используют нативные api, например, @react-native-clipboard/clipboard. Линковка должна работать так как используемая версия React-Native 0.70.5.

Я пробовал удалить папку node_modules, убрать все ручные линкинги из нативных файлов, а далее запустил команду yarn, после этого запустил в папке android команду ./gradlew clean.

После описанных выше действий build происходит, но при открытии приложения оно крашится, в консоли ничего нет, открываю заново, опять крашится.

Зависимости в package.json:

"dependencies": {
    "@react-native-async-storage/async-storage": "^1.17.10",
    "@react-native-clipboard/clipboard": "^1.11.2",
    "@react-native-community/geolocation": "^3.0.4",
    "@react-navigation/drawer": "^6.6.2",
    "@react-navigation/native": "^6.1.6",
    "@redux-devtools/extension": "^3.2.5",
    "axios": "^0.27.2",
    "centrifuge": "^3.1.0",
    "date-fns": "^2.29.3",
    "date-fns-tz": "^1.3.7",
    "lodash.isequal": "^4.5.0",
    "metro-config": "^0.73.4",
    "prettier": "^2.8.1",
    "react": "18.1.0",
    "react-native": "0.70.5",
    "react-native-android-open-settings": "^1.3.0",
    "react-native-biometrics": "^2.2.0",
    "react-native-config": "^1.5.0",
    "react-native-gesture-handler": "2.8.0",
    "react-native-maps": "^0.31.0",
    "react-native-outside-press": "^1.1.0",
    "react-native-paper": "^5.1.0",
    "react-native-permissions": "^3.3.1",
    "react-native-reanimated": "^2.0.0",
    "react-native-safe-area-context": "^4.5.3",
    "react-native-screens": "^3.20.0",
    "react-native-svg": "^12.3.0",
    "react-native-table-component": "^1.2.2",
    "react-native-touch-id": "^4.4.1",
    "react-native-vector-icons": "^9.2.0",
    "react-native-webview": "^11.23.1",
    "react-native-yamap": "^4.1.14",
    "react-redux": "^7.2.2",
    "redux": "^4.2.0",
    "redux-persist": "^6.0.0",
    "redux-saga": "^1.1.3"
  },
  "devDependencies": {
    "@babel/core": "^7.17.9",
    "@babel/runtime": "^7.17.9",
    "@react-native-community/eslint-config": "^3.2.0",
    "@tsconfig/react-native": "^2.0.3",
    "@types/jest": "^29.2.4",
    "@types/lodash.isequal": "^4.5.6",
    "@types/react": "^18.0.26",
    "@types/react-native": "^0.70.8",
    "@types/react-native-table-component": "^1.2.4",
    "@types/react-native-vector-icons": "^6.4.13",
    "@types/react-redux": "^7.1.25",
    "@types/react-test-renderer": "^18.0.0",
    "babel-jest": "^28.0.0",
    "babel-plugin-import-glob": "^2.0.0",
    "cross-env": "^7.0.3",
    "eslint": "^8.14.0",
    "jest": "^28.0.0",
    "metro-react-native-babel-preset": "0.72.3",
    "react-native-svg-transformer": "^1.0.0",
    "react-test-renderer": "18.1.0",
    "typescript": "^4.9.4"
  },

Из app/build.gradle я удалил следующее:

implementation project(':react-native-config')
implementation project(':@react-native-community-clipboard')
implementation project(':react-native-reanimated')

Из MainApplication.java:

import com.th3rdwave.safeareacontext.SafeAreaContextPackage;
import com.swmansion.rnscreens.RNScreensPackage;
import com.swmansion.gesturehandler.RNGestureHandlerPackage;
import com.reactnativecommunity.asyncstorage.AsyncStoragePackage;
import com.rnfingerprint.FingerprintAuthPackage;
import ru.vvdev.yamap.RNYamapPackage;
// пропущено некоторое количество кода
new FingerprintAuthPackage(),
new RNYamapPackage(),
new SvgPackage(),
new ClipboardPackage(),
new ReanimatedPackage()

Из android/settings.gradle:

include ':react-native-reanimated'
project(':react-native-reanimated').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-reanimated/android')

Если кратко, если оставить код выше в нативных файлах, то сборка происходит успешно, приложение работает ожидаемо. Если убрать ручной линкинг, то сборка также происходит успешно, но приложение при запуске крашится.

Ответы

▲ 0

Нашел решение проблемы следующим образом:

  1. Использовал Logcat в Android Studio чтобы узнать почему приложение крашится при запуске, в обычном дебаггер ошибок не было.
  2. Причина того, что приложение крашится оказалась в используемой библиотеке react-native-yamap, а именно в том, что данная библиотека не получала токен при инициализации.
  3. Библиотека react-native-yamap не получала токен при инициализации, так как токен брался из переменных окружения, за это отвечала библиотека react-native-config, а переменные окружения не были доступны в js коде.
  4. Чтобы исправить ошибку не доступных переменных окружения, достаточно было вернуть в файл app/build.gradle следующую строчку: apply from: project(':react-native-config').projectDir.getPath() + "/dotenv.gradle"
  5. На этом моменте приложение почти работало, как и до того, как я убрал ручную линковку из файлов, за исключением одной вещи: иконки из библиотеки react-native-vector-icons не отображались. Чтобы исправить эту проблему я также вернул еще 1 строчку кода в том же файле app/build.gradle: apply from: "../../node_modules/react-native-vector-icons/fonts.gradle"
  6. Готово, автоматическая линковка работает, чтобы она начала работать оказалось достаточным удалить все ручные линковки.