#android #gps #virtualbox #virtualization
#Android #gps #virtualbox #виртуализация
Вопрос:
Я пытаюсь виртуализировать устройство GPS в Android, работающее в виртуальном окне. Я хочу упростить приложение, работающее на Android, для использования устройства gps или каким-либо образом получить поддельное местоположение gps. Я начал просматривать исходный код эмулятора Android, но между тем, у любого есть хорошее место для начала.
[ОБНОВИТЬ]
Чтобы было немного понятнее, весь стек приложений был бы чем-то вроде:
Android app (with gps functionality) to be tested ----> (developed by end user)
Android virtual machine ----> (Guest OS)
virtual box ---->
Microsoft Windows ---> Host OS
Теперь, в идеале, я хотел бы, чтобы мое приложение (например, adb
или ddms
) работало в Windows, откуда пользователь мог бы устанавливать некоторые значения координат для устройства gps (при отсутствии фактического GPS, либо виртуализировать существующий GPS).). Эти координаты будут доступны в приложении для Android. По сути, это то же самое, что предоставлять функциональность существующего эмулятора Android (с использованием ddms) посредством virtual-box
запуска образа Android.
Я НЕ запускаю эмулятор Android и не использую eclipse. 🙁 [ОБНОВЛЕНИЕ ЗАКАНЧИВАЕТСЯ]
Ответ №1:
Вот как я это сделал (и краткий обзор того, как работает Android stack (работающий на 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 stack.
ПРИМЕЧАНИЕ: Компиляция кода hgcm и связывание его с библиотекой Android также немного сложны из-за ограниченного числа функций, реализованных в Android libc (и некоторых других библиотеках, а также). Чтобы избежать всего этого, вы можете напрямую открыть устройство (/dev / vboxguest) и выполнять на нем вызовы ioctl в формате, который известен vbox и вашей хост-службе.
Ответ №2:
Как насчет попытки использовать фиктивное местоположение с помощью setTestProviderLocation
?
Ответ №3:
Вы в eclipse? Если это так, используйте ddms для отправки ложных местоположений на виртуальное устройство.
Ответ №4:
Если вы используете eclipse, перейдите в DDMS perpective, затем перейдите в раздел управления эмулятором. Там вы увидите 2 текстовых поля для широты и долготы. Затем вы нажимаете «Отправить», и эта информация будет отправлена в эмулятор.
В качестве альтернативы вы могли бы по telnet передать в эмулятор информацию о GPS: Пример telnet localhost 5554 geo fix -82.411629 28.054553
Комментарии:
1. Это определенно сработало бы, но здесь я не использую эмулятор Android. Я хочу уведомить то же самое приложение для Android через virtual-box.