Android 开机启动速度优化

一 在开机启动中,可以借助bootchart 工具分析android的启动过程。bootchart是一个用于linux启动过程性能分析的开源软件工具,在系统启动过程自动收集CPU占用率、进程等信息,并以图形方式显示分析结果,可用作指导优化系统启动过程。

1、UBuntu下安装bootchart工具

需要安装的工具有两个bootchart和pybootchartgui,执行命令如下:

点击(此处)折叠或打开

  1. sudo apt-get install bootchart
  2. sudo apt-get install pybootchartgui

需要注意的是:在ubuntu 10.04 版本上的bootchart 制作android 启动图的时候报错,应该是10.04版本的问题。换到13.04 就可以了。
2、在Android支持bootchart

Android系统编译时,默认的没有打开bootchart的编译开关,即没有把bootchart编译进系统中。Android对bootchar 的支持在init 中。在init 中加入对bootchart 的支持。重新编译init .然后把支持bootchart的系统重新烧机。

1)、系统已经编译过,现在只是要添加bootchart进系统中,执行以下命令:‘

$ touch system/core/init/init.c

$ m INIT_BOOTCHART=true

2)、在bootchar.h 中 修改 BOOTCHART:

#ifndef BOOTCHART

# define  BOOTCHART  1

#endif

重新编译init

3)、.

export INIT_BOOTCHART=true

mmm system/core/init

3、生成bootchart 日志

1)、将编译生成的带有bootchart工具的Android系统重新烧录到开发板上,并启动系统

2)、在UBuntu上通过adb connect连接到开发板,然后执行:

adb shell 'echo 120 > /data/bootchart-start'

3)、执行命令:

adb shell 'mkdir /data/bootchart'

4)、重新启动开发板 ,adb connect 后查看:

root@android:/data # cat bootchart-start

60

root@android:/data # ls bootchart

header

kernel_pacct

proc_diskstats.log

proc_ps.log

proc_stat.log

root@android:/data

到此为止,bootchart执行测量后生成的测量数据已经完成,看上面有3个.log文件,下面需要将这些数据进一步处理成易读、易分析的图片。

4、bootchart测量结果的图形化过程

1)、在bootchart 目录下执行 tar –czf bootchar.tgz  * 生成bootchart.tgz 。或者利用android的打包工具:system/core/init/grab-bootchart.sh  执行 grab-bootchart.sh 会自动打包在当前目录生成bootchart.tgz。

执行bootchart  -f png bootchart.tgz

root@louie-ali:~/ali/bin# adb devices

List of devices attached

10.32.185.29:5555 device

root@louie-ali:~/ali/bin# ./grab-bootchart.sh

12 KB/s (620 bytes in 0.048s)

482 KB/s (177369 bytes in 0.358s)

513 KB/s (5027077 bytes in 9.556s)

509 KB/s (329064 bytes in 0.630s)

look at bootchart.tgz

root@louie-ali:~/ali/bin# bootchart -f png bootchart.tgz

parsing 'bootchart.tgz'

parsing 'header'

parsing 'proc_stat.log'

parsing 'proc_ps.log'

warning: no parent for pid '2' with ppid '0'

parsing 'proc_diskstats.log'

parsing 'kernel_pacct'

merged 0 logger processes

pruned 71 process, 0 exploders, 1 threads, and 0 runs

False

bootchart written to 'bootchart.png'

生成的启动图如下:

二 优化 preloaded-classes

Android开机启动速度慢,涉及的原因很多,从硬件的角度看:EMMC flash 比NAND FLASH的速度快。从软件的角度看主要系统上主要有两个地方:preload classes  resource和scan packages。

Android zygote 启动的时候会预加载一些类,预加载的类根据frameworks\base\preloaded-classes 。这个是下载android代码的时候已经确定的。是google 给出的参考。和这个文件相关:framework/base/tools/preload/WritePreloadedClassFile.java 在这个文件中定义了需要预加载类的规则并且生成frameworks\base\preloaded-classes。预加载类的规则如下:

/*

* The set of classes to preload. We preload a class if:

*

*  a) it's loaded in the bootclasspath (i.e., is a system class)

*  b) it takes > MIN_LOAD_TIME_MICROS us to load, and

*  c) it's loaded by more than one process, or it's loaded by an

*     application (i.e., not a long running service)

*/

就是a)系统级的类, 加载时间大于 b) MIN_LOAD_TIME_MICROS的类 c) 被应用加载次数大于两次的类。

MIN_LOAD_TIME_MICROS 定义如下:

static final int MIN_LOAD_TIME_MICROS = 1250;

根据这个思路和上面的分析,能够优化的就是减少预加载的类。由于我们的产品是机顶盒不是手机,手机相关的jar包都可以裁掉,因此可以去掉这部分相关的jar包。去掉这部分的jar包,1 修改frameworks\base\preloaded-classes, 2 在android 系统中裁剪。我们的盒子的做法是裁剪:

anghuan@ubuntu:~/magic$ ls out/target/product/magicbox/system/framework/

AliSecure.jar            apache-xml.jar  bouncycastle.jar                   core.jar        framework-res.apk  libyunos.jar   requestsync.jar  uiautomator.jar

