0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

分析Android开机启动速度优化(含应用程序优化)

如意 来源:CSDN 作者:Peter盼 2020-06-20 10:51 次阅读

众所周知Android开机启动速度较慢,于是如何加快启动速度便成为一个值得讨论的问题。

在查阅过许多资料后(特别是Google Group的android-platform),我整理总结出下面几点基本看法。

Android开机启动耗时较多的部分有2个,分别是preload classes和scan packages。

这里又数preload classes最为耗时,在我的机子上一般需要13秒左右。实际上,在看过google group众多关于preload class的主题后,基本可以确定以下事实:

preloaded-classes list中预加载的类位于dalvik zygote进程的heap中。在zygote衍生一个新的dalvik进程后,新进程只需加载heap中没有预加载的类(这些后加载进来的类成为该进程所private独有的),这样便加快了应用程序的启动速度。实际上这是一种以空间换时间的办法,因为几乎没有一个应用程序能够使用到所有的预加载类,必定有很多类对于该应用程序来说是冗余的。但是也正如Google所说,智能手机开机远没有启动应用程序频繁——用户开机一次,但直到下次再开机之前可能要运行多个应用程序。因此牺牲一点启动时间来换取应用程序加载时的较快速度是合算的。

preloaded-classes list已经是Google Android工程师使用众多测试工具分析,加以手动微调后形成的最优化预加载列表,涵盖了智能机上最长见的应用类型所需要的各种类。很难想象我们自己能够有什么手段能够获得比这样更优的一个预加载列表。所以,除非你的Android系统是被移植到非智能手机设备上使用(例如MID、EBOOK,可以不需要Telephony相关的类),不建议去“优化”preloaded-classes list。

在zygote中单起一个线程来做preload,是否可行?答案是否定的。首先在zygote中不可以新开线程,其次,就算新开一个线程,在目前智能机硬件条件下(单核CPU),除非有频繁大量的存储IO,否则我们不能看到我们期望加速启动效果。

关于scan packages的问题。同样参考上面提到的那篇帖子,我们从中可以知道一个事实:越少的apk安装,越短的启动时间。事实上确实如此,apk安装的多少的确影响开机速度,但相比而言,scan packages所花费的时间远没有preload classe多。似乎这里没有多少油水可榨,但起码我们知道了:尽量减少产品中预置的apk数量可以提升启动速度(哪怕精简到极致也许只节省了2s)。

最后,关于那篇帖子中提到的start services阶段,我认为虽然此阶段确实需要消耗可观的时间,但是正如文中提到的那样,优化这些services其实就是剔除我们不需要的一些services,而且不仅仅是修改SystemServer.java的问题,任何使用到被优化剔除掉的服务的代码都必须加以修改,否则系统肯定是起不来的。这样工作量大,而且难度也不小,并且有一定风险。因此对这些services的优化要慎之又慎。

那么加快启动速度是不是就没有办法了呢?也不是。除了硬件上的改动,在软件上使用BLCR技术也可以解决这个问题。

在此我认为同时有必要提一下应用程序启动速度加速的问题。用过Android的都会发现,第一次启动某个应用程序时比较慢,但只要不关机重启,大部分情况下以后再次启动就明显的要快许多。因此我们很容易想到一种办法,即“预加载”我们的应用程序一次,那么下次用户再次启动我们时不就快了吗?

我们首先明确一点:任何“预加载”的想法都是不切实际的。先不讨论实施在技术上的可能性,我们只要看一下Android的Activity生命周期管理就应该明白,就算你通过某种方式“预加载”了你的某个Activity,你也不能确保在用户真正要求开始运行它的时候,你所“预加载”的Activity还存在,因为Android很可能在你为“预加载”第一次启动Activity后的不久就将它gc掉了。依靠一个不可靠的技术,显然是不明智的。

那么还有没有别的办法呢?答案是有的,但是只在少数情况下才有一定意义。在源码的frameworks/base/core/res/res/values/arrays.xml中,我们可以看到有名为“preloaded_drawables”的项,其中列出的是Android在启动时预加载的图形资源,这样在某个应用程序需要这些图形资源时就不必再加载了。如果我们某个应用程序包含大量的图形资源,那么我们可以将其加入到这个preloaded_drawables项中以加快我们应用程序的启动速度。但是这样有一个显而易见的弊端:同preload classes一样,不是每个应用程序都需要所有预加载的图形资源,这些冗余的资源反而占据了应用程序进程的内存空间。因此,这种技术实际应用的局限性较大,仅限于这样一种情况:某个设备只运行固定的几个应用程序,而且这些应用程序包含大量的图形资源需要加载。但这样会是一个什么设备呢?

