Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enable debugging on Reanimated's runtime using Chrome DevTools #3526

Merged
merged 84 commits into from
Sep 22, 2022

Conversation

Kwasow
Copy link
Contributor

@Kwasow Kwasow commented Aug 30, 2022

Description

This PR is related to #1960 (and its replacement #2047). It adds the ability to use Chrome DevTools to add breakpoints and debug worklets (or the UI context in general) both on Android and iOS.

Major changes

Runtime creation has been moved to ReanimatedRuntime for both Android and iOS (in the Common/cpp/ReanimatedRuntime directory).

Before (Android) [file: NativeProxy.cpp]:

#if JS_RUNTIME_HERMES
  auto config =
      ::hermes::vm::RuntimeConfig::Builder().withEnableSampleProfiling(false);
  std::shared_ptr<jsi::Runtime> animatedRuntime =
      facebook::hermes::makeHermesRuntime(config.build());
#elif JS_RUNTIME_V8
      …
#else
      …
#endif

After (shared) [file: NativeProxy.cpp]:

ReanimatedRuntime::make(jsQueue);

The custom build config has been removed, as sample profiling is set to false by default.

The created HermesRuntimeManager object is the stored inside ReanimatedNativeModule as it is important that it’s lifetime is synced with the lifetime of the module.

Testing

  • Builds on Android
  • Builds on Android in release mode
  • App reloads work on Android
  • Builds on iOS
  • Builds on iOS in release mode
  • App reloads work on iOS
  • JSC still works
  • JSC debugging in Safari with iOS still works
  • Paper still works

Versions of React-Native tested: 0.70

Things to look into

  • Breakpoint labels do not appear on iOS
    I tested this on a new app with Flipper on the main JS thread, and it was also the case, so it seem to not be an issue on our side
  • After removing a breakpoint on iOS it can't be set in the same location again
    This seems to be an issue with Chrome DevTools as connecting to Reanimated's runtime through Flipper fully works
  • Edge-case: the app will crash if a reload is performed while the debugger is open
    Will be fixed in a PR to metro and 58e9e7b
  • The latest release of Chrome (105) broke source maps, so only Flipper works now. I reported the issue here, and I'm waiting for a response from the Chromium team

TODO

Common/cpp/ReanimatedRuntime/ReanimatedHermesRuntime.cpp Outdated Show resolved Hide resolved
Common/cpp/ReanimatedRuntime/ReanimatedHermesRuntime.h Outdated Show resolved Hide resolved
Common/cpp/ReanimatedRuntime/ReanimatedHermesRuntime.h Outdated Show resolved Hide resolved
Common/cpp/ReanimatedRuntime/ReanimatedHermesRuntime.h Outdated Show resolved Hide resolved
Common/cpp/ReanimatedRuntime/ReanimatedHermesRuntime.h Outdated Show resolved Hide resolved
Common/cpp/ReanimatedRuntime/ReanimatedRuntime.h Outdated Show resolved Hide resolved
Common/cpp/ReanimatedRuntime/RuntimeInitialization.md Outdated Show resolved Hide resolved
RNReanimated.podspec Show resolved Hide resolved
@tomekzaw
Copy link
Member

debugging.mp4

@tomekzaw
Copy link
Member

ios.mp4

@tomekzaw
Copy link
Member

Congratulations on this PR! You have completed a task that many have attempted but no one succeeded. A lot of research had to be done to make this happen. Certainly, it takes a lot of skills and patience to dive into and navigate through the deepest trenches of React Native ecosystem, in particular exploring undocumented areas of codebase of external tools such as Flipper and Metro. The solution you have proposed involves several programming languages including C++, Objective-C, Ruby, Java, Groovy, TypeScript and Flow as well as various development tools such as npm, yarn, Babel, Gradle, CMake, CocoaPods and Docusaurus. It was a pleasure to watch the progress of the work, follow your findings and conclusions, and finally discuss various aspects of the implementation, from code style to architecture and versioning. This feature is a game-changer and it will certainly be highly appreciated by the community. Thank you!

