Android 启动性能优化 - kernel篇

linux 内核优化配置(企业级配置优化) 安装BBR;升级内核到最新版本/5.0.2 载入公钥和yum源 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm yum install -y yum-plug... 阅读详情

转自: http://blog.youkuaiyun.com/kickxxx/article/details/7291173


题目有点大,其实kernel的启动性能调整和android基本没什么关系,我想应该适用所有使用linux的嵌入式设备

时间测量

说到性能调整,第一件该干的的事就是看下时间到底消耗在哪里。俗话说的好:知己知彼,百战百胜;过度优化,万恶之首

因此手头上要有称心如意的时间测试工具,方法。其实我是不太喜欢工具的,工具这东西可遇不可求,而且不如写代码顺手。

1. PRINTK_TIME

在内核编译选项中打开CONFIG_PRINTK_TIME,重新编译内核后,系统启动后就可以看到每一条printk前都有一个时间戳了,这样就有个大概的轮廓,哪

个驱动消耗了更多的时间,当然这个信息对我们性能调整来说粒度太粗了

2. initcall_debug宏

上面的PRINTK_TIME只是在printk附加上当时的系统时间,对于那些没有printk信息输出的驱动来说是无法提供启动时间信息的,initcall_debug派上了用场,打开这个宏后,每个驱动的初始化起始时间和结束时间都打印出来了。有了这个时间,基本就可以确定哪些部分需要优化了。我的做法是只关注耗时10000us以上的驱动。

3. ktime_t

调用ktime_get 获取时间,我最喜欢的时间测量方法,对于可疑的耗时函数,可如下测试

ktime_t start, end;

start = ktime_get()

candidate_func(arg...)

end = ktime_get()

printk(KERN_ALERT "%s:  start time=%d.%d, end time=%d.%d\n", __func__, start.tv.sec, start.tv.nsec, end.tv.sec, end.tv.nsec);

可以很准确的计算candidate_func的时间,当然如果candidate_func中引发了调度,时间就没那么准确了。

4 printk

尽量去掉printk对时间测量的影响,可以调整kernel/printk.c中的DEFAULT_CONSOLE_LOGLEVEL宏,把级别较低的信息去掉


性能优化方法

1. hard code lpj,在uboot启动参数增加 lpj=3997696. 其中的3997696替换为你的机器启动信息获取的值,这个一般能节省200ms

2. 裁剪内核,这块比较大,要单独开一篇来介绍,裁剪的好处有两点:第一减少kernel的尺寸,这也就相应的减少了加载kernel image的时间,第二也减少了不必要的初始化

3. 代码调整:

根据时间测试,找到耗时瓶颈,看看是否能进行优化。

  • 移除修改驱动中不必要的sleep 和delay
  • 检查耗时的i2c操作,能否替换单个i2c寄存器读写为多个i2c寄存器读写,当然这需要硬件支持
  • 推迟module init中不必要的操作到其他地方,比如open函数中,我觉得设备上下电,以及设备初始化都可以考虑移到初次使用设备时进行。
  • 去掉hotplug helpers,因为android仅使用netlink来发送uevent事件。但是如果设置了hotplug helpers,那么当一个设备执行了uevent事件,就会从kernel尝试调用这个hotplug helper程序(即便这个helper程序并不存在),这个过程是很消耗时间的。
  • 在某些场合,用mdelay替换init function中的msleep,由于嵌入式设备的HZ是100,因此msleep(1)导致系统调度后,需要10几ms才能重新调度回来,所以对于msleep 5ms以下都可以替换为mdelay
  • 使用async_schedule调用module的probe函数,对于那些需要较多msleep的模块,这个方法可以通过并行提高init速度,但是一些模块对初始化顺序是有依赖的,所以慎用

4. 优化设备IO驱动,提高数据的读写速度,kernel启动完成到android launcher完成,几乎无处不涉及到文件的读写,IO速度对启动时间的影响重大,代码是人写的,所以平台特定的IO代码绝对有优化的空间


性能优化结果

最终优化后的结果是kernel从启动到init.rc大概需要0.5秒左右,当然具体优化到什么程度,和kernel需要加载的驱动是密切相关的。
安卓启动性能优化:使用bootchart分析启动瓶颈与优化策略 在嵌入式系统和移动开发领域,系统启动性能是衡量用户体验和产品竞争力的关键指标。启动过程涉及从内核初始化到用户空间服务就绪的复杂时序,传统盲测方法效率低下。性能分析工具通过采集进程CPU、磁盘I/O和时序数据,生成可视化图表,帮助开发者透视启动黑盒。其技术价值在于以极低开销实现无侵入式监控,精准定位如Zygote预加载、服务初始化阻塞等瓶颈。在安卓系统优化场景中,该工具能有效识别CPU密集型任务和磁盘I/O瓶颈,指导并行化初始化、调整服务启动顺序等优化实践。本文聚焦bootchart这一启动分析利器,详解其数 阅读详情

相关推荐

全志平台BSP裁剪(3)附件二 Kernel hacking配置说明

