Właśnie zaktualizowałem mój projekt, aby używał natywnej wersji 0.60.2 . Ale kiedy próbuję uruchomić aplikację na urządzeniu z Androidem, ulega awarii po ekranie uruchamiania. Mam następujące dzienniki błędów:
E/AndroidRuntime: FATAL EXCEPTION: create_react_context
Process: com.tjspeed, PID: 3909
java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libhermes.so
at com.facebook.soloader.SoLoader.doLoadLibraryBySoName(SoLoader.java:738)
at com.facebook.soloader.SoLoader.loadLibraryBySoName(SoLoader.java:591)
at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:529)
at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:484)
at com.facebook.hermes.reactexecutor.HermesExecutor.<clinit>(HermesExecutor.java:20)
at com.facebook.hermes.reactexecutor.HermesExecutorFactory.create(HermesExecutorFactory.java:27)
at com.facebook.react.ReactInstanceManager$5.run(ReactInstanceManager.java:949)
at java.lang.Thread.run(Thread.java:760)
Kilka propozycji dostępnych tutaj: https://github.com/facebook/react-native/issues/25601, ale niestety żadna z nich nie zadziałała. Zaproponuj obejście.
android
react-native
V-Xtreme
źródło
źródło
Odpowiedzi:
Miałem ten sam problem po aktualizacji z 0.59.8 do 0.60.4
Upewnij się, że dodałeś wszystkie te linie w pliku app / build.gradle , zwłaszcza część dotyczącą zależności, ponieważ zapewnia to, że masz plik binarny JSC
project.ext.react = [ ... // your index js if not default, other settings // Hermes JSC ? enableHermes: false, ... ] def jscFlavor = 'org.webkit:android-jsc:+' def enableHermes = project.ext.react.get("enableHermes", false); dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) implementation "com.facebook.react:react-native:+" // From node_modules if (enableHermes) { // For RN 0.60.x def hermesPath = "../../node_modules/hermesvm/android/" // --- OR ---- // for RN 0.61+ def hermesPath = "../../node_modules/hermes-engine/android/"; debugImplementation files(hermesPath + "hermes-debug.aar") releaseImplementation files(hermesPath + "hermes-release.aar") } else { implementation jscFlavor }
EDYTOWAĆ
Upewnij się również, że repozytorium Hermes Maven znajduje się w katalogu głównym build.gradle
maven { // Android JSC is installed from npm url("$rootDir/../node_modules/jsc-android/dist") }
źródło
Dodałem ten blok do bloku allProject w project_dir / build.gradle i awaria zniknęła.
maven { // Android JSC is installed from npm url("$rootDir/../node_modules/jsc-android/dist") }
To, co zrobiłem, to utworzenie nowego projektu za pomocą narzędzia react-native init i przejrzenie plików kompilacji Androida. Na szczęście ta była pierwszą różnicą, jaką zauważyłem i naprawiłem mój problem. Myślę, że możesz zrobić to samo, jeśli to nie zadziała.
źródło
error: package com.facebook.react.module.annotations does not exist
Właśnie wyczyściłem folder kompilacji dla Androida i po tym wszystko działało dobrze. Mam nadzieję, że to pomoże kojarzyć się.
cd android ./gradlew clean
źródło
na przykład:
allprojects { repositories { maven { // All of React Native (JS, Android binaries) is installed from npm url "$rootDir/../node_modules/react-native/android" } maven { // Local Maven repo containing AARs with JSC library built for Android url "$rootDir/../node_modules/jsc-android/dist" } google() jcenter() } }
android { packagingOptions { pickFirst '**/libjsc.so' pickFirst '**/libc++_shared.so' } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:28.0.0' implementation "org.webkit:android-jsc:+" implementation "com.facebook.react:react-native:+" // From node_modules }
źródło
pickFirst '**/libjsc.so' pickFirst '**/libc++_shared.so'
Jeśli napotkasz ten błąd podczas aktualizacji do wersji React Native
0.62.2
:Dodaj do swojego
android/app/build.gradle
pliku:dependencies { implementation 'com.facebook.soloader:soloader:0.9.0+'
jako jeden z pierwszych
implementation
wpisów.Rozwiązanie pobrane stąd
źródło
rozwiązałem to, dodając
configurations.all { resolutionStrategy { force "com.facebook.soloader:soloader:0.8.2" } }
źródło
app/build.gradle
wewnątrz końcadependencies { }
dependencies { implementation project(':react-native-permissions') configurations.all { resolutionStrategy { force "com.facebook.soloader:soloader:0.8.2" } } }
Dla innych, którzy napotkali ten problem, istnieją 2 sekcje, które wyglądają podobnie. Musisz zaktualizować dolną
repositories
sekcję wandroid/build.gradle
!// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext { buildToolsVersion = "28.0.3" minSdkVersion = 16 compileSdkVersion = 28 targetSdkVersion = 28 supportLibVersion = "28.0.0" } repositories { google() jcenter() } dependencies { classpath("com.android.tools.build:gradle:3.4.1") // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { mavenLocal() maven { // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm url("$rootDir/../node_modules/react-native/android") } maven { // Android JSC is installed from npm url("$rootDir/../node_modules/jsc-android/dist") } google() jcenter() } }
źródło
allprojects { repositories { maven { url "$rootDir/../node_modules/react-native/android" } maven { // Android JSC is installed from npm url("$rootDir/../node_modules/jsc-android/dist") } mavenLocal() google() jcenter() } }
źródło
Nic więcej nie zrobiłem.
./gradlew clean
rozwiązał mój problem.źródło
Po wykonaniu wszystkich porad bez powodzenia, zbudowałem * .apk zamiast * .aab. Pakiet APK ma 16 MB w przeciwieństwie do 8 MB AAB, ale w końcu pozbyłem się UnsatisfiedLinkError.
Aby zbudować AAB (awaria z UnsatisfiedLinkError):
cd android && ./gradlew clean && ./gradlew bundleRelease
Aby zbudować APK (bez awarii i hermetyków też działa dobrze):
cd android && ./gradlew clean && ./gradlew assembleRelease
źródło
W moim przypadku Hermes nigdy nie był włączony, a mimo to napotkałem ten błąd. Czyszczenie (przez Android Studio) i odbudowanie rozwiązało problem.
źródło
./gradlew clean
ma znaczenie?Spróbuj zamienić obiekt ndk w app / build.gradle
defaultConfig { ... ndk { abiFilters "armeabi-v7a", "x86" } }
źródło
Wystąpił ten błąd, gdy próbowałem uruchomić ze starszą wersją React Native, przed 0.60, podczas gdy
package.json
miałem zdefiniowaną nowszą wersję (post 0.60).źródło
Zdarza mi się, że po zaktualizowaniu mojego studia Android, a następnie wyczyszczę i zbuduję ponownie, już się nie zawiesza.
źródło
Dzieje się tak, ponieważ SOLoader jest nieobecny.
Zapewnić
implementation'com.facebook.soloader:soloader:0.9.0+'
jest dodawany w zależnościach w android / app / build.gradlle
wyczyść swoją kompilację
cd android
./gradlew clean
Spróbuj połączyć
./gradlew bundleRelease
Zamknij folder Androida
cd ../
Spróbuj biegać
npx react-native run-android --variant=release
źródło
W moim przypadku wystarczy włączyć
enableHermes
wapp/build.gradle
:project.ext.react = [ entryFile : "index.js", enableHermes: true, // HERE! ]
źródło
Rozwiąż ten problem w prosty sposób.
apply plugin: "com.android.application" // def useIntlJsc = false import com.android.build.OutputFile project.ext.react = [ entryFile: "index.js", bundleInStaging: true, // Add this bundleInInternalTest: true, // Add this bundleInRelease: true ] apply from: "../../node_modules/react-native/react.gradle" def enableSeparateBuildPerCPUArchitecture = false def enableProguardInReleaseBuilds = false def jscFlavor = 'org.webkit:android-jsc:+' def enableHermes = project.ext.react.get("enableHermes", false); android { compileSdkVersion rootProject.ext.compileSdkVersion buildToolsVersion rootProject.ext.buildToolsVersion defaultConfig { applicationId "com.inbox.clean.free.gmail.unsubscribe.smart.email.fresh.mailbox" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 2597205 //4242929 versionName "1.6.3" multiDexEnabled true ndk { // abiFilters "armeabi-v7a", "x86" // abiFilters.clear() } } signingConfigs { release { if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) { storeFile file(MYAPP_RELEASE_STORE_FILE) storePassword MYAPP_RELEASE_STORE_PASSWORD keyAlias MYAPP_RELEASE_KEY_ALIAS keyPassword MYAPP_RELEASE_KEY_PASSWORD } } } buildTypes { release { minifyEnabled enableProguardInReleaseBuilds shrinkResources enableSeparateBuildPerCPUArchitecture proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" signingConfig signingConfigs.release } } project.ext.sentryCli = [ logLevel: "debug", flavorAware: false, //add enableHermes: false ] compileOptions { sourceCompatibility 1.8 targetCompatibility 1.8 } splits { abi { reset() enable true universalApk false // If true, also generate a universal APK include "armeabi-v7a","arm64-v8a","x86","x86_64" //"armeabi-v7a" "arm64-v8a" "x86" "x86_64" // include "armeabi-v7a", "x86" exclude "ldpi", "xxhdpi", "xxxhdpi" } } applicationVariants.all { variant -> variant.outputs.each { output -> // For each separate APK per architecture, set a unique version code as described here: // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits def versionCodes = ["armeabi-v7a":1, "x86":2, "arm64-v8a":3,"x86_64":4] def abi = output.getFilter(OutputFile.ABI) if (abi != null) { // null for the universal-debug, universal-release variants output.versionCodeOverride = versionCodes.get(abi) * 1048576 + defaultConfig.versionCode } } } } dependencies { implementation project(':react-native-linear-gradient') implementation fileTree(dir: "libs", include: ["*.jar"]) if (enableHermes) { def hermesPath = "../../node_modules/hermesvm/android/"; debugImplementation files(hermesPath + "hermes-debug.aar") releaseImplementation files(hermesPath + "hermes-release.aar") } else { implementation jscFlavor } } // Run this once to be able to run the application with BUCK // puts all compile dependencies into folder libs for BUCK to use task copyDownloadableDepsToLibs(type: Copy) { from configurations.compile into 'libs' } apply plugin: 'com.google.gms.google-services'
źródło
Jeśli ktoś nadal boryka się z problemem, nawet po wykonaniu wszystkich powyższych kroków, oto rozwiązanie
W pliku MainApplication.java dodaj ten import:
import com.facebook.react.BuildConfig;
źródło
BuildConfig.DEBUG
wartości i sprawi, że kompilacje debugowania przestaną działać.