android启动速度优化

原创 2016年08月31日 12:08:54

Android 开机启动速度优化

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

1UBuntu安装bootchart工具

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


点击(此处)折叠或打开

  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编译进系统中。Androidbootchar 的支持在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文件,下面需要将这些数据进一步处理成易读、易分析的图片。

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

       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包,修改frameworks\base\preloaded-classes, 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竞争。

<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(2624) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~
56_avatar_small.jpg

CU博客助理2013-12-11 10:31:18

嘉宾点评:
追求系统的启动速度,不仅是微软和Google在做,国内很多公司和企业都在做相关的工作。因为它涉及到用户体验的效果,也就关系到产品的成败。博主介绍了如何使用工具bootchart分析Android系统的启动过程,内容深入浅出,很有价值。
(感谢您参与“原创博文评选”获奖结果即将公布)

评论热议
版权声明:本文为博主原创文章,转载请注明出处。

Android性能优化第(八)篇---App启动速度优化上

应用的启动速度缓慢这是很多开发者都遇到的一个问题,比如启动缓慢导致的黑屏,白屏问题,大部分的答案都是做一个透明的主题,或者是做一个Splash界面,但是这并没有从根本上解决这个问题。那么如何从根本上解...
  • u013263323
  • u013263323
  • 2016年12月21日 11:16
  • 1634

Android开机速度优化简单回顾

Android的开机速度,基本上没人说快的,通常移植完系统后,马上要看的事情就是优化开机时间,以下是简单回忆以下以前做优化的那些事。 开机时间都花在哪? 优化开机时间,通常做的首先是那有有没有BUG,...
  • freshui
  • freshui
  • 2016年12月17日 00:23
  • 6937

如何优化Android studio的启动速度

(转载)http://www.maiziedu.com/group/article/9124/ 随着Android Studio开发工具的逐渐成熟,越来越多的程序员选择这种IDE工具来进...
  • u010746364
  • u010746364
  • 2015年12月21日 18:24
  • 1098

Android 性能优化 冷启动速度优化

前言本篇文章对app启动速度进行优化。先了解 Android 性能优化 基本概念应用是如何启动的,会对此有帮助。1. 应用的启动模式 冷启动 Cold start 当启动应用时,后台没有该应用的进程...
  • u014099894
  • u014099894
  • 2016年11月30日 17:48
  • 1423

关于android开机速度性能方面

android开机,分为三个阶段, 1. 2.linux内核启动,开机动画开始显示 3.开始进入android的世界 4.android部分启动完成,开始初始化一些系统进程 1.Bootloader...
  • poolwater
  • poolwater
  • 2016年07月06日 15:34
  • 2215

Android性能优化之加快应用启动速度

Android性能优化之加快应用启动速度 转载出处:Sunzxyong 应用的启动 启动方式 通常来说,在安卓中应用的启动方式分为两种:冷启动和热启动。 1、冷启动:当启动应用...
  • alinlin627
  • alinlin627
  • 2016年01月21日 21:56
  • 1535

Android内核开发:系统启动速度优化

Android内核开发:系统启动速度优化 2015-06-23 19:40:41 标签:启动 优化 速度 boot Android 原创作品,允许转载,转载时请务必以超链接形式标...
  • lqxandroid2012
  • lqxandroid2012
  • 2017年01月03日 09:20
  • 594

Android性能优化之加快应用启动速度

应用的启动启动方式通常来说,在安卓中应用的启动方式分为两种:冷启动和热启动。 1、冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。 ...
  • u010687392
  • u010687392
  • 2016年01月14日 22:51
  • 11578

Android性能优化系列之App启动优化

应用的启动速度缓慢是我们在开发过程中经常会遇到的问题,比如启动缓慢导致的黑屏,白屏问题,本篇博客就将介绍App启动优化的相关知识。 1 应用的启动方式 通常来说,...
  • GeiZuoZuoZuo
  • GeiZuoZuoZuo
  • 2017年03月14日 16:52
  • 660

Android性能优化之提高App启动速度和Splash页面设计

1 App的启动1.1 启动方式通常来说,在安卓中应用的启动方式分为两种:冷启动和热启动。(1)冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是...
  • chenliguan
  • chenliguan
  • 2017年01月03日 19:54
  • 3442
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android启动速度优化
举报原因:
原因补充:

(最多只允许输入30个字)