Copy link
Member

@piaskowyk piaskowyk left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well done!

@piaskowyk piaskowyk merged commit 6985391 into main Sep 22, 2022
@piaskowyk piaskowyk deleted the @kwasow/uiRuntimeDebugging branch September 22, 2022 10:16
@capezzbr
Copy link
Contributor

capezzbr commented Nov 2, 2022

This PR broke integration with V8 engine

node_modules/react-native-reanimated/Common/cpp/ReanimatedRuntime/ReanimatedRuntime.cpp:40:38: error: use of undeclared identifier 'runtime_'

@tomekzaw
Copy link
Member

tomekzaw commented Nov 2, 2022

Thanks for letting us know @capezzbr, we'll definitely need to take a look at this. We don't have any V8 example app in our repo yet so there's no CI that checks V8 integration. I will try to setup the app anytime soon.

@capezzbr
Copy link
Contributor

capezzbr commented Nov 2, 2022

Hey @tomekzaw, here is my attempt to fix the issue: #3736. Let me know what you think 👍

fluiddot pushed a commit to wordpress-mobile/react-native-reanimated that referenced this pull request Jun 5, 2023
…are-mansion#3526)

## Description

This PR is related to software-mansion#1960 (and its replacement software-mansion#2047). It adds the
ability to use Chrome DevTools to add breakpoints and debug worklets (or
the UI context in general) both on Android and iOS.

## Major changes

Runtime creation has been moved to `ReanimatedRuntime` for both Android
and iOS (in the `Common/cpp/ReanimatedRuntime` directory).

Before (Android) [file: `NativeProxy.cpp`]:
```cpp
#if JS_RUNTIME_HERMES
  auto config =
      ::hermes::vm::RuntimeConfig::Builder().withEnableSampleProfiling(false);
  std::shared_ptr<jsi::Runtime> animatedRuntime =
      facebook::hermes::makeHermesRuntime(config.build());
#elif JS_RUNTIME_V8
      …
#else
      …
#endif
```

After (shared) [file: `NativeProxy.cpp`]:
```cpp
ReanimatedRuntime::make(jsQueue);
```

The custom build config has been removed, as sample profiling is set to
false by default.

The created `HermesRuntimeManager` object is the stored inside
`ReanimatedNativeModule` as it is important that it’s lifetime is synced
with the lifetime of the module.

## Testing

- [x] Builds on Android
- [x] Builds on Android in release mode
- [x] App reloads work on Android
- [x] Builds on iOS
- [x] Builds on iOS in release mode
- [x] App reloads work on iOS
- [x] JSC still works
- [x] JSC debugging in Safari with iOS still works
- [x] Paper still works

Versions of React-Native tested: 0.70

## Things to look into

- ~~Breakpoint labels do not appear on iOS~~
_I tested this on a new app with Flipper on the main JS thread, and it
was also the case, so it seem to not be an issue on our side_
- ~~After removing a breakpoint on iOS it can't be set in the same
location again~~
_This seems to be an issue with Chrome DevTools as connecting to
Reanimated's runtime through Flipper fully works_
- ~~Edge-case: the app will crash if a reload is performed while the
debugger is open~~
_Will be fixed in a PR to metro and
[58e9e7b](https://github.com/software-mansion/react-native-reanimated/pull/3526/commits/58e9e7bcd7d3b6b590a5f6fca0db93a951eaa39e)_
- The latest release of Chrome (105) broke source maps, so only Flipper
works now. I reported the issue
[here](https://bugs.chromium.org/p/chromium/issues/detail?id=1360298#makechanges),
and I'm waiting for a response from the Chromium team

## TODO

- [x] Open PR to update debugging docs in documentation (will be
included in software-mansion#3446)
- [x] Open PR in [facebook/flipper](https://github.com/facebook/flipper)
to enable Flipper support on custom runtimes (facebook/flipper#4047)
- [x] Open PR in [facebook/metro](https://github.com/facebook/metro) to
support debugger reloads on custom runtimes (facebook/metro#864)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants