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

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

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

这里又数preload classes最为耗时,在我的机子上一般需要13秒左右。关于preload classes的优化,可以参见http://www.eoeandroid.com/thread-29953-1-1.html。这篇帖子并没有给出如何优化preloaded-classes
list的具体取舍。实际上,在看过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技术也可以解决这个问题。在http://blog.csdn.net/shuaiff/archive/2010/09/19/5894646.aspx这篇文章中比较详细的介绍了BLCR技术在Android上的应用情况。个人认为应用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开机启动速度优化(含应用程序启动速度优化)的更多相关文章

  1. 安卓开发_浅谈Android动画(四)

    Property动画 概念:属性动画,即通过改变对象属性的动画. 特点:属性动画真正改变了一个UI控件,包括其事件触发焦点的位置 一.重要的动画类及属性值: 1.  ValueAnimator 基本属 ...

  2. 浅谈Android应用性能之内存

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 文/ jaunty [博主导读]在Android开发中,不免会遇到许多OOM现象,一方面可能是由于开 ...

  3. 浅谈android代码保护技术_ 加固

    浅谈android代码保护技术_加固 导语 我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk,结果被人反编译了,那心情真心不舒服.虽然我们混淆,做到native层,但 ...

  4. 浅谈Android保护技术__代码混淆

    浅谈Android保护技术__代码混淆   代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为.将代码中的各种元 ...

  5. 浅谈Android应用保护(一):Android应用逆向的基本方法

    对于未进行保护的Android应用,有很多方法和思路对其进行逆向分析和攻击.使用一些基本的方法,就可以打破对应用安全非常重要的机密性和完整性,实现获取其内部代码.数据,修改其代码逻辑和机制等操作.这篇 ...

  6. 浅谈Android五大布局

    Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是LinearLay ...

  7. [转]浅谈Android五大布局(二)——RelativeLayout和TableLayout

    在浅谈Android五大布局(一)中已经描述了LinearLayout(线性布局).FrameLayout(单帧布局)和AbsoulteLayout(绝对布局)三种布局结构,剩下的两种布局Relati ...

  8. [转]浅谈Android五大布局(一)——LinearLayout、FrameLayout和AbsoulteLayout

    Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是LinearLay ...

  9. 浅谈Android Studio3.0更新之路(遇坑必入)

    >可以参考官网设置-> 1 2 >> Fantasy_Lin_网友评论原文地址是:简书24K纯帅豆写的我也更新一下出处[删除]Fa 转自脚本之家 浅谈Android Studi ...

随机推荐

  1. [转]深入WPF--Style

    Style 用来在类型的不同实例之间共享属性.资源和事件处理程序,您可以将 Style 看作是将一组属性值应用到多个元素的捷径. 这是MSDN上对Style的描述,翻译的还算中规中矩.Style(样式 ...

  2. s3fs 挂载minio为本地文件系统

    https://github.com/s3fs-fuse/s3fs-fuse echo ACCESS_KEY_ID:SECRET_ACCESS_KEY > ${HOME}/.passwd-s3f ...

  3. 数据交换格式之 - XML

    XML简介 XML是一种可扩展的标记语言,被设计用来传输和存储数据.传输数据. 需要自定义标签,自我描述性,XML是W3C的推荐标准: XML的特点与作用 特点: xml与操作系统.编程语言的开发平台 ...

  4. 使用C#反射实现用户控件调用父页面方法

    using System.Reflection; MethodInfo mi = this.Page.GetType().GetMethod("GetUserName"); //该 ...

  5. 常见Idea插件

    一.Maven Helper Maven Helper用来查找和排除Jar包冲突的依赖关系. 安装: 打开Idea的Settings→Plugins→在输入框中输入“maven helper”→点击I ...

  6. TZOJ 5094 Stringsobits(DP)

    描述 Consider an ordered set S of strings of N (1 <= N <= 31) bits. Bits, of course, are either ...

  7. Leetcode405Convert a Number to Hexadecimal数字转换为十六进制数

    给定一个整数,编写一个算法将这个数转换为十六进制数.对于负整数,我们通常使用 补码运算 方法. 注意: 十六进制中所有字母(a-f)都必须是小写. 十六进制字符串中不能包含多余的前导零.如果要转化的数 ...

  8. create user

    create创建的用户,只有usage权限,即,连接数据库的权限,最低的权限. # 1.新建用户,这里的用户是由user_name 和ip一起唯一确定一个用户.# 2.若省略ip表达式,则表示%,即所 ...

  9. Django项目:CRM(客户关系管理系统)--24--16PerfectCRM实现King_admin日期过滤

    登陆密码设置参考 http://www.cnblogs.com/ujq3/p/8553784.html list_filter = ('date','source','consultant','con ...

  10. TZ_08_maven私服项目的上传和下载

    1. 需求 正式开发,不同的项目组开发不同的工程. ssm_dao工程开发完毕,发布到私服. 2下载 nexus   Nexus 是 Maven 仓库管理器,通过 nexus 可以搭建 maven 仓 ...