android运行过程简书,Android系统启动流程

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,并安装

db955d3526de

image.png

db955d3526de

image.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 permissions = new ArrayList(0);

public final ArrayList permissionGroups = new ArrayList(0);

public final ArrayList activities = new ArrayList(0);//1

public final ArrayList receivers = new ArrayList(0);

public final ArrayList providers = new ArrayList(0);

public final ArrayList services = new ArrayList(0);

public final ArrayList instrumentation = new ArrayList(0);

...

}

db955d3526de

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内部结果如图

db955d3526de

PackageParser结构图.png

千言万语不如一张图,仔细看此图即可

db955d3526de

PKMS安装APK流程.png

db955d3526de

APK安装时序图.jpg

开始消息commit之前的流程提示用户安装选择是否安装的界面,是个Activity(startInstall->confirmInstallDialog->然后启动Task->mSession.commit,就到了图中),此图只分析了新安装APK,(里面还有覆盖安装,Instat启动,以及验证等)

Lancher启动(负责显示APP)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值