我手机的Android在/system/lib/hw
下有以下文件:
- 传感器.exynos4.so
- 传感器.smdk4210.so
这些动态库位于指南针、陀螺仪和环境光等传感器的链中。
第一个文件(sensors.exynos4.so)来自发行版本身(为i9100运行CyanogenMod 10.1),第二个文件(ensors.smdk4210.so)是我从手机的库存ROM(SHW-M250S,"Korean S2",i9100的变体)中找到的文件,并将其复制到那里。
问题1:什么在使用这些文件
对系统中的所有二进制文件和库执行ldd
(实际上是readelf或objdump)并没有发现这些文件的任何用户。我的结论是:动态链接后,必须有人在运行时像插件一样加载它们但是谁/什么?(请提供源代码文件名或代码浏览器链接)
这些库的用户在没有任何配置的情况下(在我把它放在那里之后)从第一个库切换到第二个库。我想深入探究这个谜。
问题2:这些文件的来源在哪里
这些文件(至少)包含传感器的配置(比如它在板上的位置、值范围和步骤)。我想为我的手机生成一个正确的。如果我有两者的来源,这将很容易做到。–只有CyanogenMod版本,我至少可以猜测必要的更正。
注意:
- 没有猜测的答案
-
如果你的部分答案是"二进制":
- 指向CyanogenMod源代码中的斑点或提取它们的脚本
- 按照链接到使用它们的第一个开源库/程序
- 这些问题并不是针对设备的考虑到任何设备,情况都应该相似(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*设备。我没有检查内核以了解这些设备的详细信息…)