android应用的安装过程可以分为两种:有界面安装和面安装。
有界面安装主要是通过系统应用(packageinstaller)来安装apk文件。用户打开安装apk应用后,点击安装按钮,系统会执行startinstall方法,然后进入安装界面。无论安装成功还是失败,都会有相应的提示。这种安装方式的内部实现主要是调用packagemanager的installexistingpackage方法,通过binder机制,最终由packagemanagerservice来执行安装。其核心原理是将apk文件复制到系统可识别的关键文件目录中。
面安装则是通过调用adb命令来实现。这个过程执行一个用c语言编写的命令行脚本,调用install_app方法,然后进一步调用pm_command等脚本,最终通过ams执行安装。
谈到android应用的启动,需要从android的开机过程说起。android在开机时,会将所有应用重新安装一遍,即将apk文件复制到对应的目录中(这也是android开机缓慢的原因之一)。
关于android的启动流程,其实除了刚开机阶段,正常的应用启动与activity的启动非常相似。
作者mannayang深入探索了android系统的启动过程,并详细解释了launcher的运行机制。
android的启动核心流程包括以下几个阶段:
1. init进程启动:作为系统初始化的核心,init进程主要负责设置进程优先级,创建必要的文件目录。
2. 从init到zygote进程:firststagemain和secondstagemain负责不同的初始化步骤,如目录创建和安全策略配置。zygote进程则通过解析init.rc脚本启动,与appruntime交互,决定启动zygoteinit还是runtimeinit。
3. jvm初始化与zygoteinit.java:zygoteinit.java的main方法通过localserversocket接收命令,创建子进程并执行参数校验。
4. systemserver的启动:zygote的forksystemserver方法调用systemserver的main方法,activitymanagerservice开始管理服务和应用进程。
5. activitymanagerservice与launcher启动:activitymanagerservice启动核心服务,最终调用process.start()启动进程,子进程入口为activitythread的main(),至此launcher启动完毕。
了解这些核心步骤可以更好地理解android开发体系和系统启动的内在逻辑。要深入研究,可以参考一系列的学习资源。
当我们讨论android的启动过程时,会有很多疑问。例如,什么是linux内核?桌面系统linux内核与android系统linux内核有什么区别?什么是引导装载程序?什么是zygote?什么是x86以及arm linux?什么是init.rc?什么是系统服务?本文将为你解释这些问题,并帮助你理解android的启动过程。
引导程序执行分为两个阶段。在第一阶段,程序检测外部的ram并加载对第二阶段有用的程序。而在第二阶段,引导程序会设置网络、内存等,这些都是运行内核所必需的。根据配置参数或输入数据,引导程序可以进一步设置内核,以达到特定的目标。
对于android引导程序,可以在特定的路径中找到,如bootablebootloaderlegacyusbloader。传统的加载器包含多个文件,其中需要特别关注的是init.s和main.c两个文件。init.s负责初始化堆栈、清零bbs段,并调用main.c中的_main()函数。而main.c则负责初始化硬件(如闹钟、主板、键盘、控制台),并创建linux标签。
接下来是内核的启动过程。android内核的启动方式与桌面linux内核相似。在启动时,内核会设置缓存、被保护存储器、计划列表并加载驱动。完成系统设置后,内核会在系统文件中寻找”init”文件,然后启动root进程或系统的第一个进程。
init进程是第三个被启动的进程,可以视为root进程或者所有进程的父进程。它的主要责任包括挂载目录(如/sys、/dev、/proc)和运行init.rc脚本。相关文件可以在特定的系统路径下找到,如/system/core/init、/system/core/rootdir/init.rc和/system/core/init/readme.txt。
在android中,init.rc文件具有特定的格式和规则,被称为android初始化语言。其中包括动作、服务和选项的定义。动作是以命令流程命名的,有一个触发器决定动作是否发生。服务是init进程启动的程序,当服务退出时,init进程会根据情况重启服务。选项则是对服务的描述,影响init进程如何以及何时启动服务。
设置全局环境,创建用于cpu accounting的cgroup(资源控制)挂载点。在文件系统上挂载mtd分区。调整系统目录的访问权限,包括对/data目录及其子目录的更改。完成基本网络的初始化,管理内存等任务,启动系统管理器以管理所有本地服务,如位置、音频、shared preference等。启动zygote作为应用进程,此时可以在设备屏幕上看到“android”logo。
在java中,不同的虚拟机实例会为每个应用分配不同的内存。为了加快android应用的启动速度并减少内存消耗,android系统引入了“zygote”机制。它使得dalvik虚拟机能够共享代码、减少内存占用并缩短启动时间。当系统启动时,zygote作为虚拟器进程被预加载并初始化核心库类。这些核心类通常是只读的,并且是android sdk或核心框架的一部分。每个java虚拟机实例都有自己的核心库类文件和堆对象拷贝。
在启动过程中,系统请求zygote运行系统服务。这些服务由native和java编写而成,可以被视为一个进程。系统服务包含了所有的system services。这些服务通过zygote创建新的进程来启动,你可以在zygoteinit类的“startsystemserver”方法中找到相关源代码。
核心服务包括启动电源管理器、创建activity管理器、启动电话注册、启动包管理器等。除此之外,还有其他的系统服务如状态栏服务、硬件服务、网络状态服务等。所有这些服务都被启动并设置为系统进程。在这个过程中,你可以看到各种启动动画和服务注册的过程。
启动各项服务:
启动定位管理器,确保设备能够准确地进行定位。
紧接着,启动搜索服务,为用户提供快速、准确的搜索体验。
随后,启动剪切板服务,方便用户复制和粘贴操作。
进一步,启动登记服务,确保设备信息和用户数据得以妥善记录和管理。
接下来,启动壁纸服务,为用户带来个性化的界面体验。
再然后,启动音频服务,让用户可以享受高质量的音乐和通话体验。
启动耳机监听功能,确保耳机使用时的音频质量。
还需启动adbsettingsobserver,用于处理adb命令,提供更高级的开发和管理功能。
完成引导过程:
在系统服务成功加载到内存中后,android设备的引导过程即告完成。“action_boot_completed”开机启动广播会发出通知。设备已准备好供用户使用,各项功能和服务均已正常运行。