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》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章