Hello, my name is yoshihamkorori.
Thank you for taking the time to read this article.
In this post, I’d like to share a war story from around December 2025, when I struggled with upgrading an Android app’s targetSdkVersion from 34 to 35.
This might be a problem specific to my own situation, but if anyone out there is dealing with a similar issue, I hope you’ll find this article helpful.
Note: This article contains affiliate links.
Environment
If the platform hadn’t been so outdated, I might not have had to struggle this much in the first place.
Below is the environment I was working with. This reflects my setup around December 2025.
- React Native 0.60.6
- node.js 10.17.0
- JDK 13.0.1
- kotlin 1.7.10
- Android Gradle Plugin(AGP) 7.2.2
- Gradle 7.4.2

The Two Biggest Hurdles to Reaching Android API Level 35
Starting with Android API level 35, there were significant and far-reaching changes introduced to the platform.
I won’t go into the details here, but the two major changes that matter in this context are the following:
Edge-to-Edge Support
Traditionally, the Android OS handled the status bar and navigation bar for us.
Going forward, however, this responsibility shifts to the app itself.
While edge-to-edge support is not strictly mandatory, failing to handle it properly can cause parts of the UI—such as the top or bottom of the screen—to be hidden behind the status bar or navigation bar. As a result, buttons may become unresponsive or impossible to tap.
16 KB Page Size Support
This change is aimed at devices designed for higher performance and faster processing.
Unlike edge-to-edge support, this one is mandatory—without proper support, your app will not be allowed to be published or updated on Google Play.
What I Did — and What I Gave Up — to Reach Android API Level 35
I kept compileSdkVersion and buildToolsVersion at 34, and ultimately gave up on upgrading them to 35.
With both the React Native version and the AGP version being so outdated, trying to upgrade various components quickly caused dependency issues across libraries. One change would trigger another, leading to a cascade of errors that became increasingly difficult to control.
From a maintenance perspective, I believe these kinds of version upgrades need to be done on a regular basis—though in reality, it’s often hard to get the necessary time and resources approved (which is frustrating).
Once I tried upgrading compileSdkVersion and buildToolsVersion, all of these problems surfaced at once, and the build stopped working entirely.
Given that we are already considering a major rewrite in the future, I decided this time to only bump targetSdkVersion to 35 and leave the rest unchanged.
I implemented support for 16 KB page sizes.
At this point, upgrading the React Native or AGP versions was no longer an option, so I had to resort to a workaround for supporting 16 KB page sizes.
Below are links to the relevant official documentation.
Support 16KB page sizes
If you upload a module (such as an *.apk) that does not support 16 KB page sizes, the upload itself will succeed, but you’ll hit an error on the very next screen and won’t be able to submit the app for review.
I implemented edge-to-edge support.
At this point, the React Native version itself was simply too old, which meant I couldn’t even use common libraries like react-native-safe-area-view.
Every attempt to install such libraries quickly spiraled out of control with dependency errors or demands to upgrade Node.js, making the situation unmanageable.
That left me with only one option:
manually calculating the heights of the status bar and navigation bar and adjusting the layout myself.
I added paddingTop equal to the status bar height and paddingBottom equal to the navigation bar height to the app’s content area.
For the status bar, I was able to retrieve its height on the React Native (JavaScript) side.
However, the navigation bar height couldn’t be obtained from React Native, so I had to fetch it on the native (Java) side and pass it back to React Native as props.
It was… a lot of work.

Other Tips
This goes beyond the scope of this article, but I’d like to share a few potential pitfalls that are easy to run into.
Upload your app to Google Play early and make sure there are no errors in the executable modules.
Once you’ve implemented the changes and done a quick sanity check to make sure everything works, create a release build as early as possible and upload the executable modules to Google Play. Then proceed to the next screen and carefully review any errors or warnings reported for the modules.
If you continue working only with debug builds and wait until the very end to submit for review, you may suddenly find yourself blocked by executable module errors—something that can seriously disrupt your schedule.
This is not hypothetical; it actually happened to me, so please be careful.
In the past, there was a common perception that “iOS reviews are strict, while Android reviews are lenient.”
These days, however, there are times when Android’s review process feels even stricter than iOS’s.
Android Navigation Bars Have Two Modes
I used to think that older versions of Android always showed a navigation bar with the “△ ○ □” buttons, while newer versions used the “—” style bar.
It turns out these are actually switchable modes.
The mode with the “△ ○ □” buttons is called 3-button navigation, while the mode with the “—” bar is known as gesture navigation.
When implementing edge-to-edge support, you need to handle the navigation bar properly. The tricky part is that the navigation bar height differs between 3-button navigation and gesture navigation, so you should test and verify your layout in both modes.
For reference, you can switch between these modes via
Settings → System → Navigation mode.
Final Thoughts
Thank you for reading all the way to the end.
This may have been a struggle that could have been avoided, but it took me a tremendous amount of time to finally get the app published. If this article helps even one person avoid the same pain, I’ll consider it well worth it.
Feel free to leave any questions or comments.
And if you found this article helpful, I’d really appreciate it if you’d consider supporting me via the donation button below.

コメント