wineandroid.drv: bring-up fixes for Android 7.1.x
Requires !10067 (merged), fixup/followup to e0d3683d and 4b5311c7.
Note on authorship and language
This text was translated into English and structured with the assistance of ChatGPT. The author is not a native English speaker and may struggle with written technical English; any wording issues are unintentional.
Description
This merge request is an experimental attempt to bring wineandroid.drv back to a minimally functional state on Android 7.1.x.
The current Android support appears to have bit-rotted over time, likely due to a combination of internal contract changes in Wine, toolchain and NDK evolution, and the absence of continuous Android testing. The changes proposed here aim to re-establish a working baseline and make the regressions more concrete and easier to reason about.
Test environment and context
All testing so far was performed on Android 7.1.2 x86 images from the Android-x86 project, published on osboxes.org (link). The primary target is i386 Wine running on x86 Android userspace.
Because no up-to-date official Android build scripts were available, Wine was built using Termux as an unsupported but convenient environment for rapid testing. The Java part (WineActivity and related glue code) was built with sharedUserId = com.termux purely for convenience (filesystem access and faster prototyping). Termux is explicitly not considered a supported environment and is mentioned only to provide context for the testing setup.
The build uses Android NDK r29. Since the last known functional Android Wine builds, the NDK and linker behavior have changed multiple times, including symbol visibility and relocation handling. These changes appear to have directly affected several failure modes described below. There is also a known issue with wine-preloader producing excessively large binaries under recent toolchains; a workaround exists but is not included here and is mentioned only as additional context.
Scope of changes
This merge request currently modifies only Android-specific code:
-
wineandroid.drv(native code and Java glue, including WineActivity) - android-only paths in
dlls/ntdll/unix/loader.c
No non-Android platforms are affected.
Summary of resolved issues
- Desktop initialization ordering regression
After recent CreateDesktopW-related changes, ANDROID_CreateDesktop started running before the DESKTOP window was created. The Java glue assumed the opposite order.
The fix splits desktop initialization into two phases (view setup first, desktop window attachment later via an explicit is_desktop flag) and corrects the ANDROID_CreateDesktop success return value.
- Rendering stalls and
USER lock assertion
Occasional crashes with:
err:system:user_check_not_lock BUG: holding USER lock
A full memory barrier was added in the dequeue path to avoid a likely memory ordering issue. Additionally, a guard was added for a NULL buffer returned on successful dequeue.
- Early startup failure in
virtual_alloc_first_teb
Wine frequently failed with:
err:virtual:virtual_alloc_first_teb wine: failed to map the shared user data: c0000018
virtual_init() is now called from JNI_OnLoad() to reduce the likelihood of the JVM reserving the required address range before Wine initializes its virtual memory subsystem.
Remaining issues
- Window focus handling is partially broken: windows receive focus on click, but are not always raised to the front.
- Despite the available desktop area being larger (e.g. 1024x696), Wine consistently reports a display resolution of 800x600.
Limitations
Wine on Android stopped functioning entirely starting with Android 8. As a result, all testing so far has been limited to Android 7.1.x. No claims are made about behavior on newer Android versions.
Out of scope
This merge request intentionally does not attempt to:
- redesign IPC mechanisms
- introduce new Android integration models
- address Android 8+ compatibility
The sole goal is to re-establish a minimally working baseline on Android 7.1.x and enable informed discussion about what regressed and how to proceed.
This is my first contribution to Wine, and I am aware that some parts of this analysis or implementation may be flawed. I would be grateful for any review comments or suggestions.
