rive-app / rive-app/rive-react-native
Android: scroll jank / frame drops after upgrading to v9.8.1 (release builds, Samsung S24)
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 783
- Forks
- 81
- Avg merge
- 3d 6h
- Merged PRs (30d)
- 3
Description
After upgrading rive-react-native from v7.3.0 to v9.8.1, Rive animations cause noticeable frame drops / scroll jank on Android in release builds. I bisected this to the underlying rive-android native runtime dependency:
app.rive:rive-android:9.12.2→ smooth, 60 fps scrollingapp.rive:rive-android:9.13.0→ scroll janks, frame drops, especially on Samsung Galaxy S24
Everything else is held constant — same rive-react-native@9.8.1, same device, same release APK, same .riv, same screen. The only variable is the native runtime version.
9.13.0 is the release that added 16 KB page size support for Android, so the regression appears to be related to changes in that release (.so layout / alignment / memory mapping) rather than anything in the RN bridge.
iOS is completely unaffected.
Release list for reference: https://github.com/rive-app/rive-android/releases?page=5
Provide a Repro
- Single
<Rive />component running a state machine animation withautoplay={true}. - Mounted inside a scrollable screen (e.g.
ScrollView/FlatList). - Scroll the screen on a release build.
- On
9.13.0+the scroll is visibly janky; on9.12.2the same screen scrolls smoothly.
Reproduction steps:
- React Native 0.77.0 app with
rive-react-native@9.8.1. - Pin the native runtime to
9.13.0:// android/app/build.gradle implementation("app.rive:rive-android:9.13.0") - Build in release and run on a Samsung Galaxy S24.
- Render a single
<Rive />(state machine,autoplay) inside aScrollViewand scroll.
Workaround — pinning to the previous runtime restores smooth scrolling:
implementation("app.rive:rive-android:9.12.2")
Source .riv/.rev file
Expected behavior
rive-android 9.13.0+ should render a single autoplaying state-machine .riv inside a scrollable view at the same performance as 9.12.2 on a standard 4 KB page-size device. The 16 KB page-size support change should be a no-op on current hardware (e.g. Samsung S24), not introduce scroll jank.
Device & Versions (please complete the following information)
- Devices:
- Samsung Galaxy S24 — jank is very prominent
- Other Android devices — milder but still visible frame drops
- Build type: Release APK (jank is not present / not characterized in debug)
- OS: Android (stock Samsung OneUI on S24)
- NPM Version:
10.2.4 - React Native:
0.77.0 - rive-react-native:
9.8.1 - rive-android (native runtime):
- Smooth:
9.12.2 - Janky:
9.13.0and above
- Smooth:
Additional context
- Single
<Rive />instance on screen, inside a scroll container — the scroll itself janks during Rive playback. - Animation uses a state machine,
autoplay={true}, otherwise default props. - Same
rive-react-native@9.8.1install, same device, same release build on both runtime versions — the native runtime bump is the only variable. - Samsung S24 ships with a 4 KB page size, so the 16 KB support change should not affect it. The fact that it's the device where jank is most visible suggests the regression may be in the rendering / CPU path, not in memory-mapping per se.
- Happy to share the
.rivprivately athello@rive.app, and can provideadb shell dumpsys gfxinfo/ systrace output if helpful — let me know what would be most useful.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the release-build reproduction described in the issue, using android/app/build.gradle to compare rive-android 9.12.2 and 9.13.0 on a Samsung Galaxy S24 with sample_rive.zip. Collect the suggested adb shell dumpsys gfxinfo or systrace data while scrolling, then investigate the native runtime regression. Done means the same autoplaying state-machine view scrolls without the 9.13.0+ frame drops.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- android, react-native, typescript
- Domain
- mobile, performance
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Clearly specified
- Newbie friendliness
- 48/100