#059
#060 get_hardware_name();
这段代码是获取当前android系统运行的硬件信息,比如硬件的CPU名称。主要从/proc/cpuinfo里读到相关的信息。
#061 snprintf(tmp, sizeof(tmp), "/init.%s.rc", hardware);
#062 parse_config_file(tmp);
这段代码是从前面获取到的硬件名称,然后以硬件的名称(/init.硬件名称.rc)来获取相应硬件的配置文件,并且把配置文件参数加载到链表里。
#063
#064 action_for_each_trigger("early-init", action_add_queue_tail);
#065 drain_action_queue();
这段代码是先把有early-init标识的命令提前添加到一个命令队列,以便函数drain_action_queue一个一个命令地执行配置文件里的函数,这样可以在不同的配置文件里,只要标明是最先执行的函数,就可以优先地运行。
#066
#067 INFO("device init/n");
#068 device_fd = device_init();
这段代码是遍历为/sys,添加设备事件响应,创建设备节点。
#069
#070 property_init();
这段代码是进行属性初始化。每个属性都有一个名称和值,它们都是字符串格式。属性被大量使用在Android系统中,用来记录系统设置或进程之间的信息交换。属性是在整个系统中全局可见的。每个进程可以get/set属性。在系统初始化时,Android将分配一个共享内存区来存储的属性,这里主要是从/default.prop属性文件读取属性。这个有点像Windows下的注册表的作用。
#071
#072 // only listen for keychords if ro.debuggable is true
#073 debuggable = property_get("ro.debuggable");
#074 if (debuggable && !strcmp(debuggable, "1")) {
#075 keychord_fd = open_keychord();
#076 }
这段代码是从属性里获取调试标志,如果是可以调试,就打开组合按键输入驱动程序。
#077
#078 if (console[0]) {
#079 snprintf(tmp, sizeof(tmp), "/dev/%s", console);
#080 console_name = strdup(tmp);
#081 }
#082
#083 fd = open(console_name, O_RDWR);
#084 if (fd >= 0)
#085 have_console = 1;
#086 close(fd);
这段代码是判断是否有控制台,如果没有,就尝试是否是可以打缺省的控制台。
#087
#088 if( load_565rle_image(INIT_IMAGE_FILE) ) {
#089 fd = open("/dev/tty0", O_WRONLY);
#090 if (fd >= 0) {
#091 const char *msg;
#092 msg = "/n"
#093 "/n"
#094 "/n"
#095 "/n"
#096 "/n"
#097 "/n"
#098 "/n" // console is 40 cols x 30 lines
#099 "/n"
#100 "/n"
#101 "/n"
#102 "/n"
#103 "/n"
#104 "/n"
#105 "/n"
#106 " A N D R O I D ";
#107 write(fd, msg, strlen(msg));
#108 close(fd);
#109 }
#110 }
这段代码是先调用load_565rle_image函数来尝试加载定制的显示的LOGO图片,如果不成功,就直接在屏幕上显示字符串android。通过这里可以定制不同厂家的LOGO图片显示,以便在系统初始化时,进行更人性化的等待,更加漂亮个性。