поддельный GPS для Android, работающий в виртуальном окне

#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

введите описание изображения здесь

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

  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 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

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

Комментарии:

1. Это определенно сработало бы, но здесь я не использую эмулятор Android. Я хочу уведомить то же самое приложение для Android через virtual-box.