分析源码为Android5.1(android 22)
EntropyMixer(EntropyService)
不明白Google为什么要改名字, 以前的EntropyService类名改为了EntropyMixer。
EntropyMixer服务主要用来产生随机数.在Android4.0以后已经更新为EntropyMixer类了,名字变了,功能还是那些。
物理学上定义熵的定义,一个系统中熵越大,则该系统越不稳定。在Android中,只有随机数处于这样一种不稳定的系统中。
在SystemServer中添加该服务的代码如下:
ServiceManager.addService("entropy", new EntropyMixer(context));
所有系统服务都是由ServiceManager的addService来添加的,并由ServiceManager统一管理。 我们看一下EntropyMixer的构造函数:
public EntropyMixer(Context context) {
//调用另一个构造函数,getSystemDir得到的是 /data/system目录
this(context, getSystemDir() + "/entropy.dat", "/dev/urandom", "/dev/hw_random");
}
/** Test only interface, not for public use */
public EntropyMixer(
Context context,
String entropyFile,
String randomDevice,
String hwRandomDevice) {
this.randomDevice = randomDevice;//1. urandom是Linux中产生随机数的设备
this.hwRandomDevice = hwRandomDevice;// /data/system/entropy.data保存了系统此前的熵信息
this.entropyFile = entropyFile;
//以下是四个关键函数
loadInitialEntropy();//1
addDeviceSpecificEntropy();//2
writeEntropy(); // 3
scheduleEntropyWriter(); // 4
//最后注册了一个广播接收者
IntentFilter broadcastFilter = new IntentFilter(Intent.ACTION_SHUTDOWN);
broadcastFilter.addAction(Intent.ACTION_POWER_CONNECTED);
broadcastFilter.addAction(Intent.ACTION_REBOOT);
context.registerReceiver(mBroadcastReceiver, broadcastFilter);
}
相应的解释已写在了上述代码中,上面所列的四个关键函数的作用如下:
- 1、loadInitialEntropy: 将entropy.dat文件中的内容写到urandom设备,这样可以增加系统随机性;
- 2、addDeviceSpecificEntropy : 将一些设备相关的信息写入urandom设备;
- 3、writeEntropy: 读取urandom设备的内容到entropy.dat文件;
- 4、scheduleEntropyWriter 向EntropyMixer 内部的Handler发送ENTROPY_WHAT消息,每三小时发一次。收到消息后,EntropyMixer会再次调用writeEntropy,将urandom设备的内容写入entropy.dat中。
EntropyMixer的代码很简单,也就200多行,但是Google的代码写得确实很厉害,尽量保证了随机数的随机性。
参考《深入理解Android》