好了,到此基本上把我这两天研究的心得写出来了。限于认识水平有限,如果文中有误或者哪位能有更好的想法,欢迎在下面留言:)如果以后我又有心得,会再更新此文。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android
    +关注

    关注

    12

    文章

    3935

    浏览量

    127372
  • 启动速度
    +关注

    关注

    0

    文章

    2

    浏览量

    6590
收藏 人收藏

    评论

    相关推荐

    HarmonyOS Web开发性能优化指导

    时,Web渲染进程进程会一直存在,节省了用户后续启动Web组件拉起渲染进程的时间,加快页面加载速度。 预解析:预解析指预先对DNS进行解析,可以节省DNS解析的时间,从而优化Web的加载耗时。 预
    发表于 12-06 08:41

    android手机上emulate应用程序的方法

    Android手机上模拟(emulate)应用程序的方法通常涉及到使用Android模拟器(Emulator)或类似的工具来模拟Android环境,以便在没有实际物理设备的情况下运行
    的头像 发表于 12-05 15:33 255次阅读

    如何优化RAM内存使用

    :使用任务管理器查看当前运行的程序和服务,关闭那些不需要的。 禁用启动程序 :减少开机启动项,只保留必要的
    的头像 发表于 11-11 09:58 323次阅读

    如何优化EPS文件以提高加载速度

    在图形设计和排版领域,EPS文件因其高兼容性和高质量输出而广受欢迎。然而,EPS文件往往体积较大,加载速度慢,这在处理大型项目或需要快速迭代时成为了一个瓶颈。 一、了解EPS文件 EPS文件是一种
    的头像 发表于 10-30 14:32 311次阅读

    DRA7xx器件上的Android启动优化

    电子发烧友网站提供《DRA7xx器件上的Android启动优化.pdf》资料免费下载
    发表于 10-11 09:41 0次下载
    DRA7xx器件上的<b class='flag-5'>Android</b><b class='flag-5'>启动</b><b class='flag-5'>优化</b>

    使用TPS61178x优化启动的环路补偿

    电子发烧友网站提供《使用TPS61178x优化启动的环路补偿.pdf》资料免费下载
    发表于 09-25 09:58 0次下载
    使用TPS61178x<b class='flag-5'>优化</b><b class='flag-5'>启动</b>的环路补偿

    优化 FPGA HLS 设计

    30 到 70 种用于综合和布局布线的设置。可能的组合太多了。可以编写脚本来创建不同的运行并尝试推荐的标准指令/策略。 最后一个挑战问题是计算能力不足。典型的嵌入式应用程序是在单台计算机
    发表于 08-16 19:56

    倾斜光栅的鲁棒性优化

    直接纳入优化过程,例如参数变化分析仪。该工具结合了同一系统的多次迭代,在优化过程中实现了评价函数的表示和自动计算,如平均效率。在这个用例中,我们通过稍微改变填充因子来优化倾斜光栅来演示
    发表于 08-12 18:38

    4.3s,Linux快速启动优化方法分享,基于全志T113-i国产平台!

    random设备初始化太慢,应用程序调用random的函数时可能被阻塞,导致应用启动慢,因此可通过关闭crng_ready()功能从而缩短启动时间,关闭crng_ready()功能后启动
    发表于 07-09 11:50

    OpenHarmony之开机优化

    对其进行详细的性能分析,从而优化系统启动速度和运行效率。 三丶开机优化
    发表于 07-01 16:39

    优化嵌入式DSP软件的编译器

    确定哪个索引或一组索引对于优化很重要取决于应用程序开发人员的目标。例如,性能优化意味着开发人员可以使用速度较慢或成本较低的 DSP 来完成相同数量的工作。
    发表于 05-03 09:45 240次阅读
    <b class='flag-5'>优化</b>嵌入式DSP软件的编译器

    设置应用冷启动优化案例

    简介 应用App的启动速度能够影响用户的首次体验,启动速度较慢的应用可能导致用户再次开启App的意图下降,或者卸载放弃该应用程序,所以,AP
    发表于 04-22 16:31

    Linux开机启动方案

    不管组件是否已经安装为系统服务,可以通过开机启动脚本实现 注意,以下操作,均需要设置相关脚本的可执行权限,即 chmod +x 启动脚本 方法一:追加启动命令到默认
    发表于 04-22 09:45 261次阅读

    如何对MD5加密算法优化

    有人针对程序安全启动过程,进行MD5算法的优化嘛。目前采用标准算法,时间稍长,如果有人做过优化的话,可以分享一下,谢谢。
    发表于 02-18 08:20

    谷歌发布新的AI SDK,简化Gemini模型与Android应用程序的集成

    对于 Android 应用程序,Google 提供了 Google AI Client SDK for Android,它将 Gemini REST API 封装为惯用的 Kotlin API
    的头像 发表于 01-03 16:29 936次阅读