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

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值