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

Failure to open a Realm file on Android 14 #7037

Open
nirinchev opened this issue Oct 6, 2023 · 14 comments
Open

Failure to open a Realm file on Android 14 #7037

nirinchev opened this issue Oct 6, 2023 · 14 comments

Comments

@nirinchev
Copy link
Member

Reported in realm/realm-dotnet#3458, looks like we have an issue when using flock on Android 14:

2023-10-05 11:59:42 [error]: Realms.Exceptions.RealmException: flock() failed: Function not implemented (38)
2023-10-05 11:59:42 [error]: at Realms.NativeException.ThrowIfNecessary()
2023-10-05 11:59:42 [error]: at Realms.SharedRealmHandle.Open(Configuration configuration)
2023-10-05 11:59:42 [error]: at Realms.RealmConfiguration.CreateHandle(Configuration& configuration)
2023-10-05 11:59:42 [error]: at Realms.RealmConfigurationBase.CreateRealm()
2023-10-05 11:59:42 [error]: at Realms.Realm.GetInstance(RealmConfigurationBase config)
2023-10-05 11:59:42 [error]: at osu.Game.Database.RealmAccess.getRealmInstance()
2023-10-05 11:59:42 [error]: at osu.Game.Database.RealmAccess.prepareFirstRealmAccess()
@kiburtse
Copy link
Contributor

kiburtse commented Oct 6, 2023

So, which path is used for realm? How it was requested from the platform api? Did the open worked under the same path with android <= 13?

@nirinchev
Copy link
Member Author

@peppy does this reproduce for you on an emulator or only a physical device? I've tried setting up an emulator and opening a Realm and this works just fine, but it's possible there's something about the way Osu! does it that is different. If this only reproduces on a physical device, it'll be a bit of a bummer as we'll need to find one with Android 14.

@peppy
Copy link

peppy commented Oct 8, 2023

I don't actually have a device which is capable of android 14, and this was reported by a user. I've requested further details and will loop back.

@TymanWasTaken
Copy link

I can also reproduce on a physical Pixel 7 Pro running android 14 (this is my own kotlin-based android app):

/Users/realm/workspace-realm-kotlin/releases/packages/external/core/src/realm/util/file.cpp:1101: [realm-core-13.17.0] Assertion failed: r == 0 && "File::unlock()" with (r, (*__errno())) =  [-1, 38]
                                                                                                    <backtrace not supported on this platform>
                                                                                                    !!! IMPORTANT: Please report this at https://github.com/realm/realm-core/issues/new/choose
Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 28469 (ch.tyman.scalar), pid 28469 (ch.tyman.scalar)

If you need any extra information I would be glad to help

@ironage
Copy link
Contributor

ironage commented Oct 12, 2023

We don't have the actual file path here (we should add this to our exception message) but it could be an android security limitation when using external storage as mentioned here #6028 (comment)

@kiburtse
Copy link
Contributor

Most likely it's still the same issues as #6912, just triggered later now since the realm-core v13.20.1 underneath contains fix #6926

@TymanWasTaken Starting with realm-core v13.20.1 you shouldn't see this assertion, but rather an exception for unlock. Could you tell which path and partition from android are used for realm?

@TymanWasTaken
Copy link

Most likely it's still the same issues as #6912, just triggered later now since the realm-core v13.20.1 underneath contains fix #6926

@TymanWasTaken Starting with realm-core v13.20.1 you shouldn't see this assertion, but rather an exception for unlock. Could you tell which path and partition from android are used for realm?

By the way, I just tested on both io.realm.kotlin:library-base:1.10.2 and io.realm.kotlin:library-base:1.11.1 both just to be sure it wasn't fixed in the newer version, and it was not (which makes sense, 1.11.1 doesn't appear to use the realm-core version you specified)

In addition, for some odd reason when my phone is running KernelSU, this error magically never happens. My app launches fine, and nothing gets shown in the logcat. However, when I re-flash my phone's stock boot image rather than the modified one, it starts happening again. I have no clue why that happens, and I'm not sure it's helpful at all, but it confused me for a minute because the error randomly stopped happening.

