Android系统的启动优化主要分为三大部分:

(1) Bootloader优化

(2) Linux Kernel的剪裁与优化

(3) Android OS部分的剪裁与优化

本文重点关注Android OS部分的启动优化,值得关注的优化点分别介绍如下:

1. 精简preload的classes和resource

前面介绍过,由于所有的Android应用程序都是从Zygote进程fork出来的,所以为了共享一些class和resourse资源,Zygote进程初始化过程中,会预先加载一些常用的java class和资源文件到进程的内存中,这样其他应用fork出来后就不用再次加载了,从而提高了应用的启动速度。

这个过程是可以精简和优化的,你可以减少一些classes和resource的加载,从而加快系统的启动速度。本过程涉及到的文件:

frameworks/base/preload-classes

frameworks/base/core/res/res/values/arrays.xml

2.  精简native service和java service

前面介绍过,Android OS的启动本质上就是启动一系列的本地服务和Java服务,Android系统的所有功能都是通过这些服务间接提供的。

这些服务有很多并不是必须启动的,根据业务需求可以去掉一些,本过程涉及到的文件:

system/core/rootdir/init.rc

frameworks/base/services/java/com/android/server/SystemServer.java

3.  精简预装的apk文件

系统启动过程中,会扫描系统指定目录下的所有apk文件,这个过程也是非常耗时的,预装的apk文件越少,系统启动速度也就越快,因此,精简预装apk也是优化系统启动速度最重要的手段之一。

要想减少预装的apk文件,则需要分析系统的build文件,将不需要的apk编译选项删除掉,本过程涉及到的文件:

build/target/product/xxxx.mk

device/<company>/<product>/xxxx.mk

vendor/..../xxxx.mk

4.  减少内核的log打印级别

过多的log打印消息会显著地增加系统启动的时间,log打印级别有多处可以调整,推荐修改init.rc文件中的loglevel来改变log打印级别。

system/core/rootdir/init.rc

5.  其他优化手段

上面介绍的都是最常用的优化手段,其实还有很多其他的方法,简单列举如下:

(1) 优化启动动画,降低帧率和图片尺寸

(2) 精简系统,减小boot.img文件大小,可以显著减少启动过程中加载和解压boot.img的时间

(3) 预先创建一些目录和文件,而不是在init过程中创建

(4) 其他……

6.  小结

这里我给出一位国外的高手优化的结果作为比较和参考(我的优化结果只提高了20%的启动速度,远没有达到他的效果):

转:http://ticktick.blog.51cto.com/823160/1664754

Android内核开发:系统启动速度优化-Android OS启动优化(转)的更多相关文章

  1. Android内核开发:理解和掌握repo工具【转】

    本文转载自:http://ticktick.blog.51cto.com/823160/1653304 由于Android源码是用repo工具来管理的,因此,搞Android内核开发,首先要搞清楚re ...

  2. Android NFC开发(二)——Android世界里的NFC所具备的条件以及使用方法

    Android NFC开发(二)--Android世界里的NFC所具备的条件以及使用方法 NFC的应用比较广泛,而且知识面也是比较广的,所以就多啰嗦了几句,我还还是得跟着官方文档:http://dev ...

  3. uni-app&H5&Android混合开发三 || uni-app调用Android原生方法的三种方式

    前言: 关于H5的调用Android原生方法的方式有很多,在该片文章中我主要简单介绍三种与Android原生方法交互的方式. 一.H5+方法调用android原生方法 H5+ Android开发规范官 ...

  4. 使用 Android Studio 开发工具创建一个 Android 应用程序,显示一行文字“Hello Android”,并将应用程序的名称更改为“FirstApp”。

    需求说明: 使用 Android Studio 开发工具创建一个 Android 应用程序,显示一行文字"Hello Android",并将应用程序的名称更改为"Firs ...

  5. 使用 Android Studio 开发工具创建一个 Android 应用程序,并在 Genymotion 模拟器上运行

    需求说明: 使用 Android Studio 开发工具创建一个 Android 应用程序,并在 Genymotion 模拟器上运行 实现步骤: 打开 Android Studio,创建一个 Andr ...

  6. 【Android 应用开发】 Ubuntu 安装 Android Studio (旧版本|仅作参考)

    . 果断换Ubuntu了, Ubuntu的截图效果不好, 不能设置阴影 ... 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article ...

  7. Android 面试必备 - 系统、App、Activity 启动过程“一锅端”

    Android 系统启动过程 从系统层看: linux 系统层 Android系统服务层 Zygote 从开机启动到Home Launcher: 启动bootloader (小程序:初始化硬件) 加载 ...

  8. 写给Android App开发人员看的Android底层知识(2)

    (五)AMS 如果站在四大组件的角度来看,AMS就是Binder中的Server. AMS全称是ActivityManagerService,看字面意思是管理Activity的,但其实四大组件都归它管 ...

  9. 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解 (旧版本 | 仅作参考)

    . 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...

随机推荐

  1. 通过jdbc获取数据库中的表结构

    通过jdbc获取数据库中的表结构 主键 各个表字段类型及应用生成实体类   1.JDBC中通过MetaData来获取具体的表的相关信息.可以查询数据库中的有哪些表,表有哪些字段,字段的属性等等.Met ...

  2. Chrome 插件: 起动本地应用 (Native messaging)

    Chrome 插件: 起动本地应用 (Native messaging) www.MyException.Cn  网友分享于:2014-08-01  浏览:3次   Chrome 插件: 启动本地应用 ...

  3. 如何设置nesC在vim中语法高亮

    默认的vim没有支持nesC语法高亮,给阅读源码带来不便.不过可以通过装NesC Syntax Highlighting插件来解决这个问题,具体操作如下:   步骤一:下载插件 在http://www ...

  4. xsd、wsdl生成C#类的命令行工具使用方法

    1.xsd生成C#类命令 示例:xsd <xsd文件路径> /c /o:<生成CS文件目录> <其他参数> 参数说明: /c 生成为cs文件,/d 生成DataSe ...

  5. node的实践(项目一)

    学习一门语言,我们先要学习他的基本的语法,基本的数据类型,基本的数组操作,字符串的操作,然后就是语言的特性,实现共享和降低耦合的方式,然后开始比较高级的学习(所有语言都是一样的),比如说通信方法,tc ...

  6. [设计模式] javascript 之 适配器模式

    适配器模式说明 说明: 适配器模式,一般是为要使用的接口,不符本应用或本系统使用,而需引入的中间适配层类或对象的情况: 场景: 就好比我们买了台手机,买回来后发现,充电线插头是三插头,但家里,只有两插 ...

  7. ORA-12737: Instant Client Light: unsupported server character set CHS16GBK/ZHS16GBK解决方案

    二.Navicat for Oracle的配置 1.启动该工具,出现如下的开始界面,单击“连接”选项,进行连接数据库,如图所示: 6.在“新建连接”对话框中,输入任意的连接名,选择默认的连接类型,输入 ...

  8. 360极速浏览器使用postman

    Postman-REST-Client_v0.8.4.14.zip文件请加群下载:74085440 步骤如下: 1.将crx文件打包成zip文件 2.解压打包的zip文件,并将_metadata文件夹 ...

  9. Hibernate-缓存

    Hibernate是一个持久层框架,经常访问物理数据库.为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在 ...

  10. linux 通过哪个命令可以查看某个服务及其端口、进程号

    netstat/lsof netstat命令用于显示与IP.TCP.UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况 -a 显示一个所有的有效连接信息列表(包括已建立的连接,也 ...