偶然发现Android启动一直停留在开机动画阶段,无法正常进入系统。于是跟踪发现其居然在EntropyService.java->loadInitialEntropy函数read /system/data/entropy.dat时被block住了,导致system server后面的其他service也无法启动。虽然还没有知道root cause,这里还是记录Entropy Service相关知识。
Entropy Service是system server启动的第一个Service,它周期性(每3小时)的加载和保存熵池(/dev/urandom)。但是由于/dev/urandom本身就有的安全性要被/dev/random相对差些,所以每隔三小时,Android系统在kernel的熵池中增加了一些附加信息,这些信息对提高随机数的质量上还是有些帮助的。
Android添加的额外的信息如下:
out.println("Copyright (C) 2009 The Android Open Source Project");
out.println("All Your Randomness Are Belong To Us");
out.println(START_TIME);
out.println(START_NANOTIME);
out.println(SystemProperties.get("ro.serialno"));
out.println(SystemProperties.get("ro.bootmode"));
out.println(SystemProperties.get("ro.baseband"));
out.println(SystemProperties.get("ro.carrier"));
out.println(SystemProperties.get("ro.bootloader"));
out.println(SystemProperties.get("ro.hardware"));
out.println(SystemProperties.get("ro.revision"));
out.println(System.currentTimeMillis());
out.println(System.nanoTime());
其他参考:
http://www.kernel.org/doc/man-pages/online/pages/man4/random.4.html