2

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

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

这些动态库位于传感器链中的某个位置,用于罗盘、陀螺仪和环境光等传感器。

第一个文件(sensors.exynos4.so)来自发行版本身(为 i9100 运行 CyanogenMod 10.1),第二个文件(sensors.smdk4210.so)是我从手机(SHW-M250S, “Korean S2”,i9100 的变体)并在那里复制。

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

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

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

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

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

笔记:

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

2 回答 2

4

它们是二进制 blob。

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

可以使用 extract-files 脚本从正在运行的设备中提取 blob,该脚本从项目中的 private-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,以便与传感器通信。

哈尔
大厦哈尔

更新:

是否对我的 CM 树设备/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 但是没有 libsensors 并且该设备需要运行 CM 脚本才能从正在运行的设备中提取 blob,因此源的可用性仍然因设备而异。

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

于 2013-08-22T20:59:16.703 回答
0

我还不能回答是什么使用了这些文件,但是sensors.*.so的来源很适合在CyanogenMod中导航:

每个受支持的设备都有一个指向 github 存储库(例如i9100 源)的 wiki 条目。在那里,您可以在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,这是一个反映三个可用传感器(指南针、加速度、方向)的虚拟输入设备。(我不知道内核如何“运行”虚拟设备。)

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

于 2013-08-23T18:11:35.857 回答