我正在尝试在虚拟机中运行的android中虚拟化GPS设备。我想方便在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映像的virtual-box
提供现有Android模拟器(使用ddms)的功能相同。
我没有运行Android模拟器而且我没有使用eclipse。 :( [更新结束]
谢谢, 维克拉姆。
答案 0 :(得分:6)
这就是我的做法(以及android堆栈(在vbox上运行)如何工作的简要概述。)
具有GPS功能的Android应用程序使用JNI接口(在frameworks/base/core/jni/android_location_GpsLocationProvider.cpp
中导出)在用户模式共享库(通常为libgps.so或libhardware_legacy.so)的底层实现中注册一些回调
这些注册的回调负责通知应用程序的GPS修复(或更改gps位置)。
这是一张简单的图片,展示来自Android -> VBox -> Windows
现在要完成此流程,需要执行以下步骤:
我创建了自己的libgps.so
导出函数gps_get_interface
(在gps.h
中声明),由JNI接口使用。支持gps的应用程序获取从此libgps.so返回的最新坐标,该坐标实际上由GpsLocationProvider服务加载。
使用Vbox标头创建另一个共享对象,并包含连接,断开连接和发送功能请求的例程,以便在主机操作系统中运行host service
。这些是带有预定义ioctl-numbers的简单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(以及其他一些libs)中实现的函数数量有限。为了避免这一切,您可以直接打开设备(/ dev / vboxguest)并以vbox和您的主机服务已知的格式对其发出ioctl调用。
答案 1 :(得分:1)
答案 2 :(得分:1)
答案 3 :(得分:0)
如果您正在使用eclipse,请转到DDMS,然后转到“模拟器控制”部分。在那里你会看到2个纬度和经度的文本框。然后单击“发送”,该信息将发送到模拟器。
或者你可以通过远程登录模拟器传递GPS信息: 例 telnet localhost 5554 geo fix -82.411629 28.054553