To answer your question however, /storage/emulated/0/Android/data/tech.tyman.scalar/files/repo is the full configured path, located in my app's designated "exernal files" directory, retrieved with context.getExternalFilesDir("repo")

@cmelchior
Copy link
Contributor

cmelchior commented Oct 13, 2023

Hi @TymanWasTaken External Storage does not work with Realm from Android 11 due to the way Google implemented scoped storage: https://developer.android.com/about/versions/11/privacy/storage

After this change, they only allow opening files on external storage using dedicated APIs that are incompatible with Realm.

I'm not familiar with KernelSU, but most likely it is either based on an older version of Android or these security settings are disabled there.

This unfortunately means that using Realm past Android 10 requires that the Realm is stored in the app's internal files directory context.getFiles().

You can still use the external storage, but only for backups of the file, not for normal use. You can also read more here: #6028 (comment)

@DMarf
Copy link

DMarf commented Oct 13, 2023

I can reproduce the same issue as @TymanWasTaken on a Google Pixel 6 running Android 14, using applicationContext.getExternalFilesDir(null) for the path.

@cmelchior My app has been working fine on Android 11, 12, and 13. It only started failing on Android 14. Did something else change with scoped storage on Android 14? Otherwise, I can't see how the scoped storage changes introduced in Android 11 can be the cause since my app worked in Android 11, 12, and 13.

@DMarf
Copy link

DMarf commented Oct 18, 2023

There seems to be a misconception that Realm has not worked with external storage since Android 11 due to scoped storage. While true that Realm won't work at arbitrary locations in external storage, the app-specific directory on external storage is compatible with scoped storage and has worked for Realm in Android 11, 12, and 13. Realm is part of the app and has access to the app-specific directory.

The app-specific directory on external storage can be retrieved using the getExternalFilesDir() method of the application context. For the hello-jni sample app in the NDK (with minor modification) it returns "/storage/emulated/0/Android/data/com.example.hellojni/files" on my Pixel 6 device.

The getExternalStorageDirectory() method of the Environment object is easily confused with the getExternalFilesDir() method of the application context but is not the same thing. It provides the primary external shared directory, not the application-specific external directory. On the same Pixel 6 device it returns "/storage/emulated/0".

So, while a realm in a subdirectory of getExternalFilesDir() should work, a realm in a subdirectory of getExternalStorageDirectory() only works to the extent the user has manually added the "Android/data/com.example.hellojni/files" path elements.

The problem of using Realm in application-specific external storage is new to Android 14 and related to flock() no longer working. There is an issue in for this with Android https://issuetracker.google.com/issues/304123373. I'd suggest all facing this problem upvote the issue.

@gvravikumar
Copy link

@peppy does this reproduce for you on an emulator or only a physical device? I've tried setting up an emulator and opening a Realm and this works just fine, but it's possible there's something about the way Osu! does it that is different. If this only reproduces on a physical device, it'll be a bit of a bummer as we'll need to find one with Android 14.

I can reproducible this issue in
image
Here is the backtrace

