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

    文章

    3851

    浏览量

    125639
  • 启动速度
    +关注

    关注

    0

    文章

    2

    浏览量

    6563
收藏 人收藏

    评论

    相关推荐

    设置应用冷启动优化案例

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

    Android ART在玄铁C910上的移植和性能优化

    在过去的3年里,我们在玄铁C910上分别移植了Android 10和Android 12,在ART上我们也做了一些更加深入的优化。在今年 RISC-V 美国峰会上,我们介绍了在ART上移植和
    的头像 发表于 11-16 09:43 899次阅读
    <b class='flag-5'>Android</b> ART在玄铁C910上的移植和性能<b class='flag-5'>优化</b>

    Android移动应用触摸屏的实现和优化原理

    电子发烧友网站提供《Android移动应用触摸屏的实现和优化原理.pdf》资料免费下载
    发表于 10-08 11:02 0次下载
    <b class='flag-5'>Android</b>移动应用触摸屏的实现和<b class='flag-5'>优化</b>原理

    Linux内核启动速度优化的几个方法

    kernel压缩方式 kernel 有不同的压缩格式,常见的如 gz 、 xz 、 lzma 等。 不同的压缩格式,解压速度就不同 ,通过比较不同压缩方式的启动时间和flash占用情况,选择一种
    的头像 发表于 10-04 15:07 393次阅读

    贴片机基本编程贴片程序的步序和优化

    现在,各种不同的贴片机一般都有自动优化软件可以自动对程序进行优化。但是,由于有些程序的结构 复杂,自动优化软件不能做到尽善尽美。在贴片机
    发表于 09-07 15:51 410次阅读

    如何通过讯维无缝切换矩阵提高应用程序的响应速度

    讯维无缝切换矩阵是一种基于云计算的技术,可以通过优化音视频处理和传输,提高应用程序的响应速度。以下是几种方法: 优化视频编解码:讯维无缝切换矩阵可以采用先进的视频编解码算法,对视频进行
    的头像 发表于 08-31 16:23 313次阅读
    如何通过讯维无缝切换矩阵提高<b class='flag-5'>应用程序</b>的响应<b class='flag-5'>速度</b>?

    软件优化指南

    优化对不同的人意味着不同的事情。 在某些情况下,您可能只是希望代码尽可能快地运行。 但是,如果您正在为嵌入式系统编写代码,您可能更喜欢优化代码密度以减少应用程序的内存占用。 通常,这些优化
    发表于 08-28 06:41

    移植和优化用于Arm文档的HPC应用程序

    介绍如何将高性能计算(HPC)应用程序移植到基于ARM的硬件上,如何在移植后开始优化应用程序,以及ARM提供了哪些工具来帮助
    发表于 08-25 07:58

    针对1.0版移动设备上的图形内容的优化建议

    这些主题提供了有关如何通过避免可能导致应用程序运行缓慢或设备过热的常见图形问题来优化Android应用程序的建议。 ARM Mobile Studio可以帮助您识别性能瓶颈,并确定您的
    发表于 08-24 06:57

    T113开发板优化启动速度方法

    以下介绍T113开发板优化启动速度的方法: Uboot修改 1、修改u-boot-2018/cmd/sunxi_burn.c 大约快0.7秒 2、去掉延时bootdelay1秒,修改
    发表于 08-17 17:36

    针对ARM SVE 4.0版移植和优化HPC应用程序文档

    介绍如何将高性能计算(HPC)应用程序移植到基于SVE的Arm硬件,如何在移植后开始优化应用程序,以及Arm提供了哪些工具可以提供帮助。
    发表于 08-10 07:11

    为ARM 3.0版移植和优化HPC应用程序文档

    描述如何将高性能计算(HPC)应用程序移植到基于Arm的硬件,如何在移植后开始优化应用程序,以及Arm提供了哪些工具可以提供帮助
    发表于 08-10 06:37

    优化Unity程序的方法

    优化是接受应用程序并使其更有效率的过程。对于图形应用程序优化通常意味着修改应用程序以使其更快。例如,低帧率的游戏可能会显得跳跃,这会给人留
    发表于 08-02 18:52

    使用Arduino和处理Android应用程序DIY车速表

    电子发烧友网站提供《使用Arduino和处理Android应用程序DIY车速表.zip》资料免费下载
    发表于 07-06 11:23 0次下载
    使用Arduino和处理<b class='flag-5'>Android</b><b class='flag-5'>应用程序</b>DIY车速表

    全志Tina Linux 启动优化

    系统启动后动态生成,理论上也可以节省一定的时间。 rootfs拆分 可以将rootfs拆分成两个部分,一个小的文件系统先挂载执行,大的文件系统根据需要动态挂载。 主应用程序启动优化
    发表于 05-24 10:32