Upgrading your React-Native app from Android SDK 34 to 35 should be simple. Google releases a new SDK → you update compileSdkVersion and targetSdkVersion → rebuild → ship update. Right?
Wrong.
The Android 35 upgrade is one of the most painful upgrades the community has faced since Android 28 → 29.
This article documents every issue I personally faced, how I fixed them, what other developers are reporting globally, and the ultimate fix almost no one talks about.
If you are upgrading your RN project to Android 35 - this guide will save you hours (or days) of debugging.
What I Upgraded
compileSdkVersion = 34 -> // upgrade to 35
targetSdkVersion = 35 -> // upgrade to 35
buildToolsVersion = "34.0.0" -> // upgrade to 35.0.0
I also added this to styles.xml (required for Android 15 / API 35 edge-to-edge changes):
<item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
My project is on:
React-Native 0.72.7
70+ libraries (Zego, Firebase, Notifee, Maps, FS, Vimeo, RN Config, etc.)
Kotlin code + Java code (important later)
The Nightmare Begins - AAPT2 Crash on Android 35
As soon as I attempted to build:
Execution failed for task :app:processProdDebugResources
Android resource linking failed
RES_TABLE_TYPE_TYPE entry offsets overlap actual entry data
Failed to load resources table in android-35/android.jar
This is a fatal AAPT2 crash that makes the entire build impossible.
I tried following:
✔ Deleted Android 35 platform
rm -rf ~/Library/Android/sdk/platforms/android-35
✔ Reinstalled using SDK Manager
✔ Invalidated caches
✔ Removed .gradle, build, intermediates
✔ Clean build / rebuild
✔ Reinstalled Android Studio
✔ Tried with Staging / Prod flavors
Nothing worked.
Why?
Because Android 35 ships a new resources table format, but AGP (Android Gradle Plugin) still ships an older AAPT2 binary that can't read it.
This is why the error mentions:
RES_TABLE_TYPE_TYPE entry offsets overlap actual entry data
The Fix Almost Nobody Knows
The build worked instantly when I added this to gradle.properties:
android.aapt2Version=8.6.1-11315950
✔ Why it works (short version)
Android 35 requires a newer AAPT2, not the old one bundled with AGP 7.x.
Setting this line downloads a fresh AAPT2 build:
8.6.1-11315950
…which can parse Android 35's updated android.jar.
BAM - build succeeds.
✔ Why Google doesn't document it
Because the official "fix" is to upgrade AGP to 8.x - but RN 0.72 cannot yet use AGP 8 safely.
So this property is an internal escape hatch that allows RN developers to upgrade without rewriting their entire Android build configuration.
The Next Problem: NoSuchMethodError reversed()
After the build succeeded, the app crashed:
java.lang.NoSuchMethodError: No virtual method reversed()Ljava/util/List;
This happened because:
JDK 17+ ships List.reversed()
But many RN/Kotlin libraries compile against older Kotlin stdlib
When mixed, Dalvik cannot locate the JDK method → runtime crash
✔ How I fixed it
I replaced all occurrences of reversed() with:
asReversed()
This exists in older Kotlin stdlib and works everywhere.
I patched my own Kotlin code AND created patches for:
react-native-screens
react-native-gesture-handler
Because these libs internally used reversed() as well.
I applied the patches using patch-package.
Expect MORE Errors While Upgrading - Common Issues (Community Reports)
Developers upgrading to 35 commonly see:
🔻 AAPT2 resource linking crash
🔻 "Execution failed for task :app:mergeDebugResources"
Caused by broken vector drawables under new validator.
🔻 Edge-to-edge mandatory updates
styles.xml must contain:
<item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
🔻 Kotlin / Java binary incompatibilities
reversed(), JDK 17 methods missing, etc.
🔻 Build tools mismatch
Build-tools 35.0.0 is still in preview so many users end up with partial installs.
🔻 Firebase / Notifee / React-Native-Maps needing updated peer versions
Especially with 35's new system location permissions.
🛠 6. Full Checklist for Upgrading React-Native from API 34 → 35
1️⃣ Update build configuration
android/build.gradle:
compileSdkVersion 35
targetSdkVersion 35
2️⃣ Add required edge-to-edge rules
res/values/styles.xml:
<item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
3️⃣ Fix AAPT2 crash
gradle.properties:
android.aapt2Version=8.6.1-11315950
4️⃣ Upgrade Android Build Tools
SDK Manager → Install:
Android SDK Platform 35
Build Tools 35.x.x
5️⃣ Fix Kotlin/JDK reversed() crash
Search project:
reversed()
Replace with:
asReversed()
Apply patches for:
RN Screens
Gesture Handler
6️⃣ Rebuild
cd android
./gradlew clean
./gradlew assembleDebug
🏁 7. Final Result
After applying:
✔ AAPT2 upgrade
✔ Edge-to-edge opt-out
✔ Kotlin reversed() fix
✔ Library patches
The project builds and runs on:
Android 15 emulator, Api 29 till api 35 builds fine
Physical Pixel device
Both debug and release
All staging / prod flavors
Zero crashes, zero resource failures.




Top comments (0)