Android_EntropyMixer研究

内核硬件随机数/dev/hwrng的一些规则 不管是否支持hwrng 都可以看到/dev/hwrng 这个字符设备,如果有真正的hwrng,则只是增加这个hwrng的随机性而已,同一个hwrng不能重复注册,而且会根据每个hwrng的quality 来选择一个质量最好的hwrng。 这里举例如下:drivers\crypto\hisilicon\trng.c probe 中的核心代码如下: trng->rng.name = pdev->name; #这里提供的读取硬件随机数的方法 trng->rng.read = hisi_trn. 阅读详情

这篇文章专门分析Android中的一个服务:EntropyMixer,源代码位于:
framework/base/service/core/java.com.android.server.EntropyMixer.java,该类继承自Binder,总共也就二百多行,
Entropy翻译做熵,是Linux系统中描述系统有序性的一个标识,该值越大表示系统有序性越差,在Android中EntropyMixer 就是是以前的EntropyService,生成随机数的一个东西。随机数一般与密码,加密等相关。
计算机本身是个可以预测的系统,用计算机生成的随机数的随机性就显得不是那么高,怎么办呢?注意到系统中充满了各种噪音(不是你听到的声音),有些是有序的噪音,但是有些是不可预测的随机噪音,如
用户点击鼠标的时间间隔、用户敲击键盘的时间间隔、硬件设备发生中断的时间等,都是无法预测的事件,Linux系统的RNG(随机数生成器)所生成的随机数正是利用系统中这些噪音来产生的高质量的随机数序列,
内核维护了一个熵池(EntropyPool)收集来自设备驱动程序和其他来源的环境噪音:
   

 /**
     * Mixes in the output from HW RNG (if present) into the Linux RNG.
     */
    private void addHwRandomEntropy() {
        try {
	    //我理解hw就是hardware
            RandomBlock.fromFile(hwRandomDevice).toFile(randomDevice, false);
            Slog.i(TAG, "Added HW RNG output to entropy pool");
        } catch (FileNotFoundException ignored) {
            // HW RNG not present/exposed -- ignore
        } catch (IOException e) {
            Slog.w(TAG, "Failed to add HW RNG output to entropy pool", e);
        }
    }

该方法将驱动设备的随机时间写入到randomDevice供生成随机数使用,在哪里调用呢?
1.构造函数:

 /** Test only interface, not for public use */
    public EntropyMixer(
            Context context,
            String entropyFile,
            String randomDevice,
            String hwRandomDevice) {
        if (randomDevice == null) { throw new NullPointerException("randomDevice"); }
        if (hwRandomDevice == null) { throw new NullPointerException("hwRandomDevice"); }
        if (entropyFile == null) { throw new NullPointerException("entropyFile"); }


        this.randomDevice = randomDevice;
        this.hwRandomDevice = hwRandomDevice;
        this.entropyFile = entropyFile;
        loadInitialEntropy();
        addDeviceSpecificEntropy();
        addHwRandomEntropy();
        writeEntropy();
        scheduleEntropyWriter();
        IntentFilter broadcastFilter = new IntentFilter(Intent.ACTION_SHUTDOWN);
        broadcastFilter.addAction(Intent.ACTION_POWER_CONNECTED);
        broadcastFilter.addAction(Intent.ACTION_REBOOT);
        context.registerReceiver(mBroadcastReceiver, broadcastFilter);
    }

2.Handler中,每隔3h调用一次:

  private void scheduleEntropyWriter() {
        mHandler.removeMessages(ENTROPY_WHAT);
        mHandler.sendEmptyMessageDelayed(ENTROPY_WHAT, ENTROPY_WRITE_PERIOD);
    }


  /**
     * Handler that periodically updates the entropy on disk.
     */
    private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what != ENTROPY_WHAT) {
                Slog.e(TAG, "Will not process invalid message");
                return;
            }
            addHwRandomEntropy();
            writeEntropy();
            scheduleEntropyWriter();
        }
    };

最终调用writeEntropy方法:
    