backtrace:
#00 pc 0000000000061610 /apex/com.android.runtime/lib64/bionic/libc.so (abort+192) (BuildId: fa337969c798946280caa45e2d71a2e7)
#1 pc 00000000007abe55 /data/app/~~Tugksqc8fjmLze6TfGYcKQ==/com.example.myapp-s6mbxzBYJfVWv-ZS2CDWvA==/lib/x86_64/librealm-jni.so (BuildId: 2f01f32865e01e2dc1e3b79d5b2425a0caacf079)
#2 pc 00000000007ac18b /data/app/~~Tugksqc8fjmLze6TfGYcKQ==/com.example.myapp-s6mbxzBYJfVWv-ZS2CDWvA==/lib/x86_64/librealm-jni.so (BuildId: 2f01f32865e01e2dc1e3b79d5b2425a0caacf079)
#3 pc 00000000007ac370 /data/app/~~Tugksqc8fjmLze6TfGYcKQ==/com.example.myapp-s6mbxzBYJfVWv-ZS2CDWvA==/lib/x86_64/librealm-jni.so (BuildId: 2f01f32865e01e2dc1e3b79d5b2425a0caacf079)
#4 pc 0000000000799059 /data/app/~~Tugksqc8fjmLze6TfGYcKQ==/com.example.myapp-s6mbxzBYJfVWv-ZS2CDWvA==/lib/x86_64/librealm-jni.so (BuildId: 2f01f32865e01e2dc1e3b79d5b2425a0caacf079)
#5 pc 0000000000796c91 /data/app/~~Tugksqc8fjmLze6TfGYcKQ==/com.example.myapp-s6mbxzBYJfVWv-ZS2CDWvA==/lib/x86_64/librealm-jni.so (BuildId: 2f01f32865e01e2dc1e3b79d5b2425a0caacf079)
#6 pc 00000000006dd9fd /data/app/~~Tugksqc8fjmLze6TfGYcKQ==/com.example.myapp-s6mbxzBYJfVWv-ZS2CDWvA==/lib/x86_64/librealm-jni.so (BuildId: 2f01f32865e01e2dc1e3b79d5b2425a0caacf079)
#7 pc 00000000006e2bf4 /data/app/~~Tugksqc8fjmLze6TfGYcKQ==/com.example.myapp-s6mbxzBYJfVWv-ZS2CDWvA==/lib/x86_64/librealm-jni.so (BuildId: 2f01f32865e01e2dc1e3b79d5b2425a0caacf079)
#8 pc 0000000000569f8f /data/app/~~Tugksqc8fjmLze6TfGYcKQ==/com.example.myapp-s6mbxzBYJfVWv-ZS2CDWvA==/lib/x86_64/librealm-jni.so (BuildId: 2f01f32865e01e2dc1e3b79d5b2425a0caacf079)
#9 pc 000000000056866d /data/app/~~Tugksqc8fjmLze6TfGYcKQ==/com.example.myapp-s6mbxzBYJfVWv-ZS2CDWvA==/lib/x86_64/librealm-jni.so (BuildId: 2f01f32865e01e2dc1e3b79d5b2425a0caacf079)
#10 pc 0000000000539497 /data/app/~~Tugksqc8fjmLze6TfGYcKQ==/com.example.myapp-s6mbxzBYJfVWv-ZS2CDWvA==/lib/x86_64/librealm-jni.so (BuildId: 2f01f32865e01e2dc1e3b79d5b2425a0caacf079)
#11 pc 00000000004b1007 /data/app/~~Tugksqc8fjmLze6TfGYcKQ==/com.example.myapp-s6mbxzBYJfVWv-ZS2CDWvA==/lib/x86_64/librealm-jni.so (Java_io_realm_internal_OsSharedRealm_nativeGetSharedRealm+135) (BuildId: 2f01f32865e01e2dc1e3b79d5b2425a0caacf079)
#12 pc 0000000000391a4b /apex/com.android.art/lib64/libart.so (art_quick_generic_jni_trampoline+219) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#13 pc 0000000000378826 /apex/com.android.art/lib64/libart.so (art_quick_invoke_static_stub+806) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#14 pc 00000000003c538f /apex/com.android.art/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+255) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#15 pc 000000000056ea47 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+1831) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#16 pc 000000000039b2f7 /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp(art::interpreter::SwitchImplContext*)+17767) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#17 pc 00000000003937a5 /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+5) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#18 pc 0000000000f91d98 anonymous:772103cd0000 (io.realm.internal.OsSharedRealm.+0)
#19 pc 0000000000566017 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238)+647) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#20 pc 000000000056d13e /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+110) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#21 pc 000000000056ddb6 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+2054) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#22 pc 000000000039ae32 /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp(art::interpreter::SwitchImplContext*)+16546) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#23 pc 00000000003937a5 /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+5) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#24 pc 0000000000f91a6c anonymous:772103cd0000 (io.realm.internal.OsSharedRealm.getInstance+0)
#25 pc 0000000000566017 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238)+647) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#26 pc 000000000056d13e /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+110) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#27 pc 000000000056ddb6 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+2054) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#28 pc 000000000039b0a1 /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp(art::interpreter::SwitchImplContext*)+17169) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#29 pc 00000000003937a5 /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+5) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#30 pc 0000000000f4c520 anonymous:772103cd0000 (io.realm.BaseRealm.+0)
#31 pc 0000000000566017 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238)+647) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#32 pc 000000000056d13e /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+110) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#33 pc 000000000056ddb6 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+2054) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#34 pc 000000000039ae32 /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp(art::interpreter::SwitchImplContext*)+16546) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#35 pc 00000000003937a5 /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+5) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#36 pc 0000000000f4c4ec anonymous:772103cd0000 (io.realm.BaseRealm.+0)
#37 pc 0000000000566017 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238)+647) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#38 pc 000000000056d13e /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+110) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#39 pc 000000000056ddb6 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+2054) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#40 pc 000000000039ae32 /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp(art::interpreter::SwitchImplContext*)+16546) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#41 pc 00000000003937a5 /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+5) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#42 pc 0000000000f80768 anonymous:772103cd0000 (io.realm.Realm.+0)
#43 pc 0000000000566017 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238)+647) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#44 pc 000000000056d13e /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+110) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#45 pc 000000000056ddb6 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+2054) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#46 pc 000000000039ae32 /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp(art::interpreter::SwitchImplContext*)+16546) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#47 pc 00000000003937a5 /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+5) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#48 pc 0000000000f7ef9c anonymous:772103cd0000 (io.realm.Realm.createInstance+0)
#49 pc 0000000000566017 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238)+647) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#50 pc 000000000056d13e /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+110) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#51 pc 000000000056ddb6 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+2054) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#52 pc 000000000039b0a1 /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp(art::interpreter::SwitchImplContext*)+17169) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#53 pc 00000000003937a5 /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+5) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#54 pc 0000000000f68940 anonymous:772103cd0000 (io.realm.RealmCache.createInstance+0)
#55 pc 0000000000566017 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238)+647) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#56 pc 000000000056d13e /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+110) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#57 pc 000000000056ddb6 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+2054) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#58 pc 000000000039ae32 /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp(art::interpreter::SwitchImplContext*)+16546) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#59 pc 00000000003937a5 /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+5) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#60 pc 0000000000f67ee8 anonymous:772103cd0000 (io.realm.RealmCache.doCreateRealmOrGetFromCache+0)
#61 pc 0000000000566017 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238)+647) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#62 pc 000000000056d13e /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+110) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#63 pc 000000000056ddb6 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+2054) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#64 pc 000000000039ae32 /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp(art::interpreter::SwitchImplContext*)+16546) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#65 pc 00000000003937a5 /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+5) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#66 pc 0000000000f67e5c anonymous:772103cd0000 (io.realm.RealmCache.createRealmOrGetFromCache+0)
#67 pc 0000000000566017 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238)+647) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#68 pc 000000000056d13e /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+110) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#69 pc 000000000056ddb6 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+2054) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#70 pc 000000000039b0a1 /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp(art::interpreter::SwitchImplContext*)+17169) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#71 pc 00000000003937a5 /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+5) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#72 pc 0000000000f7f040 anonymous:772103cd0000 (io.realm.Realm.getDefaultInstance+0)
#73 pc 0000000000566017 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238)+647) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#74 pc 000000000056d13e /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+110) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#75 pc 000000000056ddb6 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+2054) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#76 pc 000000000039b0a1 /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp(art::interpreter::SwitchImplContext*)+17169) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#77 pc 00000000003937a5 /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+5) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#78 pc 000000000007d33c /data/data/com.example.myapp/code_cache/.overlay/base.apk/classes10.dex (com.common.ui.base.BaseApplication.onCreate+0)
#79 pc 0000000000566017 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238)+647) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#80 pc 000000000056d13e /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+110) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#81 pc 000000000056ddb6 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+2054) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#82 pc 000000000039ae32 /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp(art::interpreter::SwitchImplContext*)+16546) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#83 pc 00000000003937a5 /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+5) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#84 pc 0000000000016260 /data/data/com.example.myapp/code_cache/.overlay/base.apk/classes24.dex (com.ExampleApplication.onCreate+0)
#85 pc 0000000000566017 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238)+647) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#86 pc 000000000056d13e /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+110) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#87 pc 000000000056ddb6 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+2054) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#88 pc 000000000039ae32 /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp(art::interpreter::SwitchImplContext*)+16546) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#89 pc 00000000003937a5 /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+5) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#90 pc 000000000023a7b8 /system/framework/framework.jar (android.app.Instrumentation.callApplicationOnCreate+0)
#91 pc 0000000000566017 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238)+647) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#92 pc 000000000056d13e /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+110) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#93 pc 000000000056ddb6 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+2054) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#94 pc 000000000039ae32 /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp(art::interpreter::SwitchImplContext*)+16546) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#95 pc 00000000003937a5 /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+5) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#96 pc 00000000001bfb30 /system/framework/framework.jar (android.app.ActivityThread.handleBindApplication+0)
#97 pc 0000000000566017 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238)+647) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#98 pc 000000000056d13e /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+110) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#99 pc 000000000056ddb6 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+2054) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#100 pc 000000000039ae32 /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp(art::interpreter::SwitchImplContext*)+16546) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#101 pc 00000000003937a5 /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+5) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#102 pc 00000000001bcf14 /system/framework/framework.jar (android.app.ActivityThread.-$$Nest$mhandleBindApplication+0)
#103 pc 0000000000566017 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238)+647) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#104 pc 000000000056d13e /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+110) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#105 pc 000000000056ddb6 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+2054) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#106 pc 000000000039b0a1 /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp(art::interpreter::SwitchImplContext*)+17169) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#107 pc 00000000003937a5 /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+5) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#108 pc 00000000001b8ea0 /system/framework/framework.jar (android.app.ActivityThread$H.handleMessage+0)
#109 pc 0000000000566017 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238)+647) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#110 pc 000000000056d13e /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+110) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#111 pc 000000000056ddb6 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+2054) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#112 pc 000000000039ae32 /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp(art::interpreter::SwitchImplContext*)+16546) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#113 pc 00000000003937a5 /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+5) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#114 pc 00000000001d69fc /system/framework/framework.jar (android.os.Handler.dispatchMessage+0)
#115 pc 0000000000566017 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238)+647) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#116 pc 000000000056d13e /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+110) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#117 pc 000000000056ddb6 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+2054) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#118 pc 000000000039ae32 /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp(art::interpreter::SwitchImplContext*)+16546) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#119 pc 00000000003937a5 /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+5) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#120 pc 00000000001fbe08 /system/framework/framework.jar (android.os.Looper.loopOnce+0)
#121 pc 0000000000566017 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238)+647) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#122 pc 000000000056d13e /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+110) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#123 pc 000000000056ddb6 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+2054) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#124 pc 000000000039b0a1 /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp(art::interpreter::SwitchImplContext*)+17169) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#125 pc 00000000003937a5 /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+5) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#126 pc 00000000001fc57c /system/framework/framework.jar (android.os.Looper.loop+0)
#127 pc 0000000000566017 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238)+647) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#128 pc 000000000056d13e /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+110) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#129 pc 000000000056ddb6 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+2054) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#130 pc 000000000039b0a1 /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp(art::interpreter::SwitchImplContext*)+17169) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#131 pc 00000000003937a5 /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+5) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#132 pc 00000000001c3970 /system/framework/framework.jar (android.app.ActivityThread.main+0)
#133 pc 0000000000566017 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238)+647) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#134 pc 000000000091f056 /apex/com.android.art/lib64/libart.so (artQuickToInterpreterBridge+902) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#135 pc 0000000000391bdc /apex/com.android.art/lib64/libart.so (art_quick_to_interpreter_bridge+140) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#136 pc 0000000000378826 /apex/com.android.art/lib64/libart.so (art_quick_invoke_static_stub+806) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#137 pc 00000000003c538f /apex/com.android.art/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+255) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#138 pc 00000000007f07f4 /apex/com.android.art/lib64/libart.so (_jobject* art::InvokeMethod<(art::PointerSize)8>(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, _jobject*, _jobject*, unsigned long)+1476) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#139 pc 000000000075a387 /apex/com.android.art/lib64/libart.so (art::Method_invoke(_JNIEnv*, _jobject*, _jobject*, _jobjectArray*) (.__uniq.165753521025965369065708152063621506277)+39) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#140 pc 0000000000391a4b /apex/com.android.art/lib64/libart.so (art_quick_generic_jni_trampoline+219) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#141 pc 00000000003784c4 /apex/com.android.art/lib64/libart.so (art_quick_invoke_stub+756) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#142 pc 00000000003c535c /apex/com.android.art/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+204) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#143 pc 000000000056ddd0 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, bool, art::JValue*)+2080) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#144 pc 000000000039ae32 /apex/com.android.art/lib64/libart.so (void art::interpreter::ExecuteSwitchImplCpp(art::interpreter::SwitchImplContext*)+16546) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#145 pc 00000000003937a5 /apex/com.android.art/lib64/libart.so (ExecuteSwitchImplAsm+5) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#146 pc 000000000050cd00 /system/framework/framework.jar (com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run+0)
#147 pc 0000000000566017 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.__uniq.112435418011751916792819755956732575238)+647) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#148 pc 000000000091f056 /apex/com.android.art/lib64/libart.so (artQuickToInterpreterBridge+902) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#149 pc 0000000000391bdc /apex/com.android.art/lib64/libart.so (art_quick_to_interpreter_bridge+140) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#150 pc 00000000007f0848 /system/framework/x86_64/boot-framework.oat (com.android.internal.os.ZygoteInit.main+2872) (BuildId: e4c2202f7e80276bcdbfa046249d896342205aa9)
#151 pc 0000000000378826 /apex/com.android.art/lib64/libart.so (art_quick_invoke_static_stub+806) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#152 pc 00000000003c538f /apex/com.android.art/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+255) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#153 pc 00000000007f129f /apex/com.android.art/lib64/libart.so (art::JValue art::InvokeWithVarArgsart::ArtMethod*(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, art::ArtMethod*, __va_list_tag*)+399) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#154 pc 00000000006a7edc /apex/com.android.art/lib64/libart.so (art::JNI::CallStaticVoidMethodV(_JNIEnv*, _jclass*, _jmethodID*, __va_list_tag*)+668) (BuildId: b6dc79e02101ea00827a35a55ab6597a)
#155 pc 00000000000df088 /system/lib64/libandroid_runtime.so (_JNIEnv::CallStaticVoidMethod(_jclass*, _jmethodID*, ...)+136) (BuildId: 58f47cb2665b829aa74415f458f1922a)
#156 pc 00000000000ebb30 /system/lib64/libandroid_runtime.so (android::AndroidRuntime::start(char const*, android::Vectorandroid::String8 const&, bool)+896) (BuildId: 58f47cb2665b829aa74415f458f1922a)
#157 pc 0000000000002fa6 /system/bin/app_process64 (main+1622) (BuildId: f11cda2b6bb6bff1e502077a2f3e6cf7)
#158 pc 00000000000529ef /apex/com.android.runtime/lib64/bionic/libc.so (__libc_init+95) (BuildId: fa337969c798946280caa45e2d71a2e7)

