Skip to content

Commit 0ac7659

Browse files
tomekzawpiaskowyk
authored andcommitted
Fix Android crash when worklet throws error (#3558)
This PR improves developer experience of error handling in worklets by showing a RedBox with full error message rather than crashing the whole app on Android. **Note:** Android with Fabric enabled works only if building with NDK 21 via `yarn react-native run-android [--active-arch-only]`, crashes when building with NDK 24 from Android Studio, see Shopify/flash-list#550 (comment) for details (this is not an issue with Reanimated) <table> <thead> <tr> <th rowspan="2">Scenario</th> <th colspan="2">Before</th> <th colspan="2">After</th> </tr> <tr> <th>Paper</th> <th>Fabric</th> <th>Paper</th> <th>Fabric</th> </thead> <tbody> <tr> <td>worklet</td> <td align="center">💥</td> <td align="center">💥</td> <td align="center">✅</td> <td align="center">✅</td> </tr> <tr> <td>nested worklet</td> <td align="center">💥</td> <td align="center">💥</td> <td align="center">✅</td> <td align="center">✅</td> </tr> <tr> <td>useAnimatedStyle</td> <td align="center">💥</td> <td align="center">💥</td> <td align="center">✅</td> <td align="center">✅</td> </tr> <tr> <td>useDerivedValue</td> <td align="center">💥</td> <td align="center">💥</td> <td align="center">✅</td> <td align="center">✅</td> </tr> <tr> <td>useFrameCallback</td> <td align="center">💥</td> <td align="center">💥</td> <td align="center">✅</td> <td align="center">✅</td> </tr> <tr> <td>GestureDetector</td> <td align="center">💥</td> <td align="center">💥</td> <td align="center">✅</td> <td align="center">✅</td> </tr> <tr> <td>useAnimatedGestureHandler</td> <td align="center">💥</td> <td align="center">💥</td> <td align="center">✅</td> <td align="center">✅</td> </tr> <tr> <td>useAnimatedScrollHandler</td> <td align="center">💥</td> <td align="center">💥</td> <td align="center">✅</td> <td align="center">✅</td> </tr> <tr> <td>useScrollViewOffset</td> <td align="center">💥</td> <td align="center">💥</td> <td align="center">✅</td> <td align="center">✅</td> </tr> </tbody> </table> https://github.com/software-mansion/react-native-reanimated/blob/48af341d51ca289dc007fdfd81d124ae0c267523/FabricExample/android/build.gradle#L11-L17 ```diff - ndkVersion = "24.0.8215888" + ndkVersion = "21.4.7075529" ``` `ERROR: Unknown host CPU architecture: arm64` ```console code ~/Library/Android/sdk/ndk/21.4.7075529/ndk-build ``` ```diff DIR="$(cd "$(dirname "$0")" && pwd)" -$DIR/build/ndk-build "$@" +arch -x86_64 $DIR/build/ndk-build "$@" ``` - [ ] Included code example that can be used to test this change - [ ] Updated TS types - [ ] Added TS types tests - [ ] Added unit / integration tests - [ ] Updated documentation - [ ] Ensured that CI passes
1 parent 907d937 commit 0ac7659

File tree

4 files changed

+4
-18
lines changed

4 files changed

+4
-18
lines changed

Common/cpp/SharedItems/ShareableValue.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -397,8 +397,6 @@ jsi::Value ShareableValue::toJSValue(jsi::Runtime &rt) {
397397
} else {
398398
res = funPtr->call(rt, args, count);
399399
}
400-
} catch (jsi::JSError &e) {
401-
throw e;
402400
} catch (std::exception &e) {
403401
std::string str = e.what();
404402
runtimeManager->errorHandler->setError(str);

android/src/main/cpp/AndroidErrorHandler.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "AndroidErrorHandler.h"
22
#include <fbjni/fbjni.h>
3+
#include <exception>
34
#include <string>
45
#include "Logger.h"
56

@@ -17,11 +18,9 @@ void AndroidErrorHandler::raiseSpec() {
1718
return;
1819
}
1920

20-
static const auto cls = javaClassStatic();
21-
static auto method = cls->getStaticMethod<void(std::string)>("raise");
22-
method(cls, error->message);
23-
21+
// mark error as handled before this method throws exception
2422
this->error->handled = true;
23+
throw std::runtime_error(this->error->message);
2524
}
2625

2726
std::shared_ptr<Scheduler> AndroidErrorHandler::getScheduler() {

android/src/main/cpp/AndroidErrorHandler.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,12 @@
1111

1212
namespace reanimated {
1313

14-
class AndroidErrorHandler : public JavaClass<AndroidErrorHandler>,
15-
public ErrorHandler {
14+
class AndroidErrorHandler : public ErrorHandler {
1615
std::shared_ptr<ErrorWrapper> error;
1716
std::shared_ptr<Scheduler> scheduler;
1817
void raiseSpec() override;
1918

2019
public:
21-
static auto constexpr kJavaDescriptor =
22-
"Lcom/swmansion/reanimated/AndroidErrorHandler;";
2320
explicit AndroidErrorHandler(std::shared_ptr<Scheduler> scheduler);
2421
std::shared_ptr<Scheduler> getScheduler() override;
2522
std::shared_ptr<ErrorWrapper> getError() override;

android/src/main/java/com/swmansion/reanimated/AndroidErrorHandler.java

Lines changed: 0 additions & 8 deletions
This file was deleted.

0 commit comments

Comments
 (0)