private void writeEntropy() {
        try {
            Slog.i(TAG, "Writing entropy...");
            RandomBlock.fromFile(randomDevice).toFile(entropyFile, true);
        } catch (IOException e) {
            Slog.w(TAG, "Unable to write entropy", e);
        }
    }

最终写入到entropyFile,即:

 public EntropyMixer(Context context) {
        this(context, getSystemDir() + "/entropy.dat", "/dev/urandom", "/dev/hw_random");
    }

/entropy.dat   


此外在构造方法中还可以看到注册了一个广播接收器:
 

IntentFilter broadcastFilter = new IntentFilter(Intent.ACTION_SHUTDOWN);
        broadcastFilter.addAction(Intent.ACTION_POWER_CONNECTED);
        broadcastFilter.addAction(Intent.ACTION_REBOOT);
        context.registerReceiver(mBroadcastReceiver, broadcastFilter);

在关机、接通电源、重启都会触发:

 private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            writeEntropy();
        }
    };

总结:通过上面的分析,EntropyMixer就是一个不断收集系统中随机时间并记录,为系统生成高质量的随机数服务,同时也可以服务于一些加密的任务。

基于Android5.1源码分析

如有不对的地方,请指教,谢谢

参考:
http://blog.youkuaiyun.com/wangzengke/article/details/9138413   感谢

【Android源码分析】Android系统关键服务启动简析 一、关于Android系统重要的进程 (1)、init进程:init进程是Linux内核启动完成之后,启动的第一个用户进程,Android系统就是在这个进程的基础上启动起来的,进程pid为1。init进程通过解析init.rc来陆续启动其他关键的系统服务进程---其中最重要的是:ServiceManager,Zygote和SystemServer。 (2)、ServiceManager:主要负责添加服务,获取服务,查找服务以及当某个服务意外终止时,对该服务的资源进行回收。 (3)、Zygote进程: 阅读详情

相关推荐

oracle 11.2.0.3.0 client下载,oracle64位客户端 Instant Client

