分析源碼爲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》