什么在Android上使用/system/lib/hw/sensors.*.so(以及源代码在哪里)?

时间:2013-08-22 20:08:40

标签: android-source galaxy android-sensors samsung-mobile cyanogenmod

我的手机的Android在/system/lib/hw下面有以下文件:

  1. sensors.exynos4.so
  2. sensors.smdk4210.so
  3. 这些动态库位于罗盘,陀螺仪和环境光等传感器的链条中。

    第一个文件(sensors.exynos4.so)来自发行版本身(运行CyanogenMod 10.1 for i9100),第二个文件(sensors.smdk4210.so)是我从手机的库存ROM中捕获的(SHW) -M250S,“韩国S2”,i9100的变体)并将其复制到那里。

    问题1:这些文件的用途是什么?

    对系统中的所有二进制文件和库执行ldd(实际上是readelf或objdump)并未显示这些文件的任何用户。我的结论是:有人必须在动态链接后的运行时加载它们像插件一样!但是谁/什么? (请输入源代码文件名或代码浏览器链接)

    这些库的用户在没有任何配置的情况下从第一个库切换到第二个库(在我将其放置之后)。我想挖掘这个谜。

    问题2:这些文件的来源在哪里?

    文件包含(至少)传感器的配置(就像它在板上的位置,值范围和步骤)。我想为我的手机生成一个正确的。如果我有两者的来源,那么这样做很容易。 - 只有CyanogenMod版本,我至少可以猜测必要的更正。

    注意:

    1. 没有猜测答案。
    2. 如果您的部分答案是“二进制”:
      1. 将我指向CyanogenMod源代码中的blob或提取它们的脚本。
      2. 按照链接到第一个使用它们的开源库/程序。
    3. 问题不是特定于设备的。 - 回答任何设备时,情况应该类似(AOSP,AOKP,CyanogenMod,......)。

2 个答案:

答案 0 :(得分:3)

它们是二进制blob。

有sensors.exynos4.so和其他专有的blob https://github.com/chris41g/proprietary_samsung_epic4gtouch/tree/master/proprietary/lib/hw

可以使用extract-files脚本从正在运行的设备中提取blob,该脚本从项目中的proprietary-files.txt中读取专有文件的列表,以用于构建CM的任何设备。

尝试使用Google搜索文件或查看CM树或其维基。

HAL是硬件抽象层,是用于将内核/设备驱动程序的传感器数据传回用户空间的接口。 找到这个讨论构建Android HAL的pdf,但对于不同的设备和描述的输出

  

成功下载并编译Android源后,用户可以编译并添加/替换传感器HAL库。为此,请在android源路径中复制传感器HAL库文件夹,通常位于:
  [Root Android Sources]/vendor/[vendor name]/[boardname]/

     

在库的构建操作之前,用户必须初始化Android环境:
  [Root Android Sources]$ source build/envsetup.sh
  [Root Android Sources]$ lunch [target board]

     

现在可以建立图书馆;只需在HAL文件夹中启动“mm”命令即可。此过程的结果是位于以下内容的动态库:
  [Root Android Sources]/out/target/product/[board name]/system/lib/hw/sensors.[board name].so

对于传感器,SensorService加载HAL,以便它可以与传感器通信。

HAL
Building HAL

更新:

我的CM树周围还有一些问题 device / samsung / i9100包含一个构建sensors.exynos4.so的Android.mk文件。 .mk文件将模块指定为
设置的LOCAL_MODULE := sensors.$(TARGET_BOARD_PLATFORM) device/samsung/galaxys2-common/BoardCommonConfig.mk.

此设备的device/samsung/i9100/libsensors中有来源。查看device / samsung / i9100g但是没有libsensor,并且该设备需要运行CM脚本从正在运行的设备中提取blob,因此源的可用性仍然因设备而异。

还只是观察到BoardConfig为smdk4210设置了一些值。

答案 1 :(得分:0)

我无法回答使用这些文件的内容,但传感器的来源。*。很高兴导航到CyanogenMod:

每个受支持的设备都有一个wiki条目,指向github repo(例如i9100 source)。在那里,您可以在cm.dependencies中找到其他存储库,它们共同涵盖了为相关设备构建CM所需的内容(例如,内核,一组设备之间共享的公共文件,......)。

对于i9100,我们可以留在根存储库中。在libsensors/Android.mk中,我们看到sensors.<ro.product.board>.so是由此目录中的文件生成的。源代码就在那里(对于i9100设备),除了libakm.so(二进制,根据../proprietary-files.txt),它是AkmSensors.cpp中的dlopen()。 libakm.so用于启用和禁用某些传感器,但也创建/ dev / input / eventX,这是一个反映三个可用传感器(罗盘,加速度,方向)的虚拟输入设备。 (我不知道内核如何“运行”虚拟设备。)

(传感器。*。所以硬件抽象层。 - 对于i9100,它处理一些/ dev / input / event *设备。我没有检查内核的详细信息。 ..)