oracle64位 客户端安装程序,Instant Client v11.2.0.3.0(64-bit)可以用,bo客户端需要配这个的,所以装了一个,64位操作系统中、不安装Oracle-32bit客户端,方便使用PLSQL Developer(不支持64bit位Oracle客户端)安装教程安装配置instantclient下载后,解压到D:\Oracle\instantclient_11_2(特...

weixin_42573757的博客 4516

.net开发安卓从入门到放弃 最后的挣扎(排查程序闪退问题记录-到目前为止仍在继续)

ps:写在前面,这里只是记录一些方法,如果您有不同于这里的方法,希望能留言,给我指明方向! 以下的这些方法能够查到一些端倪,但是没办法定位到问题的位置,所以到写这个记录的时候还没有解决闪退问题。导出日志到文件 adb logcat -v time >d:\b10.txtcom.BOSHIAC.agvapp

iml6yu的博客 1538

浅谈IC测试向量(pattern)及其转换

随着集成电路的飞速发展,其规模越来越大,对电路的质量与可靠性要求进一步提高,集成电路的测试方法也变得越来越困难,为了实现芯片的快速测试和筛选,ATE设备为其提供了强有力的支撑。ATE运用芯片设计仿真文件,将其作为芯片输入激励,通过ATE测试平台提供芯片测试环境,将芯片的输出和测试结果进行比较,以此来判定芯片的好坏。 说起IC测试,不得不说一下Pattern这个词,它中文的意思是模式。在图像处理中,这个词意思为图像的纹理特征,而在IC也即芯片测试行业,这个词实际上代表了需要测试芯片的时序特征。简单的说,在测

flomingo1的专栏 1万+

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

分析源码为Android5.1(android 22) EntropyMixer(EntropyService) 不明白Google为什么要改名字, 以前的EntropyService类名改为了EntropyMixer。 EntropyMixer服务主要用来产生随机数.在Android4.0以后已经更新为EntropyMixer类了,名字变了,功能还是那些。 物理学上定义熵的定义,一个系统中熵越大...

追yi流年 1596

蓝桥杯FPGA赛道积分赛

代码如下: 按键驱动 代码如下 按键驱动 代码如下: 顶层文件 按键驱动 数码管驱动 声明:本代码借鉴网络资料,如有侵权和错误请联系作者删除。我是从寒假开始备赛的,由于我基础不行,备赛过程中也是混混呃呃的,备赛效率不高,总体来说备赛不认真,有点拖拉,但是最后我也坚持备赛到了今天,在备赛过程中,即复习了旧的东西,也学到了新的东西,总结起来还是有点收获的,后天北京、天津、河北地区就要进行省赛了,我会全力以赴,不管结果怎么样,尽力就好,最后祝大家都能

weixin_69804913的博客 1982

STM32CubeMX | HAL库实战:ADC多通道采集模式深度解析(轮询、DMA、TIM触发)

本文深度解析了基于STM32CubeMX与HAL库实现ADC多通道数据采集的三种核心模式:轮询、DMA以及TIM触发DMA。文章通过对比分析,详细阐述了各模式的配置要点、适用场景与潜在陷阱,旨在帮助开发者根据实时性、CPU占用及采样精度等需求,选择并实现高效稳定的多通道数据采集方案。

postgres8guard的博客 971

EntropyMixer

EntropyMixer 就是是以前的EntropyService,生成随机数的一个东西。随机数一般与密码,加密等相关。     public EntropyMixer(String entropyFile, String randomDevice) {         if (randomDevice == null) { throw new NullPointerException("ra

wangzengke的专栏 2192

MATLAB锂离子电池伪二维(P2D)模型实现

锂离子电池伪二维(P2D)模型的MATLAB实现。该模型基于Newman等人提出的经典电化学模型,考虑了固液相扩散、电荷守恒和电化学反应动力学。

hie98894的博客 1928

CDH 集群,出现 Entropy 不良问题

原文地址:https://www.jianshu.com/p/037f9dda5e7d 问题 CDH 集群,出现 Entropy 不良问题,原因是系统熵值低于 CDH 检测的阀值引起的, 所以解决思路是需要调大系统熵值。 image.png 本文不阐述熵值问题,如需理解 entropy (熵值),需自行 google。 解决 查询系统熵值大小 cat /proc/sys/ke...

Mask_V的博客 2777

【DRAM存储器五十六】LPDDR5介绍--WCK2CK Leveling和Read gate training

简述LPDDR5 WCK2CK leveling和read gate traning基本原理与操作步骤

highman110的博客 8787

2025华为杯第二十二届中国研究生数学建模竞赛D题:低空湍流监测及最优航路规划 - 完整解题分析+完整MATLAB源码!(上篇)

🎓 本文收录于 《滚雪球学数学建模》专栏,本专栏专注于从零基础出发,带你循序渐进掌握数学建模的核心方法与思维路径。通过“滚雪球式”学习法,从最简单的生活化案例到经典建模工具,再到省赛、国赛真题实战演练,逐步积累知识与技能,帮助你搭建完整的建模体系。无论你是刚接触建模的新生,还是希望提升科研与竞赛能力的学者与工程师,本专栏都将为你提供一条清晰、高效、可实操的建模成长路线,助力你快速进阶,突破难点,迈向数学建模竞赛与实际应用的更高峰 🚀!

**My Coding Family** 2584

wifi场景软件替代硬件HW_RANDOM随机数解决方案

使用低成本平台方案时,发现不支持HW_RANDOM硬件随机数,这样在开启wifi wpa2加密ap后,电脑多次提示连接失败才连接成功,很影响用户体验。硬件不支持硬件随机数那么就需要使用软件方案进行替代,主流方案有rngd和haveged。

TSZ0000的博客 1384

開機到sleep 的log

--------- beginning of /dev/log/main 05-29 08:08:07.813 I/bdAddrLoader(  191): option : f=/persist/bluetooth/.bdaddr 05-29 08:08:07.813 I/bdAddrLoader(  191): option : h 05-29 08:08:07.813 I/bdA

u011589606的专栏 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

android 开机启动流程分析(15)SystemServer部分服务解读

系列文章解读&说明: Android开机启动流程的分析主要分为以下部分: android 开机启动流程分析(01) init之前启动说明 android 开机启动流程分析(02)init的启动流程分析 android 开机启动流程分析(03)init启动中关键进程 uevent & watchdog android 开机启动流程分析(04)init启动中关键服务-属性服务...

wangdsh的博客 1242

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Android内存优化-剪裁不要服务

【代码】Android内存优化-剪裁不要服务。

Android感染者 765

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java read failed_java.io.IOException: read failed, socket might closed or timeout, read ret: -1

最近项目中连接蓝牙之后接收蓝牙设备发出的指令功能,在连接设备之后,创建RfcommSocket连接时候报java.io.IOException: read failed, socket might closed or timeout, read ret: -1错误,下面说一下我的解决方法,希望对各位有一点帮助。private BluetoothSocket mSocket;private Inpu...

weixin_36363813的博客 2543

内核熵池entropy pool

随机数在许多领域都有重要应用,如Monte Carlo模拟、密码学和网络安全。随机数的质量直接关系到网络安全系统的可靠性和安全性,关系到 Monte Carlo模拟结果的可信度。自从计算机诞生起,寻求用计算机产生高质量的随机数序列的研究就一直是个长期受到关注的课题。Linux内核从 1.3.30版本开始实现了一个高强度的随机数发生器,本文根据Linux 2.6.10内核的源代码,详细分析该随机数产

li4850729的专栏 3873

linux内核熵池,Linux 内核熵池与 /dev/urandom

从计算机随机数谈起我们知道,计算机是一个可预测的系统,因此不可能通过算法来产生真正的随机数。在计算机中,所谓的随机数通常都是伪随机数,就是通过随机算法计算出来的,可以被近似看作随机数的数值。常见的随机数算法有线性同余法(Linear Congruential Generator)、梅森旋转法(Mersenne twister)等,前者是大部分编译器采用的算法,随机性相对差一些;而后者是更为优秀的随...

weixin_42508557的博客 1201

探秘Linux特殊设备文件:(/dev/null,/dev/zero,/dev/random,/dev/urandom等)

探秘Linux特殊设备文件:(/dev/null,/dev/zero,/dev/random,/dev/urandom等)

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 3449

部署apk时gradle编译错误: Cause: duplicate entry: com/xxx/xxx/xxx.class。已解决

运行项目时出现了这个问题,报错的信息意思是某个类有重复入口,而且这个类是个kotlin类。但是同样的代码在同事的机子上就没问题完全可以部署运行。 于是猜想是配置问题,几经周折找到了原因。解决方法是将下图红框中的勾选取消。 以下是错误日志。 org.gradle.api.tasks.TaskExecutionException: Execution failed for tas...

小红威武 8914

android 7.1 apk的systemuid和系统应用Setting相同导致开机找不到库的问题

前言 Android apk加载机制 这就是我最近在解决的一个问题,32位的apk可以用32位的库,那64位的apk可以用64位的库,如果我想64位的apk同时使用32和64位的库呢? android加载so文件的机制 apk在安装的过程中,系统就会对apk进行解析根据里面so文件类型,确定这个apk安装是在32 还是 64位的虚拟机上,如果是32位虚拟机那么就不能使用64位so,如果是64...

嵌入式Linux 3288

信息熵与随机数

在程序开发中,我们经常会用到随机数,确保某个事件发生是具有随机性,不可预测性的。而事实是随机性却不是那么随机,我们大多用的都是伪随机数。那什么才是真随机数呢? 信息熵 什么是熵?在物理学中,熵(entropy)是一个描述系统混乱程度的物理量,熵越大说明系统越无序、越混乱,不确定性越大。例如:一杯水,所有的水分子都是聚集在一起叫低熵,把这杯水静置一段时间,水分子扩散出处,弥漫到整个房间,这...

weixin_30470857的博客 561

Android系统之System Server大纲

Android系统之System Server大纲System Server contentAndroid系统之System Server大纲 前言 System server概要 System server启动的入口 System server启动的过程 总结前言System Server是android 基本服务的提供者,是android系统运行的最基本需求,所有server运行在一个叫syst

FamilyYuan的博客 1万+
上一篇: 虚拟机上装不了ghost版的win7,提示nor find file win7.gho
下一篇: Android System Server
杨鑫校
博客等级 码龄11年 24粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值