Init进程启动
Linux启动进程,但凡是Linux系统的改版都要先启动此进程(乌班图,CentOS,RedHat,Android等),
Zygote进程启动
从Init.rc配置中启动,
1 建立localServerSocket
接受各种命令,因为此时ServiceManager并没启动,无法利用Binder跨进程通信,利用select模式(非阻塞模式),来了新链接(因为此时如果有新链接,则代表有程序需要启动)就fork出一个子进程,子进程即为程序(apk)
。关闭子进程serverSocket
2启动SystemServer
startSystemServer,fork出一个进程,子进程就是SystemServer,再利用反射,找到SystemServer的Main函数,直接调用其Main函数。关闭子进程的serverSocket
SystemServer启动(启动AMS,PMS,WMS等)
1 startBootstrapService
2 startCoreService
3 startOtherService
AMS启动
1 反射调用newInstance,然后加入到ServiceManger中,调用其onStart函数。
2 在startOtherService函数里 调用systemReady(等待其他服务启动完成)
3 在systemReady里面,startHomeActivityLocked(AMS启动的第一个Acitivity)
谁能响应INTENT.CATEGORY_HOME,谁就可以当做HomeActivity,如果有多个都能响应,则会让用户选择,作为以后启动的第一个Activity。
WMS启动
PKMS启动
与AMS同属于引导服务,在SystemServer里的startBootstrapService()
PKMS解析apk,并安装
image.pngimage.png
经过安全性等一系列检测会调用自身的startInstall(),然后跳转到InstallAppProgress(Android7.0版本,一个Activity,此类真正负责安装APK),显示安装界面,如果点确定,
则将APK的信息通过IO流的形式写入到PackageInstaller.Session中。
调用PackageInstaller.Session的commit方法,将APK的信息交由PMS处理。
本文主要讲解了PMS是如何处理APK安装的,主要有几个步骤:
PackageInstaller安装APK时会将APK的信息交由PMS处理,PMS通过向PackageHandler发送消息来驱动APK的复制和安装工作。
PMS发送INIT_COPY和MCS_BOUND类型的消息,控制PackageHandler来绑定DefaultContainerService,完成复制APK等工作。
复制APK完成后,会开始进行安装APK的流程,包括安装前的检查、安装APK和安装后的收尾工作。
public final static class Package implements Parcelable {
public String packageName;
public String manifestPackageName;
public String[] splitNames;
public String volumeUuid;
public String codePath;
public String baseCodePath;
...
public ApplicationInfo applicationInfo = new ApplicationInfo();
public final ArrayList<Permission> permissions = new ArrayList<Permission>(0);
public final ArrayList<PermissionGroup> permissionGroups = new ArrayList<PermissionGroup>(0);
public final ArrayList<Activity> activities = new ArrayList<Activity>(0);//1
public final ArrayList<Activity> receivers = new ArrayList<Activity>(0);
public final ArrayList<Provider> providers = new ArrayList<Provider>(0);
public final ArrayList<Service> services = new ArrayList<Service>(0);
public final ArrayList<Instrumentation> instrumentation = new ArrayList<Instrumentation>(0);
...
}
PKMS扫描apk图.png
PackageManagerService.scanPackageLI()负责扫描APK,里面调用pp.parsePackage解析apk具体的信息,pp就是PackageParser类,
其主要负责解析apk,调用流程是parsePackage()->parseBaseApk()->parseBaseApkCommon(),PKMS->CommitPackageSetting,会将AndroidManiFest.xml文件注册的四大组件信息,全部保存在自己的Package类中, 而APK的真正安装则需要DefaultContainerService这个类来先执行INIT_COPY(代表复制apk至临时目录),然后PackageHandler来发送MSC_BOUND消息,
PackageParser内部结果如图
PackageParser结构图.png
千言万语不如一张图,仔细看此图即可
PKMS安装APK流程.png APK安装时序图.jpg
开始消息commit之前的流程提示用户安装选择是否安装的界面,是个Activity(startInstall->confirmInstallDialog->然后启动Task->mSession.commit,就到了图中),此图只分析了新安装APK,(里面还有覆盖安装,Instat启动,以及验证等)
网友评论