Вот как я это сделал (и краткий обзор того, как работает стек Android (работает на vbox)).
Приложение Android, имеющее функцию GPS, регистрирует некоторые обратные вызовы в базовой реализации совместно используемой библиотеки пользовательского режима (обычно libgps.so или libhardware_legacy.so) с использованием интерфейсов JNI (как экспортировано в frameworks/base/core/jni/android_location_GpsLocationProvider.cpp
)
Эти зарегистрированные обратные вызовы отвечают за уведомление приложения об исправлении GPS (или об изменении местоположения GPS).
Вот простое изображение, демонстрирующее поток вызовов от Android -> VBox -> Windows
Теперь, чтобы завершить этот поток, потребовались следующие шаги:
Я создал собственный libgps.so
, экспортирующий функцию gps_get_interface
(объявлена в gps.h
), которая используется интерфейсом JNI. Приложение с поддержкой gps получает последние координаты, возвращенные из этого libgps.so, который фактически динамически загружается службой GpsLocationProvider.
Создайте еще один общий объект, используя заголовки Vbox и содержащие подпрограммы для подключения, отключения и отправки запроса функции к host service
, работающему в хост-ОС. Это простые вызовы ioctl с предопределенными номерами ioctl (например, VBOX_GUEST_IOCTL_HGCM_CONNECT и т. Д.).
Создание хост-службы (которая на самом деле представляет собой DLL, загружаемую VBox Host Service
), которая может обрабатывать параметры, передаваемые вызовами HGCM, и возвращать необходимые данные в формате, понятном общему объекту, созданному на шаге 2.
Теперь, чтобы отправить любое поддельное / фиктивное местоположение обратно в приложение, работающее внутри Android VM
, вам просто нужно уведомить host service
, а остальное сообщается обратно VBox Additions
-> libgps.so
- > GpsLocationProvider service
-> и, наконец, App with GPS Support
.
Надеюсь, это поможет кому-нибудь попробовать что-то похожее или поможет понять, как работает стек Android.
ПРИМЕЧАНИЕ. Компиляция кода hgcm и связывание его с android lib также немного сложны из-за ограниченного числа функций, реализованных в android libc (и некоторых других библиотеках). Чтобы избежать всего этого, вы можете напрямую открыть устройство (/ dev / vboxguest) и выполнить на нем вызовы ioctl в формате, который известен vbox и вашей хост-службе.