Switching the Android backend to `AHardwareBuffer` drops the legacy `gralloc` path in favor of the supported and stable NDK API. According to https://apilevels.com/, Android 8.0+ devices already account for about 94.8% of the ecosystem, and the real share is likely higher today, so removing the old `gralloc` code path is a reasonable trade-off. `AHardwareBuffer` does not provide a way to construct a buffer from an existing `native_handle_t`, so buffer transfer is implemented by fully duplicating it through the existing socket-based code path, even for same-process cases. This keeps the implementation consistent with the cross-process path. Function loading is done via `dlopen("libandroid.so")` in `device.c` (instead of expected location in `init.c`). This works around an NDK issue where symbols marked with `__INTRODUCED_IN` cannot be safely referenced when targeting lower API levels, even in `typeof` expressions (I reported it to upstream). To make this work, `__ANDROID_UNAVAILABLE_SYMBOLS_ARE_WEAK__` is used, although this is not ideal. Moving these definitions into shared headers would require enabling this macro for the entire module, which could lead to unexpected runtime linker behavior during development in the future. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10519