-
Notifications
You must be signed in to change notification settings - Fork 24.4k
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
Need support for 16KB page size on Android #45054
Comments
|
Agree. To unblock yourself you can however:
|
I created the following repo where I use RN 0.74.3. (Repo)
As a result, I got the following exception after the app launched:
|
@bc-lee @Pulimet Have you tried adding the broadcast receiver capability which was mandatory after Android SDK 34 upgrade? https://stackoverflow.com/questions/78765352/updated-compilesdkversion-to-34-in-react-native-project-but-unable-to-connect-t |
Same issue for me as well, tried all the solutions given for 16kb page size support - https://developer.android.com/guide/practices/page-sizes#groovy_1 My version compatibility table for react native app -
After trying all the possible solutions, the app was successfully built & installed on the emulator. But the app couldn't launch as there was a repetitive crash occurring.
Was anyone able to install react native app successfully on 16kb page size devices? |
@cortinico could you help in this after developers above tried proposed solution ? |
did you check if libs aligned or not ? @Pulimet |
./alignment.sh apk | grep "arm64-v8a" Resultsapk/lib/arm64-v8a/libreact_newarchdefaults.so: \e[31mUNALIGNED\e[0m (212) |
Seems alignment not done properly. |
same results, all are unAligned. I found two ndk version in your sample repo @Pulimet one is 27 and other 26 I added steps for 26 version but I got same issue. is RN use preBuilt .so library ? @cortinico |
Yes we do ship prebuilts for all the |
@jakhil232 could you please check alignment of .so and share with us results ? |
Same case for me as @Pulimet, mine libraries are unaligned as well. I think the alignment should come from React Native side, as they are shipping it. Also tried all the methods, given in the dock. @cortinico any timeline? as to when React Native will start shipping these changes? |
Certainly, pinging React Native devs won't help, as they understand this issue and @cortinico has already commented like this: #45054 (comment)
Folks, unless you want to build React Native from source, you will have to wait for these changes to be made. |
Just a small update: I'm discussing with @Kudo (Expo) and folks at Google to understand the impact/urgency of this. This change will require NDK 27 which got released several weeks ago and definitely won't land in React Native 0.75. Future versions (0.76 or 0.77) are up for debate. The crucial bit for us to understand is wether devices on Android 15 will have the 16K support enabled by default or not, but it doesn't seems to be the case. I'll update here as we know more. |
Just found this thread. 16KB support is planned for later this year as we are waiting for more details from Google and it is not a requirement for Android 15. I'll post an update as we get more clarity on what we need to do. |
It's important SDKs like React are available before developers start trying this out. They are depending on SDKs such as this. I want to mention, NDK r27 is not strictly necessary for this. You can use earlier NDKs. What NDK r27 offers is two things: libc++_shared.so prebuilt is aligned, and it has an option to undefine PAGE_SIZE for you. If you are using earlier versions of NDKs, you can still grep for PAGE_SIZE or delete it from the NDK headers as a local test, and that should get you past most if any page size assumptions the code has. For older versions of the NDK, you can also get updated libc++_shared.so from our CI (or use a static libc++): If you can get it working on 16 KB and prove there are no other major runtime issues, I think that would be perfect to inform work estimates. I'm not too familiar with the React Native architecture, but Hermes is probably the biggest risk, since VMs may make page size assumptions. So, getting to the point that you can run that on a 16 KB device is probably the most important step to understanding if there is more work here beyond a recompile.
Confirming, it won't be by default. |
Hello, my app compile and run well on pixel8 android 15 qpr1 pagesize 16kb. But, when i build aab and upload to google play. I cannot download the app from google play, error lib not aligned on apk, stuck at 100% |
Google published a few more details in a blog post if that can help: https://android-developers.googleblog.com/2024/08/adding-16-kb-page-size-to-android.html |
I'm recompiling a native .so library for my own Android app. I recompiled the library by adding: LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384" in Android.mk APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true in Application.mk Then "make init" and "make" and now my App is working with Android 15 and Page size 15kb mode activated, with Android Studio Koala. But, when launching Build AAB (signed) from Android Studio Koala, uploading the app to Google Play then downloading the app, i get the following errors: 09-03 22:26:02.654 1336 1697 E NativeLibraryHelper: Library 'libsqlc-native-driver.so' is not PAGE(16384)-aligned - will not be able to open it directly from apk. 09-03 22:26:02.654 1336 1697 W NativeHelper: Failure copying native libraries [errorCode=-2] 09-03 22:26:02.654 1336 1697 D PackageInstallerSession: Marking session 1857550392 as failed: INSTALL_FAILED_INVALID_APK: Failed to extract native libraries, res=-2 Do you know please how I can solve this issue ? The .so lib seems correctly aligned (at least before build): ./libsqlc-native-driver.so: ALIGNED (2**14) |
@hooliapps I don't this may the right place to ask generic 16KB page size support issues. Anyway React Native does use native libraries and they do not yet support 16KB page size so you may still run into issues if you are using React Native. |
This specific issue is due to zip alignment. As of today, please follow these instructions: |
You may need to validate the alignment of the APK file. For more information, see See https://developer.android.com/tools/zipalign
|
Hello Thanks for your response. But i still have questions about zipalign:
Best regards |
You need to upgrade to AGP >= 8.5.1. Please see instructions here: It will tell you exactly what is needed! |
Hello Finally, i resolved the problem by adding this in /app/build.gradle, under android { block: I didnt changed anything else, sdk 34. |
Yes, useLegacyPackaging also resolves the bundle alignment issue at the cost of slightly increased disk space usage since both the compressed and the uncompressed copies of .so files in your APK will be stored on an Android device when your application is installed. If this option is not specified and you use AGP 8.5.1+ instead, then disk space will only be used for the uncompressed copy, and there will be no compressed copy. Thank you! |
I have question about alignement. It's ok ? |
Yes, 4->16 and 64->16 are both okay. It will be many years, if ever, before aligning to the 64k size is feasible in the Android ecosystem. I would not worry about it. |
Thanks for your response. |
Hey - so what's left here to make React Native work with 16 KB pages? :D |
We need to update the following libraries which are not yet supporting 16K pages:
We'll update here once those libraries are fully migrated |
Hey folks, we are going to get started on 16KB page size support work soon. It does involve updating bunch of libraries we depend on as @cortinico listed and may take sometime to migrate everything. It will be too late to ship this with 0.76 release and hope we can make this into 0.77 release. |
Is there anything we can do to help? |
React Native was updated so native library dependencies are now 16KB page size aligned. (cc @smore-lore @bc-lee) |
Great to hear! Has JSC also been updated or just Hermes? |
@saghul Nope. JSC won't be updated to 16K support in the immediate future. You can follow further on the issue you opened here: |
Thanks for clarifying! |
I create project with the latest react native version. Its clean project. From Android Studio i start Emulator with 16KB size page, the project build successfully, but when open crash. Any suggestions? "dependencies": { |
@ToniNikolaev23 You need to wait for 0.77. |
As comment from @alanleedev you need to use nightly builds. |
Nice work everyone! Tested this on android API35 16kb pagesize emulator with my automated build verifier for react-native-firebase using the nightlies and everything worked. It definitely reproduces the expected crash on react-native 0.76.x so I believe it's a valid test, and it passes. (honestly: I'm relieved to see all the firebase stuff does as well 😅 ) https://github.com/mikehardy/rnfbdemo/blob/rn77/make-demo.sh new arch enabled Cheers |
@ToniNikolaev23 As others have pointed out, 16KB page size support is only available in the nightly builds and will be released in 0.77. |
Description
Android 15 offers an option for OEMs to use a 16KB page size for better performance [1]. This change is significant, as all shared objects (
.so
files in APKs) must be recompiled with the new page size. According to the Android team [2][3], 16KB page size compatibility will be required for app uploads to the Play Store next year (2025).It seems that React-Native is not compatible with the 16KB page size. If I try to run a React-Native project on an emulator with a 16KB page size, I get the following error in the logcat:
I checked all shared objects in the APK using my script check_elf_page_size.py and found that all shared objects use a 4KB page size.
$ check_elf_page_size.py android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/*.so Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libc++_shared.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libexpo-modules-core.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libfabricjni.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libfbjni.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libfolly_runtime.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libgifimage.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libglog.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libhermes.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libhermes_executor.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libhermesinstancejni.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libimagepipeline.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libjscinstance.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libjsi.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libjsijniprofiler.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libjsinspector.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libmapbufferjni.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libnative-filters.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libnative-imagetranscoder.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreact_codegen_rncore.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreact_cxxreactpackage.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreact_debug.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreact_devsupportjni.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreact_featureflags.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreact_featureflagsjni.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreact_nativemodule_core.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreact_newarchdefaults.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreact_render_componentregistry.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreact_render_core.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreact_render_debug.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreact_render_element.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreact_render_graphics.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreact_render_imagemanager.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreact_render_mapbuffer.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreact_utils.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreactnativeblob.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreactnativejni.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreactperfloggerjni.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreanimated.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/librninstance.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/librnscreens.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/librrc_image.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/librrc_legacyviewmanagerinterop.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/librrc_view.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libruntimeexecutor.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libstatic-webp.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libturbomodulejsijni.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libuimanagerjni.so: 4096 Page Size of android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libyoga.so: 4096
(Of course, one can manually check the page size of each shared object using the
readelf -Wl
command.)I think React-Native should support the 16KB page size for the future.
[1] https://developer.android.com/guide/practices/page-sizes
[2] https://android-developers.googleblog.com/2024/05/the-second-beta-of-android-15.html
[3] https://issuetracker.google.com/issues/346830813#comment3
Steps to reproduce
npx react-native init
.npx expo run:android
.React Native Version
0.74.2
Affected Platforms
Runtime - Android
Output of
npx react-native info
Stacktrace or Logs
Reproducer
npx create-expo-app@latest
Screenshots and Videos
The text was updated successfully, but these errors were encountered: