Android开机启动慢,是一个众所周知的问题。

优化方向:

1、预加载的优化

在网上看的资料,对于开机启动来说,耗时最久的是preload classes和scan packages。所以第一个优化方向就是预加载类。
这是在网上看的

· preloaded-classes list中预加载的类位于dalvik zygote进程的heap中。在zygote衍生一个新的dalvik进程后,新进程只需加载heap中没有预加载的类(这些后加载进来的类成为该进程所private独有的),这样便加快了应用程序的启动速度。实际上这是一种以空间换时间的办法,因为几乎没有一个应用程序能够使用到所有的预加载类,必定有很多类对于该应用程序来说是冗余的。但是也正如Google所说,智能手机开机远没有启动应用程序频繁——用户开机一次,但直到下次再开机之前可能要运行多个应用程序。因此牺牲一点启动时间来换取应用程序加载时的较快速度是合算的。

· preloaded-classes list已经是Google Android工程师使用众多测试工具分析,加以手动微调后形成的最优化预加载列表,涵盖了智能机上最长见的应用类型所需要的各种类。很难想象我们自己能够有什么手段能够获得比这样更优的一个预加载列表。所以,除非你的Android系统是被移植到非智能手机设备上使用(例如MID、EBOOK,可以不需要Telephony相关的类),不建议去“优化”preloaded-classes list。 在zygote中单起一个线程来做preload,是否可行?答案是否定的。首先在zygote中不可以新开线程,其次,就算新开一个线程,在目前智能机硬件条件下(单核CPU),除非有频繁大量的存储IO,否则我们不能看到我们期望加速启动效果。

上面说了“但是也正如Google所说,智能手机开机远没有启动应用程序频繁——用户开机一次,但直到下次再开机之前可能要运行多个应用程序。因此牺牲一点启动时间来换取应用程序加载时的较快速度是合算的。”但是对于机顶盒来说,这就反而不是这样了,机顶盒的开关机比较频繁。

