在Android上使用/system/lib/hw/sensors.*.so的内容(以及来源)



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

  1. 传感器.exynos4.so
  2. 传感器.smdk4210.so

这些动态库位于指南针、陀螺仪和环境光等传感器的链中。

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

问题1:什么在使用这些文件

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

这些库的用户在没有任何配置的情况下(在我把它放在那里之后)从第一个库切换到第二个库。我想深入探究这个谜。

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

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

注意:

  1. 没有猜测的答案
  2. 如果你的部分答案是"二进制":
    1. 指向CyanogenMod源代码中的斑点或提取它们的脚本
    2. 按照链接到使用它们的第一个开源库/程序
  3. 这些问题并不是针对设备的考虑到任何设备,情况都应该相似(AOSP、AOKP、CyanogenMod…)

它们是二进制Blob。

具有传感器.exynos4.so和其他专有斑点https://github.com/chris41g/proprietary_samsung_epic4gtouch/tree/master/proprietary/lib/hw

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

试着在谷歌上搜索文件,或者浏览CM树或他们的wiki。

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

在成功下载并编译了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
建筑HAL

更新:

在我的CM树周围做了更多的挖掘设备/samsung/i9100包含一个Android.mk文件,用于构建sensors.exynos4.so。.mk文件将模块指定为
LOCAL_MODULE := sensors.$(TARGET_BOARD_PLATFORM)设置在device/samsung/galaxys2-common/BoardCommonConfig.mk.

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

同样只是观察到BoardConfig将一些值设置为smdk4210。

我还不能回答是什么使用了这些文件,但传感器的来源。*。所以在CyanogenMod:中导航很好

每个支持的设备都有一个指向github repo的wiki条目(例如i9100源)。在那里,你可以在cm.dependences中找到额外的存储库,这些存储库共同涵盖了为有问题的设备构建cm所需的内容(例如内核、在一组设备之间共享的公共文件…)

在i9100的情况下,我们可以留在根存储库中。在libsensors/Android.mk中,我们看到sensors.<ro.product.board>.so是由该目录中的文件生成的。除了libakm.so(二进制,根据../proprietary files.txt)之外,所有的源都在那里(对于i9100设备),它在AkmSensors.cpp中是dlopen()。libakm.so用于启用和禁用一些传感器,但也创建/dev/input/eventX,一个反映三个可用传感器(指南针、加速度、方向)的虚拟输入设备。(我不知道内核是如何"运行"虚拟设备的。)

(sensors.*.so是硬件抽象层。–对于i9100,它处理一些/dev/input/event*设备。我没有检查内核以了解这些设备的详细信息…)

相关内容

  • 没有找到相关文章

最新更新