注册

现在的位置是: 小猿圈 > Android源码解析--EntropyMixer(EntropyService 随机数)服务详解

Android源码解析--EntropyMixer(EntropyService 随机数)服务详解

Vicky2025-03-06 10:54:33.0112人围观
版权声明 本文转自https://blog.csdn.net/qq475703980/article/details/88917678,版权归原作者所有。如有侵权,请联系删除,谢谢。

分析源码为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》