预加载优化方向:
(1)、将预加载放置到system_server 启动之后。
对于几个preload来说,最耗时的是类的预加载,所以我们可以把
preloadclass单独剥离出来一个线程,并将其放到system_server之后,会有一定的启动速度提升。
如此下代码所示:

    public static class PreloadClassThread extends Thread {public void run() {preloadClasses();}}static void preload() {
//        preloadClasses();         // Delay preloadClassespreloadResources();preloadOpenGL();}public static void main(String argv[]) {try {.....省略无关代码  EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,SystemClock.uptimeMillis());preload();EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,SystemClock.uptimeMillis());.....省略无关代码if (argv[1].equals("start-system-server")) {startSystemServer();} else if (!argv[1].equals("")) {throw new RuntimeException(argv[0] + USAGE_STRING);}Log.i(TAG, "Accepting command socket connections");Thread preloadclass = new PreloadClassThread();preloadclass.start();

(2)、加载的时候要顺序加载 ,我们可以改为多线程同步来执行。
preloadClasses();
preloadResources();
preloadOpenGL();
android 原本的加载方式如下:

 static void preload() {preloadClasses();preloadResources();preloadOpenGL();}

我们修改为:

    static void concurrent_preload() {Thread preloadclass = new PreloadClassThread();Thread preloadres = new PreloadResThread();preloadclass.start();preloadres.start();try {preloadclass.join();preloadres.join();} catch (InterruptedException ex) {Log.e(TAG, "concurrent_preload join() InterruptedException error ", ex);}preloadOpenGL();}

我们可以加一些属性来控制是否要跳过预加载、选择哪种方式预加载。
scan packages的优化就是减少不必要的APK了。

2、去除SELinux

SELinux是一种强制访问控制(MAC)系统。有以下两种模式:
Enforcing:使能状态,所有违反policy的动作都会被拒绝。
Permissive:宽容模式,违反policy的动作不会被拒绝,只会警告。
开启SELinux,在kernel和init进程都会有相关的一些操作,所以会对开机速度有一定的影响。如果对于机顶盒这种的话,其实看情况也是可以关掉的。
关闭方法对于各个厂商可能有些不同,一般是在bootargs里面把其配置为关闭即可。

3、开机动画

其实很多时候,盒子已经到了launcher启动的阶段,但是开机动画还没播放完。优化开机动画的显示时间,可以减少很多开机时间,但是出于盒子本身的功能来说,开机动画一般用作广告,所以这个可以优化的空间比较小。手机倒是可以这样子优化,这就没什么好说的了,修改bootanimation.zip中的开机动画时间即可。

4、减少不必要的service

这里说的是两种不同概念的service:
1是由init进程来启动的service,这个需要裁剪init.xxx.rc中不需要的service,因为init进程启动太多service的话,可能会导致zygote和systemServer启动速度受到影响。
2是system_server启动的java层面的service,像机顶盒的话telephony,location这样的服务一般也可以不要了。

5、修改为odex方式

这是以空间换取时间的优化方式。

1、在自己device目录 下Bordconfig.mk中加入

WITH_DEXPREOPT=true

2、在相同目录下修改system.prop

dalvik.vm.verify-bytecode=true

Android 优化开机启动相关推荐

  1. android+启动脚本,imx6q android 添加开机启动脚本

    1.在xx/out/target/product/sabresd_6dq/root/init.rc中添加以下内容 ========================================== ...

  2. Android Q 开机启动流程

    https://www.it610.com/article/1304931662924124160.htm Android Q 开机启动流程 开机启动概述: step 1: 上电开机 长按power键 ...

  3. Android系统开机启动流程及init进程浅析

    Android系统启动概述 Android系统开机流程基于Linux系统,总体可分为三个阶段: Boot Loader引导程序启动 Linux内核启动 Android系统启动,Launcher/app ...

  4. android 开机启动_关机_重启

    android shutdown 和 reboot  操作可能有些朋友也和自己一样有这种需求,开机启动的网上资料非常多. 贴出自己原来写的大家交流下.功能实现的源码非常简单,但牵涉到权限的问题. 实现 ...

  5. Android系统开机启动流程

    第一步:启动linux 1.Bootloader 2.Kernel 第二步android系统启动:入口为init.rc(system\core\rootdir) 1./system/bin/servi ...

  6. android 手机开机启动,手机怎么开机启动项 手机开机启动项方法【详解】

    很多时候,我们的手机开机后,会自动打开很多软件,这会让我们的手机运行速度变慢,那么,该怎么关闭?其实很简单只要打开开机启动项,将已经打钩的选项去掉即可.那么,如何打开开机启动项? 对于没有此选项的软件 ...

  7. android系统开机启动很慢,为什么安卓手机升级系统后,首次启动会比较慢?

    原标题:为什么安卓手机升级系统后,首次启动会比较慢? 点击 很多小伙伴对安卓手机进行系统升级后,可能都会遇到一种情况:手机首次启动的时间好久,首次打开应用的时间也比往常要长. 为什么会出现这种情况? ...

  8. android 服务开机启动慢,Android应用首次启动慢原因分析

    1. 起动的时候会启动一个闪屏 见AppWindowContainerController.java中的addStartingWindow函数 刚启动程序时,会先弹出一个Activity,那个其实不是 ...

  9. android 服务开机启动慢,Android App启动慢原因

    一.App启动方式: 冷启动(Cold Start).温启动(Warm start).热启动(Hot start) 1.  冷启动(Cold Start):是指App启动后第一次运行,获取App进程杀 ...

最新文章

  1. Verilog以及VHDL所倡导的的代码准则
  2. python中斐波那契数列_斐波那契数列–在Python,JavaScript,C ++,Java和Swift中进行了解释...
  3. Angular添加class的正确方式
  4. cocos2d-x+lua开发模式下编辑器的选择
  5. Python稳基修炼之计算机等级考试易错概念题5(含答案)
  6. java 解析 ical_ical4j 实现ICS文件的生成和解析
  7. python多线程队列两组数据_python 多线程2-队列同步
  8. AI PRO I 第4章
  9. 关于Initializing Spring root WebApplicationContext解决方法
  10. stardict词典全集
  11. 深圳医疗器械帮;一个军团的诞生
  12. Yolov5笔记--检测bilibili下载好的视频
  13. 解决win10系统不能打开.chm类型的文件
  14. Python小记~索引字典
  15. Web性能测试工具大全
  16. mfs文件服务器,MFS分布式文件系统搭建
  17. 解决:The ‘Access-Control-Allow-Origin‘ header contains___Nginx跨域设置
  18. hdu 6608 Fansblog 威尔逊定理+大数阶乘取模
  19. 躲避雪糕刺客?通过爬虫爬取雪糕价格
  20. 200套工作室设计行业响应式Html5模板HTML5+CSS3设计网站模板简洁设计师作品展示响应式模板整洁扁平宽屏CSS3网站模板html5网页静态模板Bootstrap扁平化网站源码css3手机se

热门文章

  1. BP神经网络原理简单介绍以及公式推导(矩阵形式和分量形式)
  2. 折半插入排序顺序结构
  3. 打开计算机页面只有上面一半,我电脑打开网页总是打开一半,不知道是为什么,请高手指教,谢谢!...
  4. Windows远程桌面连接后被连接的桌面锁屏
  5. 【职场篇】游戏开发社招求职面试指南③——面试总结
  6. boss直聘改回系统头像_Boss直聘VS猎聘,谁的营销广告更胜一筹
  7. 技术宅男揭秘:北京机动车摇号真的公平?
  8. winrar压缩过滤文件及文件夹
  9. Beautifulsoup+正则表达式多线程爬取小姐姐图片
  10. 新年警惕:多数手机银行App存安全隐患