Android 应用程序快速启动的秘诀

 

Android 系统 框架和上层应用 是类 java( 不是正统的 sun java) 开发 的,实现了自己的 java 虚拟机 dalvik ,既然用 java 虚拟机和 java 开发,一般都会认为效率低下。其实不然,在基本主流的智能手机软件 平台 上, android 的执行速度是最快的。

 

那么 android 效率为什么这么的高呢 ? 特别是一个应用程序 的启动时间很短,本文主要从以下个八方面进行分析:

 

1 资源 文件 的优化读取。

我们知道 android UI 开发时有个很大的好处是 xml 文件来描述 UI ,这样有个好处是只要修改 UI 不用修改代码 就可以修改界面 的布局、显示风格和字体大小等。界面定义 变得灵活方便。 xml 配置 UI qtopia 运用也有但是这么强大并且也不广泛,因为 xml 文件有个不足是解析 xml 的效率很低。

Android 是怎么做的呢 ?

Android 编译 的时候就把 xml 文件进行了优化, android 应用程序 在解析时变得非常的高效。我们看到 apk 文件解压后会有个优化过的资源文件。

 

2 安装时进行优化 dex 文件

Android 的应用程序都打包成一个 apk 文件,实际上就是一个 zip 文件。系统第一次起来或应用程序第一次安装时,系统就把 apk 文件解压了,把可执行文件 dex 优化成 odex 文件并放在 /data/dalvik-cache 目录下。优化后的 dex 文件启动速度会加快。这解释了为什么 android 系统第一次启动是比较慢,以后起来很快了。

可能有人会问:为什么不在编译时直接优化呢 ? 第⑤项会回答这个问题。

 

3 制作数据库

Android 的图形应用是加载 整个 sd 卡内的所有图像的,但是为什么很快呢 ? 其实 android 提前把数据 做成了数据库,所以不用每次扫描整个这个 sd 卡,大大加快了启动速度。

 

4 高效的虚拟机

Android 是基于类 java 虚拟机 dalvik ,一般的 java 虚拟机是基于栈的,而 dalvik 是基于寄存器的。实事求是说我对两者的区别了解不是很深入,不过网上有专门的相关文论进行分析。我的简单理解是栈的实现方式相对容易,相关数据是在内存中的栈里,而操作寄存器里数据的速度明显快与内存里的数据处理。

 

5 充分挖掘 CPU 的性能

Android 刚出来的时候虽然支持 arm cpu ,实际上只支持 armv5te 的指令集的,因为 android 系统专门为 armv5te 进行了优化,充分利用 armv5te 的执行流水线来提高执行的效率,这也是在 500M 的三星 2440 运行 效果 不是很好,而在 200M omap cpu 上运行比较流畅的原因了,所以在最新的代码中有专门针对 x86 armv4 的优化部分。

 

6 优化和裁剪的 libc

Libc 库几乎是所以库和程序的基础,但是 android 没有直接利用 libc 库,而是自己开发了一个库: bionic ,它实现了 libc 库的绝大多数的函数并根据平台进行了优化,但是有系统很少用并且消耗资源的少数函数是不支持的。它只有几百 k ,节省了空间同时也提高了执行效率。实际上体现了 20-80 原则,抓住少数重要的适当舍弃不必要的。

 

7 充分利用 linux 系统特性

分析过 linux 内核的朋友知道, linux fork 一个新的进程是非常高效的,利用了 COW 机制。 Android 是每个进程是个独立的虚拟机 ( 听说这么设计 是为安全考虑,某个时候进程崩溃了不会影响这个系统和其他进程。 )android 里每个进程都是基于虚拟机的,并且也要加载基本的库,实际上这些都是共享。所以 android 启动一个新的程序实际上并不消耗很多的内存和 cpu 资源。

同时 android 在后台有个 empty process 运行,实际上就是运行一个虚拟机,当要启动一个应用时就直接在其上继续运行, qtopia 也有这个机制。

Android 系统在开机流程中:启动虚拟机—》启动 system server ? 》启动 launcher 。当初分析代码时疑惑为什么不直接启动 system server?(qtopia 就是直接启动 server) ,实际上也利用了 linux 的这个特性。

这个特性说的比较简略,不过要真的把他解释清楚可能需要很大的篇幅。

 

8 高效的 paint 机制

这个特性可能跟启动关系不大,但是也是 android 高效的特性之一。界面变化时大部分实际上不是全屏内容变化的,只是局部变化, android 会根据变化的内容只是跟新局部的内容,也提高了效率。这个也提醒我们在开发应用程序时,重载 paint 方法时尽量不要 paint 全屏内容。

http://www.eoeandroid.com/thread-28579-1-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值