am.jar                   AuiJar.jar      bu.jar                             core-junit.jar  ime.jar            monkey.jar     services.jar

android.policy.jar       aui-res.apk     com.android.location.provider.jar  ext.jar         input.jar          oujavalib.jar  settings.jar

android.test.runner.jar  bmgr.jar        content.jar                        framework.jar   javax.obex.jar     pm.jar         svc.jar

但是这样也带来一部分额外的开销,就是加载失败的时间消耗。

加载完 classes 以后系统还要加载relsource 。在原生系统中,加载类和资源是一个顺序的过程:

static void preload() {

preloadClasses();

preloadResources();

}

可以采用同步的方式:

private static Thread mCThread = new Thread(new Runnable(){

@Override

public void run(){

preloadClasses();

}

});

private static Thread mRThread = new Thread(new Runnable(){

@Override

public void run(){

preloadResources();

}

});

static void asyncPreload(){

try{

mCThread.start();

mRThread.start();

mCThread.join();

mRThread.join();

}catch(InterruptedException e){

Log.e(TAG,"asyncPreload failed");

}

}

这个要考虑硬件的规格:如果是多核CPU 性能可能比较好,如果是单核的,从上面的bootchart.png 上可以看出,在system_server 的启动时间段中 CPU的利用率非常高,优化的性能也可能打折。

三Launcher的优化。

从上面的bootchart.png 中,可以看到launcher的启动时间比较长.从启动图上看,这时候的CPU占用率到了100%。在系统起来后,kill 掉launcher,启动速度明显加快,重新生成启动图,在图上看到CPU的占用率接近100%,说明开机的时候Launcher存在CPU竞争。

转载地址:

http://blog.chinaunix.net/uid-21564437-id-3954560.html

Android开机启动性能优化相关推荐

  1. 百度App Android启动性能优化-工具篇

    一.前言 启动性能是APP的极为重要的一环,启动阶段出现卡顿.黑屏问题,会影响用户体验,导致用户流失.百度APP在一些比较低端的机器上也有类似启动性能问题,为保留存,需要对启动流程做深入优化.现有的性 ...

  2. android正在升级正在优化应用程序,Android正在启动,优化应用是怎么回事,最近每次开机都这样。...

    Android正在启动,优化应用是怎么回事,最近每次开机都这样. 低端机都那样!系统优化作的不好!这类故障在金立品牌手机中突出! 不想看不些就刷机! Android开发如何进行网络优化 1.没有,请让 ...

  3. iOS App 启动性能优化

    为什么80%的码农都做不了架构师?>>>    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq. ...

  4. 转:Android应用开发性能优化完全分析

    转自:http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜 ...

  5. Android进阶:性能优化篇 Android进阶:性能优化篇

    Android进阶:性能优化篇 分类:Android 性能优化2011-08-09 17:06585人阅读评论(0)收藏举报 一.在使用Gallery控件时,如果载入的图片过多,过大,就很容易出现Ou ...

  6. Android应用开发性能优化完全分析

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

  7. Android应用程序性能优化

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

  8. android 内存和性能优化汇总

    1.即时编译(Just-in-time Compilation,JIT),又称动态转译(Dynamic Translation),是一种通过在运行时将字节码翻译为机器码,从而改善字节码编译语言性能的技 ...

  9. ym——Android之ListView性能优化

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! Android之ListView性能优化 假设有看过我写过的15k面试题的朋友们一定知 ...

最新文章

  1. 实战药物分子筛选之一_初探
  2. SAP移动类型详细说明
  3. PHP如何批量更新MYSQL中的数据
  4. 文献记录(part102)--Two-phase clustering process for outliers detection
  5. 关于最近打的几题斜率优化的总结。加几AC代码。
  6. 选择排序和冒泡排序以及折半查找
  7. HTML+CSS+JS实现love520爱心表白
  8. linux的一些基本命令
  9. 针对新人的:Python最佳学习路线
  10. Spring5(3)---Spring5概述
  11. java systemoutprint_java – 为什么System.out.print()不起作用?
  12. 从华为看企业高效产品的研发管理
  13. 信号检测与估计理论 pdf_CVPR2020|行人检测与重识算法推荐论文源码大盘点
  14. 47 Majority Element II
  15. python电脑录屏软件_可以推荐一款电脑录屏软件吗?
  16. iMindMap手绘思维导图软件免费版
  17. 数据库三大范式、BCNF范式、反范式
  18. ckeditor富文本解决文段首行缩进问题
  19. 易想团购 注入 user.php,易想购物(easethink)存在sql注入漏洞,附利用测试POC
  20. NR 5G 系统信息

热门文章

  1. 到2022年,佛山将建成5G基站15533个,5G产业收入达300亿元
  2. 汇编语言---------王爽第4章
  3. 逆商AQ(AdversityQuotient)
  4. 人去世以后京牌车怎么验车?京牌车还能过户吗?
  5. 学习笔记二:OSS上传视频截帧
  6. 蓝桥杯单片机-第十二届省赛客观题
  7. 如何在Excel/WPS表格中实现IP归属地查询?
  8. SDL入门教程(十):2、直接通过Unicode让SDL显示中文
  9. 现在转行码农的成本已经非常高了,别盲目转行..
  10. 去痘印的最快方法是什么呢?