Kernel hacking 说明:内核hack选项 Show timing information on printks CONFIG_PRINTK_TIME 在控制台和syslog()系统调用的输出中包含printk()消息的时间戳,以便于直接显示内核启动过程中各步骤所用的时间.注意:无论此项是否开启,时间戳总会被记录在/dev/kmsg中,开启此项仅相当于使用"printk....

jzwjzw19900922的博客 1532

android确定kernel使用的config文件

由于android下的kernel配置与linux下的menu方式有了改变,所以我们不能直接将arch/arm/configs下的配置文件拷贝为.config后再进行make. 在arch/arm/configs下有很多的config文件,但是我们如何确认android当前的项目使用的是哪一个config文件勒。 请查看devices/manufactor/project/AndroidBoard...

madannasf的博客 3056

CMOS中的 latch-up 闩锁效应、添加tap解决latch-up、使用combained area绘制TAP TAP的作用 IC后端版图【VLSI】

本文详细阐述了闩锁效应latch-up问题、如何通过添加Tap来解决。详细讲述了如何通过combained area来绘制TAP

Jie_MSD的博客 1万+

linux打印中时间信息

使能 CONFIG_PRINTK_TIME之后,内核每行打印前面有时间信息,本文探讨一下相关代码以及时间信息的含义。   | CONFIG_PRINTK_TIME:   |   | Selecting this option causes timing information to be   | included in printk output.  This allows you to

adaptiver的专栏 1万+

用户存续期价值评估(CLV) 一

用户存续期价值评估(CLV) 1 一. 定义 ​     用户存续期价值(Customer Lifetime Value),也可称为CLTV、LCV或者LTV,是企业对未来一个客户与其的关系所带来的净收益的预测。这个预测模型可以有不同水平的复杂度和精确度,从一个直观感觉到使用复杂的预测技术。CLV可以被简单理解为客户关系的价值,也就是未来由于与客户的关系所带...

weixin_43171270的博客 8026

国产FPGA逆袭!深度评测复旦微RFVU3P5G核心板在相控阵雷达中的表现

本文深度评测了复旦微RFVU3P5G核心板在相控阵雷达中的实战表现。该核心板凭借射频直采架构、高采样率ADC/DAC及丰富的DSP资源,在多通道同步精度、动态范围及系统稳定性等关键指标上表现出色,展现了国产FPGA在高端雷达应用中的硬核实力与供应链自主价值。

b0c1d2的博客 724

android 内核编译时间戳,Android 启动性能优化 - kernel篇

题目有点大,其实kernel的启动性能调整和android基本没什么关系,我想应该适用所有使用linux的嵌入式设备时间测量说到性能调整,第一件该干的的事就是看下时间到底消耗在哪里。俗话说的好:知己知彼,百战百胜;过度优化,万恶之首因此手头上要有称心如意的时间测试工具,方法。其实我是不太喜欢工具的,工具这东西可遇不可求,而且不如写代码顺手。1. PRINTK_TIME在内核编译选项中打开CONFI...

weixin_39656686的博客 601

ARM CoreSight架构

CoreSight架构是现代复杂SoC的“飞行数据记录仪”(黑匣子)和“精密诊断仪”的结合体。它彻底改变了嵌入式系统的调试方式,从传统的“盲人摸象”变成了拥有“上帝视角”,是ARM生态系统能够支撑起从微控制器到高性能服务器芯片如此广泛产品线的重要基石技术之一。

guigenyi的专栏 1422

【Android性能优化】启动速度优化

