поддельные GPS для Android работает в виртуальной коробке - PullRequest
4 голосов
/ 06 мая 2011

Я пытаюсь виртуализировать GPS-устройство в Android, работающем в virtual-box. Я хочу помочь приложению, работающему в Android, использовать устройство GPS или как-то получить поддельное местоположение GPS. Я начал смотреть на исходный код эмулятора Android, но между тем у любого есть хорошее место для начала.

[UPDATE]

Чтобы сделать это немного более понятным, весь стек приложений будет выглядеть примерно так:

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. :( [ОБНОВЛЕНИЕ КОНЦА]

Спасибо, Викрам.

Ответы [ 4 ]

6 голосов
/ 03 июня 2011

Вот как я это сделал (и краткий обзор того, как работает стек Android (работает на vbox)).

Приложение Android, имеющее функцию GPS, регистрирует некоторые обратные вызовы в базовой реализации совместно используемой библиотеки пользовательского режима (обычно libgps.so или libhardware_legacy.so) с использованием интерфейсов JNI (как экспортировано в frameworks/base/core/jni/android_location_GpsLocationProvider.cpp)

Эти зарегистрированные обратные вызовы отвечают за уведомление приложения об исправлении GPS (или об изменении местоположения GPS).

Вот простое изображение, демонстрирующее поток вызовов от Android -> VBox -> Windows

enter image description here

Теперь, чтобы завершить этот поток, потребовались следующие шаги:

  1. Я создал собственный libgps.so, экспортирующий функцию gps_get_interface (объявлена ​​в gps.h), которая используется интерфейсом JNI. Приложение с поддержкой gps получает последние координаты, возвращенные из этого libgps.so, который фактически динамически загружается службой GpsLocationProvider.

  2. Создайте еще один общий объект, используя заголовки Vbox и содержащие подпрограммы для подключения, отключения и отправки запроса функции к host service, работающему в хост-ОС. Это простые вызовы ioctl с предопределенными номерами ioctl (например, VBOX_GUEST_IOCTL_HGCM_CONNECT и т. Д.).

  3. Создание хост-службы (которая на самом деле представляет собой DLL, загружаемую VBox Host Service), которая может обрабатывать параметры, передаваемые вызовами HGCM, и возвращать необходимые данные в формате, понятном общему объекту, созданному на шаге 2.

  4. Теперь, чтобы отправить любое поддельное / фиктивное местоположение обратно в приложение, работающее внутри Android VM, вам просто нужно уведомить host service, а остальное сообщается обратно VBox Additions -> libgps.so - > GpsLocationProvider service -> и, наконец, App with GPS Support.

Надеюсь, это поможет кому-нибудь попробовать что-то похожее или поможет понять, как работает стек Android.

ПРИМЕЧАНИЕ. Компиляция кода hgcm и связывание его с android lib также немного сложны из-за ограниченного числа функций, реализованных в android libc (и некоторых других библиотеках). Чтобы избежать всего этого, вы можете напрямую открыть устройство (/ dev / vboxguest) и выполнить на нем вызовы ioctl в формате, который известен vbox и вашей хост-службе.

1 голос

Вы в затмении?В этом случае используйте ddms для отправки фиктивных местоположений на виртуальное устройство.

1 голос
/ 06 мая 2011

Как насчет попытки использовать фиктивное местоположение, используя setTestProviderLocation?

0 голосов
/ 06 мая 2011

Если вы используете eclipse, перейдите в DDMS соответственно, затем перейдите в раздел управления эмулятором. Там вы увидите 2 текстовых поля для широты и долготы. Затем вы нажимаете кнопку отправить, и эта информация будет отправлена ​​в эмулятор.

В качестве альтернативы вы можете подключиться к эмулятору и передать информацию GPS: пример telnet localhost 5554 geo fix -82.411629 28.054553

http://www.devx.com/wireless/Article/39239/1954

...