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

SoLoader not compatible with uncompressed native libraries Android feature #30

Closed
plecesne opened this issue Mar 4, 2019 · 5 comments
Closed

Comments

@plecesne
Copy link

plecesne commented Mar 4, 2019

I work on the Android App Bundle, and we're getting a raising number of developers reporting crash reports when trying to load native libraries with Facebook's SoLoader.

I've tried to trace what the SoLoader does and I may have gotten it wrong, but it seems that it expects the native libraries to be extracted from the APKs during the installation (at least in some circumstances which I couldn't pin-point precisely).

However, since Android Studio 3.3 (and bundletool 0.6.0), when building an Android App Bundle, native libraries are no longer extracted from the APK during the installation due to a feature called "uncompressed native libraries" of the Android platform introduced in Android M which allows the native libraries to remain uncompressed in the APK so that the platform doesn't have to make a copy on the device before reading them.

@passy
Copy link
Member

passy commented Mar 5, 2019

Hi @plecesne, thanks for reaching out. Can you confirm that this is still happening with 0.6.0? I was under the impression that the PR #26 should have fixed exactly that issue.

@plecesne
Copy link
Author

plecesne commented Mar 5, 2019

PR #26 seems only related to support of split APKs, i.e. the fact that the native libraries are in a separate APK.
What I'm mentioning is the fact that the native libraries are not extracted from the APK at installation time for App Bundles built from Gradle 3.3 (for devices on M+), hence any attempt at loading the libraries differently than System.load or System.loadLibrary, such as trying to locate them in the install directory (e.g. new File(<install-dir>/libxxx.so) like I see here) will lead to a crash or at least a file not found.

@lucalooz
Copy link

lucalooz commented Mar 5, 2019

Today I have investigated the exact same issue and it seems that with 0.6.0 it's already solved.

We're using react-native 0.56.0 and we've encountered the issue when we upgraded the gradle plugin from 3.2.1 to 3.3.x.

react-native 0.56.0 depends on SoLoader 0.3.0 and unfortunately for some ABI changes introduced in 0.5.0 I cannot force the 0.6.0 version.

This seems to happen only when using App Bundle with gradle plugin 3.3.x and SoLoader < 0.6.0.

We have temporarily reverted to gradle plugin 3.2.1 while waiting to be able to upgrade react-native.

@plecesne
Copy link
Author

plecesne commented Mar 5, 2019

Great to know, thanks!
Do you know by any chance in which release react-native depends on SoLoader 0.6.0? Otherwise, I can chase that information on react-native GitHub project.

@iain-merrick-fanduel
Copy link

It looks like the fix for this bug was to extract libraries from the APK(s) manually.

Is that correct?

If so, that doesn't seem like a great solution, as it adds more startup time (especially on first launch when the .so files are extracted) and uses more storage space. Is it not possible just to load uncompressed libraries directly from the APK, as is standard since Android M?

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

No branches or pull requests

4 participants