Android启动流程

流程图

Idle进程

swapper 进程(idle)是通过引导程序加载的 pid 0

kthread

init/main.c--> kernel_init

try_to_run_init_process("/bin/init")

Init进程

init/main.cpp main

调用顺序 FristStageMain-->SetupSelinux-->SecondStageMain

FirstStageMain

1.init crash 时重启引导加载程序 这个没有找到地方

2.创建和挂载启动所需的文件目录(mount mkdir /dev/pts /dev/socket)

3.输入输出登重定向到 、dev/null

4.初始化 kernel Log

5.启动init 进程 /system/bin/init 启动进程可以参考这个

SetupSelinux

1.主要是用来提高linux的安全,进一步约束访问的权限

2.调用execv开启init进程 参数 second_stage

SecondStageMain

2.解析init.rc 文件 /system/core/rootdir/init.rc 在这个里面启动了Zygote-start

Zygote进程

frameworks/base/cmds/app_process/app_main.cpp main() runtime.start("com.android.internal.os.ZygoteInit", args, zygote);@AndroidRuntime --->startVm 先启动Vm然后 启动ZygoteInit

-->startReg() 注册JNI方法

-->env-->CallStaticVoidMethod() 使用JNI调用ZygoteInit的main函数进入Java世界

-->ZygoteInit.main()

ZygoteInit.main() 接上面流程

-->preload预加载信息

-->new ZygoteServer() 创建zygote的socket服务

-->r = forkSystemServer() fork 创建systemserver进程

-->r.run() @SystemServer Loop.loop进入无限循环

--> zygoteServer.runSelectLoop() zygote进入无限循环

除了kthread init进程:每个进程都是由zygote复制出来的

zygote 显示copy 只增加不一样的内存

所有的Java进程都是由zygote fork出来的

ZygoteInit

main-->

 zygoteServer = new ZygoteServer(isPrimaryZygote);//详见下面的构造方法
if (startSystemServer) {
            Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);
​
            // {@code r == null} in the parent (zygote) process, and {@code r != null} in the
            // child (system_server) process.
            if (r != null) {
                r.run();//会调用到SystemServer.main()里面去
                return;
            }
        }
    Log.i(TAG, "Accepting command socket connections");
​
    // The select loop returns early in the child process after a fork and
     // loops forever in the zygote.
     caller = zygoteServer.runSelectLoop(abiList);

 main-->
   -->forkSystemServer    r.run();//会调用到SystemServer.main()里面去
     --->Zygote.forkSystemServer
       --->handleSystemServerProcess     
          -->ZygoteInit.zygoteInit
            -->RuntimeInit.applicationInit 
              -->findStaticMain
                  ---> m = cl.getMethod("main", new Class[] { String[].class }); //这里通过反射获取到systemServer的main方法对象

ZygoteServer

构造方法

ZygoteServer(boolean isPrimaryZygote) {
    mUsapPoolEventFD = Zygote.getUsapPoolEventFD();
​
    if (isPrimaryZygote) {
        mZygoteSocket = Zygote.createManagedSocketFromInitSocket(Zygote.PRIMARY_SOCKET_NAME);
        mUsapPoolSocket =
                Zygote.createManagedSocketFromInitSocket(
                        Zygote.USAP_POOL_PRIMARY_SOCKET_NAME);
    } else {
        mZygoteSocket = Zygote.createManagedSocketFromInitSocket(Zygote.SECONDARY_SOCKET_NAME);
        mUsapPoolSocket =
                Zygote.createManagedSocketFromInitSocket(
                        Zygote.USAP_POOL_SECONDARY_SOCKET_NAME);
    }
​
    mUsapPoolSupported = true;
    fetchUsapPoolPolicyProps();
}

runSlelectLoop 死循环监听connect 监听到

ZygoteConnection connection = peers.get(pollIndex);
final Runnable command = connection.processOneCommand(this);
​
// TODO (chriswailes): Is this extra check necessary?
if (mIsForkChild) {
    // We're in the child. We should always have a command to run at
    // this stage if processOneCommand hasn't called "exec".
    if (command == null) {
        throw new IllegalStateException("command == null");
    }
​
    return command;
} else {
    // We're in the server - we should never have any commands to run.
    if (command != null) {
        throw new IllegalStateException("command != null");
    }
​
    // We don't know whether the remote side of the socket was closed or
    // not until we attempt to read from it from processOneCommand. This
    // shows up as a regular POLLIN event in our regular processing
    // loop.
    if (connection.isClosedByPeer()) {
        connection.closeSocket();
        peers.remove(pollIndex);
        socketFDs.remove(pollIndex);
    }
}

