2022年android启动优化 .pdf

上传人:C****o 文档编号:32184725 上传时间:2022-08-08 格式:PDF 页数:10 大小:173.39KB
返回 下载 相关 举报
2022年android启动优化 .pdf_第1页
第1页 / 共10页
2022年android启动优化 .pdf_第2页
第2页 / 共10页
点击查看更多>>
资源描述

《2022年android启动优化 .pdf》由会员分享,可在线阅读,更多相关《2022年android启动优化 .pdf(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Android启动过程优化一、 Android启动过程首先, android 的启动过程如下图所示:图 1 android的启动过程1. Init进程的启动init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行, 并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。init始终是第一个进程。启动过程就是代码init.c中 main 函数执行过程:systemcoreinitinit.c,在函数中执行了:文件夹建立,挂载,rc 文件解析,属性设置,启动服务,执行动作,socket 监听2. ServiceManage

2、r启动名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 10 页 - - - - - - - - - ServiceManager用来管理系统中所有的binder service,不管是本地的c+实现的还是 java 语言实现的都需要这个进程来统一管理,最主要的管理就是,注册添加服务,获取服务。所有的Service使用前都必须先在servicemanager中进行注册。3. Zygote进程的启动Zygote 这个进程是非常重要的一个进程,Zygote 进程的建立是真正的A

3、ndroid运行空间,初始化建立的Service都是 Navtive service。4. SystemServer启动SystemServer进程是zygote孵化出的第一个进程,该进程是从ZygoteInit.java的main() 函数中调用 startSystemServer()开始的。与启动普通进程的差别在于,zygote类为启动SystemServer提供了专门的函数 startSystemServer(),而不是使用标准的forAndSpecilize()函数,同时, SystemServer 进程启动后首先要做的事情和普通进程也有所差别。5. Home 界面启动二、androi

4、d 启动过程可优化部分1 定制本地服务2 定制 Android 系统服务3 优化 ZygoteInit的类预加载preloadClasses和资源预加载preloadResources机制4 PackageManagerService扫描、检查APK安装包信息三、启动优化的实现1 定制本地服务本地服务都是由C 或 C+ 编写,它们都执行在Linux 空间,在init进程的启动过程中启动了很多本地服务,如果我们的设备中没有电话模块、蓝牙模块, 我们可以将这些没用的本地服务在init.rc里注释掉。重新编译 system.img然后启动模拟器即可。去掉上述几个本地服务与没有去掉本地服务,二者在开机

5、时间上几乎没有减少多少,开机时间只是稍微减少了一点。如果去掉开机动画服务可以大大的提高系统的启动速度。2 定制 Android系统服务2.1 Android底层服务裁剪优化方案及实现首先要分析哪些部分是必不可少的服务:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 10 页 - - - - - - - - - (1) 底层第一个不能删除的就是 Zygote 服务,原因很简单, Zygote 是启动流程中的关键服务,没有 Zygote 就没有 Dalvik 虚拟机,也不能通

6、过 Zygote 启动服务 systemserver,这样将永远无法进入系统待机画面。(2) 既 然 系 统 中 总 要 有 服 务 , 无 论 多 少 , 就 不 能 缺 少 管 理 服 务 的 程 序 , 所 以servicemanager 这个服务是必须被保留下来的,它的作用是负责是将服务的名字与句柄(handle )添加到它的维护列表中,便于其它服务通过 servicemanager 找寻需要的服务。(3) 还有必须留下的就是服务就是 media ,原因有两处,第一个是在 Zygote 出现重启的情况下,它默认将重启 media 服务,说明对 Zygote 而言,要保证服务的稳定运行,

7、服务 media 是必不可少的;第二点就是在服务 systemserver 的函数 init1中要启动AudioFlinger、MediaPlayerService、CameraService 、AudioPolicyService这些服务,而这些服务都必须 media 做继承支持,所以删减 media 必将导致系统紊乱。(4) 保证系统能挂载外设服务 vold , 作为保障扩展存储的挂载任务自动完成的守护进程的稳定性,它的重要性至关重要。(5) 还有就是服务 netd ,作为网络服务的最底层服务,估计上层中需要的地方非常多,失去这个服务, Android 系统在启动到 Zygote 之后就会

8、陷入重复死循环的状态,不断试图启动这个服务。有了上述五个服务,Android 操作系统在底层的启动就顺利无误了。需要说明的是, 此处所说的裁剪不是将上述服务的可执行文件从系统镜像中删除,而仅仅是删除了调用这些服务的命令。具体的方式是删除 init.rc 中相关服务的调用命令,然后删除命令后的 init.rc 文件重新打包到 Android 镜像中。2.2 上层服务裁剪优化方案及实现首先还是寻找关键服务:1. 第一个不能删除的服务就是 Activity Manager,这个服务是负责管理应用程序启动和运行, 是应用程序整个生命周期的保姆;也是系统启动流程的最后一个关键点,当所有的上层服务程序初始

9、化完成,将由这个服务启动第一个应用程序。2. 第二个不能删除的服务也和应用程序有关,那就是服务 Package Manager,这个服务上一章用了一节来说明它的作用,它解析 apk 包内容,将关键内容保存在内存区域中,提供 Activity Manager 调用这些程序,服务 Package Manager 可谓是应用程序的预处理程序,自然也不能删除。3.ConnectivityService 是第三个不能删除的服务,原因这个服务是作为服务于服务间名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - -

10、- - 第 3 页,共 10 页 - - - - - - - - - 的提供重要信息的服务,提供服务间内容联系的功能。由于上层服务对系统的应用性比较强,需要保留的服务很多,就不一一说明它们保留的意义,除了上面要保留的服务以外,还需要保留的服务有:4.LightsService(灯光服务);5. Power Manager(电源服务);6. Account Manager(账号服务);7. Battery Service(电池服务);8.Vibrator Service(震动服务)9.AlarmManager (闹钟服务);10.Watchdog (看门狗服务);11. Sensor Servi

11、ce(传感器服务)12. Window Manager (窗口管理服务);13. Status Bar(状态栏服务);14. InputMethod Service(输入法服务);15. NetworkManagement Service(网络管理服务);16. Connectivity Service(联接服务);17. Accessibility Manager(焦点服务);18.Notification Manager(消息通知服务)19. Wallpaper Service(墙纸服务);20. AudioService(音效服务);21. AppWidget Service(应用程序部

12、件管理服务)。完成上层服务的裁剪,下面是应用程序裁剪优化方案及实现: 由于缺少了匹配的服务,Android 的应用程序很多都无法使用,这些应用程序即占用系统空间,服务 Package Manager 还要试图解析它,占用系统启动时间,删除无用的应用程序还是十分必要的。此处的裁剪不同于以往的服务裁剪,仅删除调用命令, 由于应用程序都是以包的形式独立分部在四个文件夹中 (/system/framework, /system/app, /data/app, /data/app-private) ,服务 Package Manager 也是从上述文件夹中解析应用程序,然后服务 Activity Man

13、ager 才获得需要启动的应用程序列表,由此可见,裁剪应用程序的方法是删除镜像中应用程序的apk 包。应用程序功能非常明确,关联也相对比较少,裁剪工作也相对简单,仅留用了两个名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 10 页 - - - - - - - - - 应用服务: Launcher2.apk 和 SettingsProvider.apk。Launcher2.apk 是提供用户界面的应用程序,是开机启动由 ActivityManager启动的第一个应用程序。它

14、的存在才保证系统能竟然用户待机状态。 使用者或开发人员, 可以通过定制自己的 Launcher2 应用程序来 DIY 自己的用户界面。 SettingsProvider.apk 是对 Android 系统进行设定的应用程序,它通过调用系统服务来完成 Android 各种状态的设置。没有这个应用程序,将会缺少用户对系统的控制。3PackageManagerServicePackageManagerService是 Android的包管理器,主要用来管理Android 系统中的APK文件,在SystemServer 里,通过ServerThread调用 PackageManagerService.

15、main()启动了包管理服务。PackageManagerService的主要作用有:3.1 PackageManagerService.main()生成一个 IPackageManager 接口,也就是PackageManagerService 。public static final IPackageManager main(Context context, boolean factoryTest) PackageManagerService m = new PackageManagerService(context, factoryTest); ServiceManager.addSer

16、vice(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()

17、 mInstaller = installer; else mInstaller = null; 3.3 建立PackageHandler消息循环,用于处理外部的apk 安装请求消息,如adb 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 10 页 - - - - - - - - - install,packageinstaller安装 apk 时会发送消息 mHandlerThread.start(); mHandler = new PackageHandler(mH

18、andlerThread.getLooper(); 3.4 解析 /system/etc/permission下 xml 文件 (framework/base/data/etc/),包括platform.xml和系统支持的各种硬件模块的feature。主要工作: (1)建立底层user ids和 group ids 同上层 permissions之间的映射;可以指定一个权限与几个组ID 对应。当一个APK被授予这个权限时,它也同时属于这几个组。 (2)给一些底层用户分配权限,如给 shell授予各种permission权限;把一个权限赋予一个 UID,当进程使用这个UID 运行时,就具备了这个

19、权限。 (3) library,系统增加的一些应用需要link的扩展 jar库; (4) feature,系统每增加一个硬件,都要添加相应的feature.将解析结果放入mSystemPermissions,mSharedLibraries, mSettings.mPermissions,mAvailableFeatures等几个集合中供系统查询和权限配置使用。3.5 检查 /data/system/packages.xml是否存在,这个文件是在解析apk 时由 writeLP()创建的,里面记录了系统的permissions,以及每个apk的name,codePath,flags,ts,ve

20、rsion,uesrid等 信 息 , 这 些 信 息 主 要 通 过apk的AndroidManifest.xml解析获取,解析完apk 后将更新信息写入这个文件并保存到flash ,下次开机直接从里面读取相关信息添加到内存相关列表中。当有 apk 升级, 安装或删除时会更新这个文件。3.6 检查 BootClassPath ,mSharedLibraries及/system/framework下的 jar是否需要dexopt ,需要的则通过dexopt 进行优化。3.7 启动AppDirObserver线程监测 /system/framework,/system/app ,/data/ap

21、p,/data/app-private目录的事件 , 主要监听add 和 remove 事件。对于目录监听底层通过inotify机制实现, inotify 是一种文件系统的变化通知机制,如文件增加、删除等事件可以立刻让用户态得知, 它为用户态监视文件系统的变化提供了强大的支持。当有 add event时调用 scanPackageLI(File , int , int)处理;当有 remove event时调用 removePackageLI()处理 ; 3.8 对 于 以 上 几 个 目 录 下 的apk逐 个 解 析 , 主 要 是 解 析 每 个apk的AndroidManifest.x

22、ml文件, 处理 asset/res等资源文件, 建立起每个apk 的配置结构信息,名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 10 页 - - - - - - - - - 并将每个apk 的配置信息添加到全局列表进行管理。调用 installer.install()进行安装工作, 检查 apk 里的 dex 文件是否需要再优化,如果需要优化则通过辅助工具dexopt 进行优化处理;将解析出的componet 添加到 pkg 的对应列表里; 对 apk 进行签名和证书

23、校验, 进行完整性验证。3.9 将解析的每个apk 的信息保存到packages.xml和 packages.list文件里,packages.list记录了如下数据: pkgName ,userId ,debugFlag ,dataPath (包的数据路径)其中对 /system/framework,/system/app,/data/app,/data/app-private目录中的APK扫描耗费了大量的时间。4 利用 BLCR加快 android的启动过程4.1 背景知识Zygote 是 android中的核心进程,其负责android其他应用和服务的孵化,zygote 启动过程慢的一个

24、原因在于启动过程中需要提前加载公用类(由文件preloaded-classes定义),这种加载是android设计人员特意根据linux和嵌入式系统特性设计的,网络上有人尝试将这些类的加载去除以加快开机速度,这种违背设计者初衷的方法被否决(参考1)。对于单个进程而言,如果使用到这些公共类,都必须完成对应类的载入并初始化,由于zygote 是后续所有android的父进程,采用Class.forName处理的公共类会被载入到内存并完成静态初始化,提前加载可以避免每个子进程调用时候需要生成公用类的副本(linux Copy-on-write特点),进而减少内存占用量以及后续启动其他程序的花销。这个

25、加载过程关系到后续的性能,所以不能简单的跳过。载入的过程主要是对内存的操作过程,其中包括了大量的内存分配释放过程,该过程由于有上千个类需要操作而变得耗时较长。在实际应用中,由于 framework 部分较少升级, 故这些公共类是不会被动态删减,考虑到这些特点,采用 check point方式每次直接将zygote 还原到完成类加载的阶段避开频繁的类操作显然可以提高速度。BLCR (BerkeleyLab Checkpoint/Restart)是应用于linux下的 check point/restore软件,它可以将正在运行于linux上的应用当前的运行点保存成为一个文件并且在以后的时间 可

26、以 按 照 需 要 将 该 程 序 直 接 恢 复 到 保 存 时 候 的 状 态 。 该 软 件 官 方 网 站 在 :http:/ftg.lbl.gov/checkpoint。根据其FAQ介绍 BLCR对保存和恢复的程序有部分限制:1 无法保存和恢复打开的sockets ( TCP/IP,Unix domain等)。2 无法保存和恢复SysVIPC对象。3 在处理还没有回收僵尸子进程的父进程是需要注意。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 10 页 - -

27、- - - - - - - 尽管有部分限制,只要在使用时候注意这些限制,利用其保存和恢复程序运行点和内存的能力完全可以避免程序每次不必要的初始化动作。Zygote在加载公共类前时候除了堆外其他资源使用很少, 通过仔细的调整/ 恢复 BLCR无法恢复的一些状态, 是可以用check point形式来跳过类加载以缩短启动时间。 BLCR 包括内核驱动和应用库两部分,外部应用通过链接应用库和内核驱动进行交换实现应用的保存和恢复。4.2 针对 emulator下的 android2.2实现 blcr 实施过程一 软件准备:blcr-0.8.2 android2.2froyo android-goldf

28、ish-2.6.29 http:/ android和内核在这里不详述,需要指出的有两点。1 编译内核时候注意加入可加载模块支持(Enable loadablemodule support),缺省的 goldfish内核配置是不支持的。2 需要对 android的 bionic的线程库进行扩展,扩展方法是采用上述软件的pthread文件替换相应线程库文件。二 编译 blcr 的内核驱动模块和应用直接使用android 内建的编译器即可对内核驱动进行编译。 编译过程只要指定正确的编译器路径和内核路径即可顺利编译。生成的内核可加载模块分别是:cr_module/kbuild/blcr.ko blcr

29、_imports/kbuild/blcr_imports.ko 顺利编译 blcr应用部分需要使用打过扩展补丁的pthread 。 补丁方法为直接取代bionic目 录 下 对 应 文 件 , 并 且 修 改bionic/libc/Android.mk,开 启 对 应 的 编 译 开 关 , 在libc_common_cflags加入 -DUCLIBC_LINUXTHREAD_OLD_EXTENSTION宏。Blcr 文件也需要如下修改才能正常编译和运行。其中文件 libcr/cr_libinit.c: rc = _cri_ksigaction(signum, (act ?&ksa : NUL

30、L), (oact ? &oksa : NULL), (_NSIG/8), &errno);改动为:rc = _cri_ksigaction(signum, (act ?&ksa : NULL), (oact ? &oksa : NULL), 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 10 页 - - - - - - - - - (_NSIG/4), &errno); 将_NSIG/8 改动为 _NSIG/4 修改的原因为在bionic中定义 NSIG=32,而内核

31、为64,造成kernel/signal.c中 rt_sigaction调用认为参数错误而返回错误。在android系统中对应非 prelink的动态库调用dlopen(NULL, RTLD_LAZY);(即查找自己)会异常,需要屏蔽cr_libinit.c函数 cri_init对 dlopen 的调用。在 blcr工程中加入Android.mk ,需要注意的是下面几个文件需要编译为arm 而非缺省的 thumb 指令: cr_async.c. cr_core.c cr_sig_sync.c cr_cs.c cr_syscall.c,否则编译无法通过。三 zygote加入checkpoint 支

32、持当系统启动zygote服务时候先判断是否存在checkpoint文件,如果有则调用cr_restart载入保存的checkpoint文件,否则按照正常的 zygote 流程进行。由于zygote 是其他 android的父进程,其生成的许多进程/ 线程都有socket 等 checkpoint无法恢复的限制因素,故不适合将checkpoint放到 zygote 启动过后点,本文选择在ZygoteInit.java的 main 后面的 preloadResources()完成后进行。这个过程刚好加载完毕耗时长的公用类而且基本没有使用很多限制资源。原生的android在preload前有创建so

33、cket 动作,可以调整到preloadResources后面,调整后的样子如下 (斜体代码为调整顺序部分):CheckPoint cp=newCheckPoint(); try /Start profiling the zygote initialization. SamplingProfilerIntegration.start(); preloadClasses(); preloadResources(); cp.checkPoint(/data/zygote.blcr); registerZygoteSocket(); 其中 CheckPoint 类是 c 扩展的 java 调用接口,

34、 通过 jni调用 checkpoint库函数实现checkpoint动作。需要指出的是运行上面几个不带参数的cr_checkpoint目的为将后面的zygote 的 pid退后一些, 以防下次checkpoint时候遇到pid 冲突而导致checkpoint失败。加入该功能后当系统首次启动会创建/data/zygote.blcr文件,由于需要checkpoint,导致比正常启动时间慢较多。后续只要该文件存在,系统就会跨过类加载过程,进而加快启动速度。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - -

35、- - - 第 9 页,共 10 页 - - - - - - - - - 附:1 参考网址http:/ http:/ http:/ -android启动过程http:/ -Zygote工作流程分析http:/ -android开机优化思路http:/ -android代码优化http:/ -利用 BLCR加快android的启动过程http:/ -为android启动加速2 参考文档1) Android 关键服务分析与启动过程优化.caj 下载地址: http:/ 2) Android 启动过程优化研究.caj 下载地址: http:/ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 10 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