Android启动过程优化
一、Android启动过程
首先,android的启动过程如下图所示:
图1 android的启动过程
1. Init进程的启动
init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。init始终是第一个进程。
启动过程就是代码init.c中main函数执行过程:system\core\init\init.c,在函数中执行了:文件夹建立,挂载,rc文件解析,属性设置,启动服务,执行动作,socket监听……
2. ServiceManager启动
ServiceManager用来管理系统中所有的binder service,不管是本地的c++实现的还是java语言实现的都需要这个进程来统一管理,最主要的管理就是,注册添加服务,获取服务。所有的Service使用前都必须先在servicemanager中进行注册。
3. Zygote进程的启动
Zygote这个进程是非常重要的一个进程,Zygote进程的建立是真正的Android运行空间,初始化建立的Service都是Navtive service。
4. SystemServer启动
SystemServer进程是zygote孵化出的第一个进程,该进程是从ZygoteInit.java的main()函数中调用 startSystemServer()开始的。与启动普通进程的差别在于,zygote类为启动SystemServer提供了专门的函数 startSystemServer(),而不是使用标准的forAndSpecilize()函数,同时,SystemServer进程启动后首先要做的事情和普通进程也有所差别。
5. Home界面启动
二、android启动过程可优化部分
1  定制本地服务
2  定制Android系统服务
3  优化ZygoteInit的类预加载preloadClasses和资源预加载preloadResources机制
4  PackageManagerService扫描、检查APK安装包信息
三、启动优化的实现
1 定制本地服务
本地服务都是由C或C++编写,它们都执行在Linux空间,在init进程的启动过程中启动了很多本地服务,如果我们的设备中没有电话模块、蓝牙模块,我们可以将这些没用的本地服务在里注释掉。
重新编译system.img然后启动模拟器即可。
去掉上述几个本地服务与没有去掉本地服务,二者在开机时间上几乎没有减少多少,开机时间只是稍微减少了一点。
如果去掉开机动画服务可以大大的提高系统的启动速度。
2 定制Android系统服务
2.1 Android底层服务裁剪优化方案及实现
首先要分析哪些部分是必不可少的服务:
(1)底层第一个不能删除的就是 Zygote 服务,原因很简单,Zygote 是启动流程中的关键服务,没有 Zygote 就没有 Dalvik 虚拟机,也不能通过 Zygote 启动服务 systemserver,这样将永远无法进入系统待机画面。
(2)既然系统中总要有服务,无论多少,就不能缺少管理服务的程序,所以servicemanager 这个服务是必须被保留下来的,它的作用是负责是将服务的名字与句柄(handle)添加到它的维护列表中,便于其它服务通过 servicemanager 寻需要的服务。
(3)还有必须留下的就是服务就是 media,原因有两处,第一个是在 Zygote 出现重启的情况下,它默认将重启 media 服务,说明对 Zygote 而言,要保证服务的稳定运行,服务 media 是必不可少的;第二点就是在服务 systemserver 的函数 init1中要启动AudioFlinger、MediaPlayerService、CameraService、AudioPolicyService这些服务,而这些服务都必须 media 做继承支持,所以删减 media 必将导致系统紊乱。
(4)保证系统能挂载外设服务 vold,作为保障扩展存储的挂载任务自动完成的守护进程的稳定性,它的重要性至关重要。
(5)还有就是服务 netd,作为网络服务的最底层服务,估计上层中需要的地方非常多,失去这个服务,Android 系统在启动到 Zygote 之后就会陷入重复死循环的状态,不断试图启动这个服务。
有了上述五个服务,Android 操作系统在底层的启动就顺利无误了。需要说明的是,此处所说的裁剪不是将上述服务的可执行文件从系统镜像中删除,而仅仅是删除了调用这些服务的命令。具体的方式是删除 中相关服务的调用命令,然后删除命令后的 文件重新打包到 Android 镜像中。
2.2上层服务裁剪优化方案及实现
首先还是寻关键服务:
1.第一个不能删除的服务就是 Activity Manager,这个服务是负责管理应用程序启动和运行,是应用程序整个生命周期的保姆;也是系统启动流程的最后一个关键点,当所有的上层服务程序初始化完成,将由这个服务启动第一个应用程序。
2.第二个不能删除的服务也和应用程序有关,那就是服务 Package Manager,这个服务上一章用了一节来说明它的作用,它解析 apk 包内容,将关键内容保存在内存区域中,提供 Activity Manager 调用这些程序,服务 Package Manager 可谓是应用程序的预处理程序,自然也不能删除。
3.ConnectivityService 是第三个不能删除的服务,原因这个服务是作为服务于服务间
的提供重要信息的服务,提供服务间内容联系的功能。由于上层服务对系统的应用性比较强,需要保留的服务很多,就不一一说明它们保留的意义,除了上面要保留的服务以外,还需要保留的服务有:
4.LightsService(灯光服务);
5. Power Manager(电源服务);
6. Account Manager(账号服务);
7. Battery Service(电池服务);
8.Vibrator Service(震动服务)
9.AlarmManager(闹钟服务);
10.Watchdog(看门狗服务);
11. Sensor Service(传感器服务)
12. Window Manager(窗口管理服务);
13. Status Bar(状态栏服务);
14. InputMethod Service(输入法服务);
15. NetworkManagement Service(网络管理服务);
16. Connectivity Service(联接服务);
linux和安卓的关系
17. Accessibility Manager(焦点服务);
18.Notification Manager(消息通知服务)
19. Wallpaper Service(墙纸服务);
20. AudioService(音效服务);
21. AppWidget Service(应用程序部件管理服务)。
完成上层服务的裁剪,下面是应用程序裁剪优化方案及实现:
由于缺少了匹配的服务,Android 的应用程序很多都无法使用,这些应用程序
即占用系统空间,服务 Package Manager 还要试图解析它,占用系统启动时间,删除无用的应用程序还是十分必要的。
此处的裁剪不同于以往的服务裁剪,仅删除调用命令,由于应用程序都是以包的形式独立分部在四个文件夹中(/system/framework,/system/app,/data/app,/data/app-private),服务 Package Manager 也是从上述文件夹中解析应用程序,然后服务 Activity Manager 才获得需要启动的应用程序列表,由此
可见,裁剪应用程序的方法是删除镜像中应用程序的apk 包。应用程序功能非常明确,关联也相对比较少,裁剪工作也相对简单,仅留用了两个
应用服务:Launcher2.apk 和 SettingsProvider.apk。Launcher2.apk 是提供用户界面的应用程序,是开机启动由 ActivityManager启动的第一个应用程序。它的存在才保证系统能竟然用户待机状态。使用者或开发人员,可以通过定制自己的 Launcher2 应用程序来 DIY 自己的用户界面。SettingsProvider.apk 是对 Android 系统进行设定的应用程序,它通过调用系统服务来完成 Android 各种状态的设置。没有这个应用程序,将会缺少用户对系统的控制。
3PackageManagerService
PackageManagerService是Android的包管理器,主要用来管理Android系统中的APK 文件,在SystemServer里,通过ServerThread调用PackageManagerService.main()启动了包管理服务。
PackageManagerService的主要作用有:
3.1  @PackageManagerService.main()
生成一个IPackageManager接口,也就是PackageManagerService。
public static final IPackageManager main(Context context, boolean factoryTest) {
PackageManagerService m = new PackageManagerService(context, factoryTest);
ServiceManager.addService("package", m);
return m;
}
3.2  PackageManagerService构造方法中,首先会进行一些成员变量的初始化,比如mContext, mFactoryTest, mMetrics, mSettings等。
最重要的是初始化mInstaller这个变量。Installer是一个很重要的类,所有对apk 的install, uninstall,move等操作,都是通过它进行的。
Installer installer = new Installer();
if (installer.ping() && Process.supportsProcesses()) {
mInstaller = installer;
} else {
mInstaller = null;
}
3.3  建立PackageHandler消息循环,用于处理外部的apk安装请求消息,如adb

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。