@gvravikumar
Copy link

gvravikumar commented Oct 30, 2023

I can also reproduce on a physical Pixel 7 Pro running android 14 (this is my own kotlin-based android app):

/Users/realm/workspace-realm-kotlin/releases/packages/external/core/src/realm/util/file.cpp:1101: [realm-core-13.17.0] Assertion failed: r == 0 && "File::unlock()" with (r, (*__errno())) =  [-1, 38]
                                                                                                    <backtrace not supported on this platform>
                                                                                                    !!! IMPORTANT: Please report this at https://github.com/realm/realm-core/issues/new/choose
Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 28469 (ch.tyman.scalar), pid 28469 (ch.tyman.scalar)

If you need any extra information I would be glad to help

The app can be successfully opened by setting the directory as filesDir in Kotlin and getFilesDir() in Java.
image

@yesseruser
Copy link

It seems this issue has been resolved in the November security update, at least on the Google Pixels.

@CodingOctocat
Copy link

The same problem occurs with(Context.GetExternalFilesDir): Android Emulator pixel5-Android14/api34/security update 5/9/2023, but my physical machine Redmi Note 11T Pro-Android14/security update 1/5/2024 is fine.

I was wondering if I should put the database into internal storage (FileSystem.AppDataDirectory) for compatibility?

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

10 participants