Closed brewin closed 3 years ago
I'm experiencing the same issue also on Android version 10 and 11, mostly on Samsung devices, and with SoLoader v0.10.1.
Based on the stack trace, it seems it's related to the creation of the FileOutputStream inside the FileLocker class when using the dso_lock file. I'm no expert on Android, but it seems weird since it's writing to an internal storage dir, right? But it still throws a permission denied error.
Here is the stack trace (redacted app name):
java.lang.RuntimeException: Unable to create application com.example.myapp.MainApplication: java.lang.RuntimeException: java.io.FileNotFoundException: /data/user/0/com.example.myapp/lib-0/dso_lock: open failed: EACCES (Permission denied)
at android.app.ActivityThread.handleMakeApplication(ActivityThread.java:7132)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7077)
at android.app.ActivityThread.access$1500(ActivityThread.java:273)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2096)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:8107)
at java.lang.reflect.Method.invoke(Method.java:-2)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
Caused by: java.lang.RuntimeException: java.io.FileNotFoundException: /data/user/0/com.example.myapp/lib-0/dso_lock: open failed: EACCES (Permission denied)
at com.facebook.soloader.SoLoader.init(SoLoader.java:219)
at com.example.myapp.MainApplication.onCreate(MainApplication.java:54)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1190)
at android.app.ActivityThread.handleMakeApplication(ActivityThread.java:7127)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7077)
at android.app.ActivityThread.access$1500(ActivityThread.java:273)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2096)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:8107)
at java.lang.reflect.Method.invoke(Method.java:-2)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
Caused by: java.io.FileNotFoundException: /data/user/0/com.example.myapp/lib-0/dso_lock: open failed: EACCES (Permission denied)
at libcore.io.IoBridge.open(IoBridge.java:496)
at java.io.FileOutputStream.<init>(FileOutputStream.java:235)
at java.io.FileOutputStream.<init>(FileOutputStream.java:186)
at com.facebook.soloader.FileLocker.<init>(FileLocker.java:36)
at com.facebook.soloader.FileLocker.lock(FileLocker.java:32)
at com.facebook.soloader.UnpackingSoSource.prepare(UnpackingSoSource.java:430)
at com.facebook.soloader.SoLoader.initSoSources(SoLoader.java:327)
at com.facebook.soloader.SoLoader.init(SoLoader.java:207)
at com.facebook.soloader.SoLoader.init(SoLoader.java:189)
at com.facebook.soloader.SoLoader.init(SoLoader.java:217)
at com.example.myapp.MainApplication.onCreate(MainApplication.java:54)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1190)
at android.app.ActivityThread.handleMakeApplication(ActivityThread.java:7127)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7077)
at android.app.ActivityThread.access$1500(ActivityThread.java:273)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2096)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:8107)
at java.lang.reflect.Method.invoke(Method.java:-2)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
at libcore.io.Linux.open(Linux.java:-2)
at libcore.io.ForwardingOs.open(ForwardingOs.java:167)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:252)
at libcore.io.ForwardingOs.open(ForwardingOs.java:167)
at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:7984)
at libcore.io.IoBridge.open(IoBridge.java:482)
at java.io.FileOutputStream.<init>(FileOutputStream.java:235)
at java.io.FileOutputStream.<init>(FileOutputStream.java:186)
at com.facebook.soloader.FileLocker.<init>(FileLocker.java:36)
at com.facebook.soloader.FileLocker.lock(FileLocker.java:32)
at com.facebook.soloader.UnpackingSoSource.prepare(UnpackingSoSource.java:430)
at com.facebook.soloader.SoLoader.initSoSources(SoLoader.java:327)
at com.facebook.soloader.SoLoader.init(SoLoader.java:207)
at com.facebook.soloader.SoLoader.init(SoLoader.java:189)
at com.facebook.soloader.SoLoader.init(SoLoader.java:217)
at com.example.myapp.MainApplication.onCreate(MainApplication.java:54)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1190)
at android.app.ActivityThread.handleMakeApplication(ActivityThread.java:7127)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7077)
at android.app.ActivityThread.access$1500(ActivityThread.java:273)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2096)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:8107)
at java.lang.reflect.Method.invoke(Method.java:-2)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
Experiencing the same exact problem with Andriod 10 and 11. Any new insights on that? it started after upgrading react-native from 0.62 to 0.64.0
I still don't know what causes this, but I worked around the issue by using the system loader when SoLoader fails. I started using SoLoader because the system loader was causing crashes on some devices. Using them both seems to have resolved all issues related to loading the native library, or at least I'm no longer getting any crash reports.
This code will be slightly different depending on what native library you're trying to load. LibraryLoader
is part of the Mapbox SDK.
val useSoLoader = try {
SoLoader.init(this, false)
true
} catch (e: Exception) {
false
}
LibraryLoader.setLibraryLoader(object : LibraryLoader() {
override fun load(name: String?) {
if (useSoLoader) {
try {
SoLoader.loadLibrary(name!!)
} catch (e: Exception) {
System.loadLibrary(name!!)
}
} else {
System.loadLibrary(name!!)
}
}
})
Thanks for sharing your workaround @brewin . I have some questions though. Are you using react native or is it a native Android app? I'm trying to figure how would this apply to MainApplication.onCreate() since I cannot see that the "load" function would get called anywhere. From what I understand SoLoader.init would already load each library on its own right?
I have some questions though. Are you using react native or is it a native Android app?
It's a native Android app.
I'm trying to figure how would this apply to MainApplication.onCreate() since I cannot see that the "load" function would get called anywhere. From what I understand SoLoader.init would already load each library on its own right?
Unless React Native has a way to set the library loader like Mapbox does, you probably can't use this workaround.
It is becoming a big issue in our application which is in production. Did anyone manage to find a workaround?
Is it essential to include soloader for react-native apps? is there an alternative?
Any help with that will be very much appreciated :)
I recently upgraded to react-native 0.66 and I started noticing the following launch crash:
java.lang.RuntimeException:
at android.app.ActivityThread.handleBindApplication (ActivityThread.java:7532)
at android.app.ActivityThread.access$1500 (ActivityThread.java:301)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2150)
at android.os.Handler.dispatchMessage (Handler.java:106)
at android.os.Looper.loop (Looper.java:246)
at android.app.ActivityThread.main (ActivityThread.java:8587)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1130)
Caused by: java.lang.RuntimeException:
at com.facebook.soloader.SoLoader.init (SoLoader.java:219)
at com.reactnativenavigation.NavigationApplication.onCreate (NavigationApplication.java:26)
at com.acuityscheduling.app.android.MainApplication.onCreate (MainApplication.java:116)
at android.app.Instrumentation.callApplicationOnCreate (Instrumentation.java:1192)
at android.app.ActivityThread.handleBindApplication (ActivityThread.java:7527)
Caused by: java.io.FileNotFoundException:
at libcore.io.IoBridge.open (IoBridge.java:492)
at java.io.FileOutputStream.<init> (FileOutputStream.java:236)
at java.io.FileOutputStream.<init> (FileOutputStream.java:186)
at com.facebook.soloader.FileLocker.<init> (FileLocker.java:36)
at com.facebook.soloader.FileLocker.lock (FileLocker.java:32)
at com.facebook.soloader.UnpackingSoSource.prepare (UnpackingSoSource.java:430)
at com.facebook.soloader.SoLoader.initSoSources (SoLoader.java:327)
at com.facebook.soloader.SoLoader.init (SoLoader.java:207)
at com.facebook.soloader.SoLoader.init (SoLoader.java:189)
at com.facebook.soloader.SoLoader.init (SoLoader.java:217)
Caused by: android.system.ErrnoException:
at libcore.io.Linux.open (Native Method)
at libcore.io.ForwardingOs.open (ForwardingOs.java:166)
at libcore.io.BlockGuardOs.open (BlockGuardOs.java:254)
at libcore.io.ForwardingOs.open (ForwardingOs.java:166)
at android.app.ActivityThread$AndroidOs.open (ActivityThread.java:8448)
at libcore.io.IoBridge.open (IoBridge.java:478)
It's the most common crash reason on our production app, and I've never experienced it locally. I'm trying to figure out what file the soloader is missing and thus this crash happens.
By following the stacktrace it looks like it all starts here:
https://github.com/facebook/SoLoader/blob/v0.9.0/java/com/facebook/soloader/UnpackingSoSource.java#L410-L411
where it's trying to load the following file:
dso_lock
(=LOCK_FILE_NAME) from the soDirectory.
Does anyone have any more insight as to what file that dso_lock
file is, and why it may not be found?
p.s: For us this only seems to be happening on Android 11 (SDK 30).
I recently upgraded to react-native 0.66 and I started noticing the following launch crash:
java.lang.RuntimeException: at android.app.ActivityThread.handleBindApplication (ActivityThread.java:7532) at android.app.ActivityThread.access$1500 (ActivityThread.java:301) at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2150) at android.os.Handler.dispatchMessage (Handler.java:106) at android.os.Looper.loop (Looper.java:246) at android.app.ActivityThread.main (ActivityThread.java:8587) at java.lang.reflect.Method.invoke (Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1130) Caused by: java.lang.RuntimeException: at com.facebook.soloader.SoLoader.init (SoLoader.java:219) at com.reactnativenavigation.NavigationApplication.onCreate (NavigationApplication.java:26) at com.acuityscheduling.app.android.MainApplication.onCreate (MainApplication.java:116) at android.app.Instrumentation.callApplicationOnCreate (Instrumentation.java:1192) at android.app.ActivityThread.handleBindApplication (ActivityThread.java:7527) Caused by: java.io.FileNotFoundException: at libcore.io.IoBridge.open (IoBridge.java:492) at java.io.FileOutputStream.<init> (FileOutputStream.java:236) at java.io.FileOutputStream.<init> (FileOutputStream.java:186) at com.facebook.soloader.FileLocker.<init> (FileLocker.java:36) at com.facebook.soloader.FileLocker.lock (FileLocker.java:32) at com.facebook.soloader.UnpackingSoSource.prepare (UnpackingSoSource.java:430) at com.facebook.soloader.SoLoader.initSoSources (SoLoader.java:327) at com.facebook.soloader.SoLoader.init (SoLoader.java:207) at com.facebook.soloader.SoLoader.init (SoLoader.java:189) at com.facebook.soloader.SoLoader.init (SoLoader.java:217) Caused by: android.system.ErrnoException: at libcore.io.Linux.open (Native Method) at libcore.io.ForwardingOs.open (ForwardingOs.java:166) at libcore.io.BlockGuardOs.open (BlockGuardOs.java:254) at libcore.io.ForwardingOs.open (ForwardingOs.java:166) at android.app.ActivityThread$AndroidOs.open (ActivityThread.java:8448) at libcore.io.IoBridge.open (IoBridge.java:478)
It's the most common crash reason on our production app, and I've never experienced it locally. I'm trying to figure out what file the soloader is missing and thus this crash happens.
By following the stacktrace it looks like it all starts here: https://github.com/facebook/SoLoader/blob/v0.9.0/java/com/facebook/soloader/UnpackingSoSource.java#L410-L411 where it's trying to load the following file:
dso_lock
(=LOCK_FILE_NAME) from the soDirectory.Does anyone have any more insight as to what file that
dso_lock
file is, and why it may not be found?p.s: For us this only seems to be happening on Android 11 (SDK 30).
Same for me on react-native 0.66
This comment may help -- https://github.com/facebook/flipper/issues/2213#issuecomment-952141230
Based on this thread, I'm adding
override fun onCreate() {
super.onCreate();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// https://github.com/facebook/flipper/issues/2213:
// in case read/write permissions are somehow still revoked by backup system, attempt to restore them here
try {
File("${this.dataDir}/lib-main").setWritable(true, true)
File("${this.dataDir}/lib-main").setReadable(true, true)
} catch (e: Exception) {
Timber.e("Exception trying to apply permissions: ${e.localizedMessage}")
}
}
SoLoader.init(this, false)
}
My app is getting this issue in production, which doesn't use Flipper at all. Based on https://github.com/facebook/flipper/issues/2213#issuecomment-952141230, this is the only recommendation that might fix it. Please update soloader, see https://github.com/facebook/SoLoader/issues/74#issuecomment-961986593
This comment may help -- facebook/flipper#2213 (comment)
Interesting @wildseansy! Please let us know here if you get it solved in production!
This error also happens on Android 12 and I have more than 2k crashes related to this and a lots of bad reviews. Any updates?
@wildseansy did it solve?
Thanks
Still in our release pipeline, releasing thurs-fri, will keep posted
Hi guys just an update:
The File setWritable solution didn't work for me. With the new soloader 0.10.2 worked on Android 12 but now I'm facing new errors on my phone.
With soloader 0.10.3 issue is fixed! Nice work!
With soloader 0.10.3 issue is fixed! Nice work!
That's hopeful to hear. Pushing out a new release of my React Native app with the following
// android/app/build.gradle
configurations.all {
resolutionStrategy {
force "com.facebook.soloader:soloader:0.10.3"
}
}
Gradle force versioning is deprecated link You can use strict versioning
implementation('com.facebook.soloader:soloader:0.10.3') {
version {
strictly '0.10.3'
}
}
Gradle force versioning is deprecated link You can use strict versioning
Thanks for letting me know! Will do.
Pretty sure you can just update your gradle.properties to include
SO_LOADER_VERSION=0.10.3
This was helpful for me too, seeing the changes: https://github.com/facebook/SoLoader/releases
Thanks for flagging the new release @mym0404 🙏
I will close this issue due to 0.10.3 should fix the crash. let me know if it doesn't work. thanks guys.
Updating gradle.properties
didn't actually correctly update the version for my project. There may be a RN node_modules dependency that might be overriding it in my case, I'm not totally sure. This is what I did to resolve the version for my project
// gradle.properties
SO_LOADER_VERSION=0.10.3
// app/build.gradle
configurations.all {
resolutionStrategy {
eachDependency { details ->
if (details.requested.group == 'com.facebook.soloader') {
//https://github.com/facebook/SoLoader/issues/74#issuecomment-961986593
switch (details.requested.name) {
case 'soloader':
details.useVersion SO_LOADER_VERSION
break
}
}
}
}
}
Pretty sure you can just update your gradle.properties to include
SO_LOADER_VERSION=0.10.3
This was helpful for me too, seeing the changes: https://github.com/facebook/SoLoader/releases
Thanks for flagging the new release @mym0404 🙏
Shouldn't RN update it's own dependency to SO loader?
@wildseansy in the file where to put this code? I mean in android or in dependency?
@MuhammadRafeh in your Android app/build.gradle
I'm getting crash reports for an app using SoLoader v0.10.1. The reports are coming from devices running Android 10 and 11. The app is published as an AAB (Android App Bundle), which may or may not be related to the problem. I'm wondering if these exceptions are happening when users try to install the app on an incompatible architecture as described in this comment. So this might not be a bug, but I don't know for sure. All the reports are from new high-end devices like the Galaxy S21, which might indicate that the users are technically savvy enough to sideload APKs.