🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
硬件抽象层模块文件的命名规范定义在hardware/libhardware/hardware.c文件中,如下所示。 **hardware/libhardware/hardware.c** ~~~ /** * There are a set of variant filename for modules. The form of the filename * is "<MODULE_ID>.variant.so" so for the led module the Dream variants * of base "ro.product.board", "ro.board.platform" and "ro.arch" would be: * * led.trout.so * led.msm7k.so * led.ARMV6.so * led.default.so */ static const char *variant_keys[] = { "ro.hardware", /* This goes first so that it can pick up a different file on the emulator. */ "ro.product.board", "ro.board.platform", "ro.arch" }; ~~~ 这段代码和注释的意思是,硬件抽象层模块文件的命名规范为“.variant.so”,其中,MODULE_ID表示模块的ID,variant表示四个系统属性ro.hardware、ro.product.board、ro.board.platform和ro.arch之一。系统在加载硬件抽象层模块时,依次按照ro.hardware、ro.product.board、ro.board.platform和ro.arch的顺序来取它们的属性值。如果其中的一个系统属性存在,那么就把它的值作为variant的值,然后再检查对应的文件是否存在,如果存在,那么就找到要加载的硬件抽象层模块文件了;否则,就继续查找下一个系统属性。如果这四个系统属性都不存在,或者对应于这四个系统属性的硬件抽象层模块文件都不存在,那么就使用“.default.so”来作为要加载的硬件抽象层模块文件的名称。 系统属性ro.hardware是在系统启动时,由init进程负责设置的。它首先会读取/proc/cmdline文件,检查里面有没有一个名称为androidboot.hardware的属性,如果有,就把它的值作为属性ro.hardware的值;否则,就将/proc/cpuinfo文件的内容读取出来,并且将里面的硬件信息解析出来,即将Hardware字段的内容作为属性ro.hardware的值。例如,在Android模拟器中,从/proc/cpuinfo文件读取出来的Hardware字段内容为goldfish,于是,init进程就会将属性ro.hardware的值设置为“goldfish”。系统属性ro.product.board、ro.board.platform和ro.arch是从/system/build.prop文件读取出来的。文件/system/build.prop是由编译系统中的编译脚本build/core/Makefile和Shell脚本build/tools/buildinfo.sh生成的,有兴趣的读者可以研究一下这两个文件,这里就不深入分析了。