connection.processOneCommand 读 ZygoteProcess 发过来的参数 ZygoteProcess@attemptUsapSendArgsAndGetResult

然后 Zygote.forkAndSpecialize fork一个进程 然后启动一个进程

ZygoteConnection@handleChidProc 目的获取binder

-->ZygoteInit.zygoteInit()

-->ZygoteInit.nativeZygoteInit()

- ->AndroidRuntime@com_android_internal_os_ZygoteInit_nativeZygoteInit

- ->app_main.cpp@onZygoteInit

- ->Processstate::self()

-->new ProcessState (kDefaultDriver) const char* kDefaultDriver = "/dev/binder";

获取binder

ProcessState::ProcessState(const char *driver) 下面是mmap代码

Zygote fork一个进程出来 必须要获得binder 给systemServer 让systemServer和App通信

-->RuntimeInit.applicationInit

-->findStaticMain 通过反射找到ActivityThread main方法执行

ActivityThread

main

-->thread.attach()

  @UnsupportedAppUsage
    private void attach(boolean system, long startSeq) {
        sCurrentActivityThread = this;
        mSystemThread = system;
        if (!system) {
            android.ddm.DdmHandleAppName.setAppName("<pre-initialized>",
                                                    UserHandle.myUserId());
            RuntimeInit.setApplicationObject(mAppThread.asBinder());
            //获取AMS的本地代理类
            final IActivityManager mgr = ActivityManager.getService();
            try {
                //通过Binder调用AMS的attachApplication方法
                mgr.attachApplication(mAppThread, startSeq);//mAppThread是ApplicationThread 是一个Binder
                                                           //成员变量默认就赋值了
            } catch (RemoteException ex) {
                throw ex.rethrowFromSystemServer();
            }

经过上面的调用到

ActivityManagerService

attachApplication

-->attachApplicationLocked()

-->thread.bindApplication //会调用到ApplicationThread.bindApplication()

-->ApplicationThread.bindApplication()

-->handleBindApplication@ActivityThread

-->mInstrumentation.callApplicationOnCreate(app);//app.onCreate()

-->app.makeActive(thread, mProcessStats);//thread IApplicationThread

-->mProcessList.updateLruProcessLocked

-->mAtmInternal.attachApplicatio

AMS --> ProcessList:ProcessRecord:applicationThread

AMS-->applicationThread-->App

class ProcessRecord{

IApplicationThread thread;

}

SystemServer

systemServer启动了九十多个服务

见/android/SystemServer.mdj

通过SystemServiceManager来管理 所有的服务都继承SystemService 使用一套start stop逻辑

Lifecycle 是ActivityTaskManagerService的静态内部类

public static final class Lifecycle extends SystemService 解决java只能单继承的问题 最终调用到

main

-->run

ActivityTaskManagerService atm = mSystemServiceManager.startService(
            ActivityTaskManagerService.Lifecycle.class).getService();//启动atms
    mActivityManagerService = ActivityManagerService.Lifecycle.startService(
            mSystemServiceManager, atm);//启动AMS

SystemServiceManager mSystemServiceManager

SystemServiceManager.startService

-->systemService.onStart()

-->调用各自服务的实现

ActivityTaskManagerService.Lifecycle onstart实现

--> publishBinderService(Context.ACTIVITY_TASK_SERVICE, mService);

---> ServiceManager.addService(name, service, allowIsolated, dumpPriority);

ATMS

启动每个Activity对应了一个ActivityStart

ActivityStartController管理ActivityStart

mTargetStack.startActivityLocked 启动黑白屏 fork一个进程很耗时 黑白屏时App进程还未创建(这里有疑问应该是创建了的)

Instrumentation.startActivity

-->startActivityAsUser@ATMS getActivityStartController().obtainstart mFactory是DefaultFactory@ActivityStarter

-->execute@ATMS

RootWindowContainer

RootWindowContainer是窗口容器(WindowContainer的根容器) 管理了所有窗口容器

设备上所有的窗口(Window) 显示(Display)都是由它来管理的

resumeFocusedStackTopActivitys会恢复对应任务栈顶部的Activity,这个方法会检查一些可见性

如果当前需要resume的activityStack是可见的 这个时候才resume

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值