Android系统关机重启的时间是比较长的,一般重启在25s算可以的,大多在30s左右,刷机或者恢复出厂设置启动时间还会更久,达到1,2分钟都可能 那么,有没有可以优化的地方,提高启动速度呢? Android系统优化部份,如果启动速度能达到10s已经是很牛的咯 我们可以从下面几个方面着手优化启动速度 Bootloader优化(Boot,U-Boot) Android OS优化与裁剪(...

wuhuiyi10的专栏 744

微机原理课程设计-模拟十字路口交通信号灯

一、设计任务描述 1.1设计目的 通过课程设计使学生更进一步掌握微机原理及应用课程的有关知识,提高应用微机解决问题的能力,加深对微机应用的理解。通过查阅资料,结合所学知识进行软、硬件的设计,使学生初步掌握应用微机解决问题的步骤及方法。为以后学生结合专业从事微机应用设计奠定基础。 1.2 设计要求 控制LED灯,按照十字路口红绿灯的原理亮灭显示: (1) 东西方向车辆放行x秒...

Learning_is_endless的博客 2万+

AMD Ross FPGA Agent 实战:用 AI 驱动 Vivado 开发流程

在 EDA 领域,FPGA 开发长期面临工具链重、反馈周期长、报错晦涩等痛点。AI Agent 通过自然语言交互与工具调用,将 Vivado 的 Tcl 批处理流程封装为可编排、可观测的智能体,显著降低查文档与读报告的时间成本。其核心在于 Harness 与 Agent 的协同:Harness 提供安全执行环境,Agent 负责决策与迭代。典型应用包括工程创建、约束生成、综合实现报告解读及比特流失败排查。本文以 AMD Ross 为例,拆解其架构设计与实操方法,帮助开发者理解如何将 Agent 落地到高门槛

weixin_29189363的博客 1029

Kernel Flasher:安卓内核管理的终极解决方案

在安卓设备优化领域,**内核管理工具**始终扮演着至关重要的角色。今天我们要介绍的Kernel Flasher,就是一款专为安卓用户设计的强大**内核管理工具**,它通过简单直观的操作界面,让普通用户也能轻松掌握**安卓内核刷写**和**内核备份恢复**等高级功能。 ## 核心功能全面解析 ### 一键刷写内核 Kernel Flasher支持直接刷入AK3格式的内核文件,让您无需复杂的命令行

gitblog_00058的博客 462

基于Abaqus的横向各向同性线弹性理想塑性材料模型的umat子程序实现——以Fortran为例,带您揭秘弹性塑性模型编程之道

通过以上步骤,我们已经在Abaqus中使用Fortran实现了横向各向同性线弹性理想塑性材料模型的umat子程序。在实际应用中,我们需要根据具体的材料特性和加载条件来调整模型参数和计算过程。尽管我在这篇文章中尽力提供了详细的教程,但由于我自身的知识限制和经验不足,可能会有误解或错误。我希望大家在学习过程中能多思考,多实践,多交流,以更好地理解和掌握这个主题。

qq_38334677的博客 1690

Android Common Kernel 使用指南

Android Common Kernel 使用指南 1. 项目介绍 Android Common Kernel 是一个开源项目,旨在为 Android 设备提供稳定且兼容的 Linux 内核。该项目基于上游 Linux 内核,整合了适用于 Android 设备的补丁和修改。通过此项目,开发者可以为多种 Android 设备提供一个统一的内核版本,从而简化开发流程并提高效率。 2. 项目快速启动 ...

gitblog_01114的博客 1085

Dify知识库文档批量下载神器:一键导出所有文件到本地

在使用Dify进行知识库管理的过程中,我们经常遇到一个实际问题:如何将已上传到知识库中的文档批量下载到本地?目前Dify的管理界面虽然功能强大,但暂时没有提供直接的UI界面来批量导出或下载知识库内的文档。这意味着如果我们需要将知识库中的文件备份到本地或进行离线处理,只能通过API接口来实现。本文将详细介绍如何利用Dify的REST API构建一个完整的知识库文档下载解决方案,这也是目前实现知识库文件批量下载到本地的唯一可行路径。🎉进入大模型应用与实战专栏 | 🚀查看更多专栏内容首先,我们需要在Dify的

羊城迷鹿的博客 3473

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android 性能优化 【总篇:深入浅出】

本篇的主要针对整机性能的一个解读,主要拆解整机性能有哪些小的领域,对应的测试用例是怎么样的,这类问题优化思路是怎么样的。各家厂商针对性能的测试都设计了不同的用例,因此针对性能测试其实是比较五花八门的。我这里凭着经验来总结一下通常都有哪些场景和性能测试相关。

qq_27672101的博客 513

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android 性能优化【篇二:开机时延分析流程】

这篇文章为 Android 系统工程师提供了一套从理论到实践的完整开机速度优化指南,涵盖了流程分析、日志定位、案例排查及代码级修改方案,具有极高的实战参考价值。

qq_27672101的博客 1453

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android 启动性能优化 - uboot篇

http://blog.youkuaiyun.com/kickxxx/article/details/7361715 时间测量 在mx51平台上,使用get_timer可以获得比较精确的计时,get_timer的使用贯穿了uboot性能调整的整个过程 性能优化方法 1. 减小uboot镜像的大小,去掉不需要的驱动,不需要的命令,减少uboot的大小可以从两个方面获得好处,首先会节省驱动

lqxandroid2012的专栏 1178

Android开机启动性能-初探

Android开机启动性能优化-初探分析手段logkernel loglogcat logbootcharttrace我的分析过程kernel logbootchartSystemServersystracePMSbootanimationearlyconlogcat参考连接 分析手段 log kernel log 查看启动阶段的kernel log,如果kernel有大量丢失,就注释掉printk.c中如下逻辑,log才不会被过滤。 if (!(devkmsg_log & DEVKMSG_LOG_

Tecinno4的博客 1287

10个SmartPack-Kernel-Manager实用技巧:提升Android设备性能的秘诀

SmartPack-Kernel-Manager是一款强大的Android内核管理工具,能够帮助用户轻松优化设备性能、延长电池寿命并自定义系统功能。本文将分享10个实用技巧,让你充分发挥这款工具的潜力,打造更流畅、更高效的Android体验。 ## 1. 快速访问核心功能:掌握主界面导航 SmartPack-Kernel-Manager的主界面设计直观,提供了丰富的内核管理选项。从Statis

gitblog_00459的博客 1022
上一篇: 修复被破坏了的linux文件系统分区表
下一篇: 技术达人必备
RyanLeiWang
博客等级 码龄20年 184粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值