安卓启动速度过慢的原因及解决方法

一、问题的起因

      最近发现一个很奇怪的问题:原来开机速度很快的平板开机都变得很慢了,一般30s可以启动的,现在至少需要3 minutes,有时候甚至达到夸张的6 minutes。

二、问题分析

      碰巧最近更新了内核和安卓系统镜像,不知道和这个有关不。反复试了好几个旧版的安卓系统镜像,结果问题依旧;那么有可能是内核方面的问题了,遂试了上一次发布的内核镜像,结果开机嗖嗖的,问题可以定位在内核方面。查看上次修改了屏幕驱动和优化了系统运行速度,至于是哪里的问题只能通过查看开机时终端输出的信息了。

1.下图是开机慢版本的启动信息:


2.下图是开机快版本的启动信息


[    8.792857] EXT4-fs (mmcblk0p4): recovery complete
[    8.798425] EXT4-fs (mmcblk0p4): mounted filesystem with ordered data mode. Opts: nomblk_io_submit,errors=remount-ro
[  187.810039] fs_mgr: Running /system/bin/e2fsck on /dev/block/mmcblk0p4
[  187.840042] e2fsck: e2fsck 1.42.9 (28-Dec-2013)
[  187.843116] e2fsck: /dev/block/mmcblk0p4: clean, 12/78432 files, 6608/78366 blocks
[  187.865423] EXT4-fs (mmcblk0p4): mounted filesystem with ordered data mode. Opts: nomblk_io_submit

     查看终端调试信息发现开机慢那个版本的调试信息,得出一个结论:之所以开机慢和EXT4文件系统自检有关,因为每次都是在那里停留长达3分钟。而对比图1和图2发现一个有趣的现象,开机快的那个版本有CPU的调试信息(CPU1: shutdown)。

三、问题解决

      先从第一个结论为方向解决问题,既然自检花时间,那么去掉自检是不是可以解决自检花时间的问题。于是我屏蔽了自检相关代码,有两种方法:1.修改fs_mgr.c文件。2.修改文件挂载的文件fstab.smdk4x12文件。:源码路径在android/system/core/fs_mgr/fs_mgr.c

static void check_fs(char *blk_device, char *fs_type, char *target)                      
{ 

#if 1 //modify by bolong 20180403                                                          
        if (fstab->recs[i].fs_mgr_flags & MF_WAIT) {                                  
            wait_for_file(fstab->recs[i].blk_device, WAIT_TIMEOUT);                                        
        }                                                                                 
                                                                                       
        if (fstab->recs[i].fs_mgr_flags & MF_CHECK) {                           
            check_fs(fstab->recs[i].blk_device, fstab->recs[i].fs_ty                
pe,                                                                           
                     fstab->recs[i].mount_point);                              
        }                                                                  
#endif                                                                      
        if (fstab->recs[i].fs_mgr_flags & MF_VERIFY) {                      
            if (fs_mgr_setup_verity(&fstab->recs[i]) < 0) {                     
                ERROR("Could not set up verified partition, skipping                
!");     
}

修改fstab文件也是可以,只需要去掉check的关键词即可,但是在开机的时候会解析失败,原因未知,以后有空再研究。反正修改fs_mgr.c源码是可以解决问题,每次开机都很快。但是这样并不完美,有一次出现无法开机的问题,提示数据脏了,需要修复。

      第一个尝试失败,那么只能从cpu的控制方向出发解决问题。查看修改日志发现最新版本改了cpu的电源管理,把cpu的“ondemand”模式改为“performance”模式了,这样系统的运行速度是提高了不少,同时也造成开机速度慢的问题。正常的配置方法如下图所示:

qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq CPU Frequency scaling qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
  x  Arrow keys navigate the menu.  <Enter> selects submenus --->.  Highlighted letters are hotkeys.     x  
  x  Pressing <Y> includes, <N> excludes, <M> modularizes features.  Press <Esc><Esc> to exit, <?> for   x  
  x  Help, </> for Search.  Legend: [*] built-in  [ ] excluded  <M> module  < > module capable           x  
  x                                                                                                      x  
  x lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x  
  x x              [*] CPU Frequency scaling                                                           x x  
  x x              <*>   CPU frequency translation statistics                                          x x  
  x x              [*]     CPU frequency translation statistics details                                x x  
  x x                    Default CPUFreq governor (ondemand)  --->                                     x x  
  x x              -*-   'performance' governor                                                        x x  
  x x              <*>   'powersave' governor                                                          x x  
  x x              <*>   'userspace' governor for userspace frequency scaling                          x x  
  x x              -*-   'ondemand' cpufreq policy governor                                            x x  
  x x              <*>   'interactive' cpufreq policy governor                                         x x  
  x x              <*>   'conservative' cpufreq governor                                               x x  
  x x              <*>   'adaptive' cpufreq policy governor                                            x x  
  x x                                                                                                  x x  
  x x                                                                                                  x x  
  x x                                                                    

需要把“Default CPUFreq governor(performance)”改为“(ondemand)”即可解决问题。

四、结论

    电源管理如果修改为性能模式的话,系统会一直处于一个四核全开的状态,某些不支持多核系统的程序有可能会运行出错,本文所造成的后果是导致e2fsck文件系统修复程序运行过慢,猜测是多核同时运行造成程序的竞态。 优化android系统需要从各个方面进行权衡,否则很容易顾此失彼。




猜你喜欢

转载自blog.csdn.net/menghuanbeike/article/details/79817459
今日推荐