Android 系统性能优化

深度学
• 阅读 3587

这篇不讲细节,讲方法,讲思路。

看到好多人在做系统优化时完全摸不着头脑,毫无章法的乱打乱撞,实在忍不住想说几句,又不好直说,还是写下来做个笔记吧。

什么是 Android 系统?

这看起来是个很简单的问题,但是,你真的清楚 Android 系统到底是怎样运行的吗?搞清楚 Android 系统的本质,是进行系统开发的前提。

系统(更确切的应该叫OS)本质上是通过软件来合理分配和使用硬件资源。从这个角度上看,Android 系统中包含两个主要的部分 Linux 和 ART,其他部分都可以看成在其之上运行的软件。ART 提供了应用运行环境,在系统中可以看做一个相对独立的部分,通常可以做为专项优化。在谈及系统优化时,主要指的是基于 Linux 对 Android 进行优化。

性能优化的本质

前面提到,系统是对硬件资源的分配和使用。这意味着硬件从根本上已经限制住了系统性能上限,而性能优化的目标就是最大限度的使用硬件资源。沿着这个思路,我们可以给出性能优化的几个方向:

  • 硬件能力增强:这个说法有些牵强,因为现在的嵌入式设备都是高集成度的,不可能更换硬件。这里的增强主要是指对CPU、GPU、Memory等重要的硬件单元进行超频。硬件标定的频率都是保守频率,只要处理好散热,通常都可以稳定工作在更高的频率上。超频带来的主要问题是稳定性,在通过完整的压力测试前,不建议修改频率。
  • 硬件资源分配优化:硬件资源是固定的,所以我们优化的方向就是如何有效的利用硬件资源。Linux 和 Android 都是向着通用平台的方向发展,但是当开发具体的产品时,都是有侧重的方向。将硬件资源向重点功能倾斜,就是优化的方向。这里涉及到的技术有:Cgroup、优先级调整、CPU频率范围调整、CPU核绑定等。
  • 调度策略优化:Linux 是一个通用系统,它的调度策略必然是平衡的,我们可以根据具体产品形态来调整调度策略。这里涉及的技术有:CPU调度策略、I/O调度策略、内存回收策略、Thermal策略、文件系统调优等。
  • 软件运行效率优化:我们必须承认一个事实,软件开发过程中对性能的考虑比较少。大部分的软件都有可优化的空间。当然我们不会对所有软件都进行优化,我们需要找到关键的软件。除了在代码上优化,还可以使用GPU、NPU等硬件加速单元来优化软件。
  • 应用层的系统资源优化:有时,系统上的硬件资源优化无法满足我们的需求。因为在系统运行时,应用层是最清楚哪些进程是重要的。应用层可以通过保留重要进程、释放不重要的进程来协调系统资源的使用。这里的核心就是平衡,保证用户最关心的进程获得足够资源。

性能优化方法

其实系统性能优化没有标准的方法步骤,大致方向就是上述的五个。可以所有方向都做优化,也可以只沿着一个方向做优化,只要最终的性能指标符合要求就完成优化工作。这里的关键点就是:

  • 如何判定优化符合性能指标。
  • 如何找到优化点。

确定上述两个关键点就是工具,这也是性能优化的核心。为什么好多人在做性能优化时天马行空,就是因为他们根本不知道核心是什么。我们需要工具(无论是系统自带、还是自己开发、还是第三方)来测量系统性能,确定优化的目标。我们也需要工具来寻找优化点,仅靠猜测是不靠谱的。Android 本身带有很好的性能调试工具,Linux 上也有大量的开源工具,只要想用就是很容易的事。如何根据工具的数据来确定优化的方式,这就是考验工程师能力的时候。但是如果你不使用工具,就算解决了性能问题,我也会鄙视你。

最后,需要强调的是硬件资源是确定的,系统性能优化需要做的就是平衡资源的使用。性能优化没有固定的方法,也没有捷径可走。使用工具找到性能消耗多的地方,一点点的优化、一ms一cycle的抠就是性能优化需要做的事情。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
Java中Class对象详解
<divclass"htmledit\_views"id"content\_views"<phttps://blog.csdn.net/mcryeasy/article/details/52344729<br</p<p待优化整理总结</p<p</p<h1style"padding:0px;fontfamily:'apple
Stella981 Stella981
3年前
Exceptionless
<divid"cnblogs\_post\_body"class"blogpostbodycnblogsmarkdown"<h1id"exceptionless.netcore开源日志框架"Exceptionless.NetCore开源日志框架</h1<blockquote<p作者:markjiang7m2<b
Stella981 Stella981
3年前
Django之Django模板
1、问:html页面从数据库中读出DateTimeField字段时,显示的时间格式和数据库中存放的格式不一致,比如数据库字段内容为2012082616:00:00,但是页面显示的却是Aug.26,2012,4p.m.答:为了页面和数据库中显示一致,需要在页面格式化时间,需要添加<td{{dayrecord.p\_time|date:
Stella981 Stella981
3年前
Android项目如果要将自己写的类写成要单独打成jar包?
<p<h需求条件:</h1</p<p自己没做过android,公司android开发临时有事请假了,老板说让我研究研究,反正都是java。我心里“XXXXXX”。这篇用来自己做个记录,老手请略过,Android新手临时替岗而已。前提是自己的类中含有用到Android的类库</p<p<h解决方案:</h1</p这module新建的时候
Stella981 Stella981
3年前
Android自动化性能收集
<h1Android自动化性能收集</h1<pAndroid功能测试自动化框架较多,UIAutomator,Robotium,Appium等。Case执行过程中,可能希望收集手机的性能指标,包括内存、cpu、流量等。使用javashellbat简单实现了android手机性能收集。</p<h2简述</h2<p过程很简单:</p
Wesley13 Wesley13
3年前
Unity横屏
Android下发现Unity里面的Player设置,并不能完全有效,比如打开了自动旋转,启动的时候还是会横屏,修改XML添加以下代码<applicationandroid:icon"@drawable/ic\_launcher"                    android:label"@string/app\_name"
Wesley13 Wesley13
3年前
PHP算法之判断是否是质数
<h3质数的定义</h3<blockquote质数又称素数。一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数;否则称为合数。</blockquote<h3实现思路</h3<p循环所有可能的备选数字,然后和中间数以下且大于等于2的整数进行整除比较,如果能够被整数,则肯定不是质数,相反,就是质数。</p<h3第一种算
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(