zoukankan      html  css  js  c++  java
  • Android应用正常启动流程分析

    • Activity类的startActivity()方法开始,这个方法会调用Activity类中的public void startActivityForResult()方法
    • startActivityForResult()方法会调用Instrumentation类中的public ActivityResult execStartActivity()方法,这个方法加上了{@hide}对外是不可见的
    • execStartActivity()方法中有如下的调用语句ActivityManagerNative.getDefault().startActivity(),它调用了IActivityManager类中的startActivity()方法
    • 但IActivityManager其实只是一个接口,这里实际调用的是public abstract classActivityManagerNative这个类(它继承自Binder类)的内部类ActivityManagerProxy中的public int startActivity()方法,ActivityManagerProxy实现了IActivityManager接口
    • ActivityManagerProxy类的public int startActivity()方法中有如下代码,mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0),这里mRemote是一个IBinder对象,这个对象在ActivityManagerProxy构造方法中实例化,实际由外部类ActivityManagerNative的static public IActivityManager asInterface(IBinder obj)方法实例化,asInterface(IBinder obj)方法中参数实际在ActivityManagerNative类的static public IActivityManager getDefault()方法中,由ServiceManager.getService(“activity”)实例化
    • mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0)这条语句通过IBinder的transact()方法,将方法中的参数跨进程传递给ActivityManagerService类
    • 以上除ActivityManagerService类之外的类都位于android.app包下
    • 下面进入ActivityManagerService类,它位于源码的/frameworks/base/services/java/com/android/server/am/路径下,包名是com.android.server.am
    • ActivityManagerService继承了ActivityManagerNative类,从ActivityManagerProxy类的mRemote.transact()传递过来的参数,被传递到ActivityManagerService类的onTransact()方法来处理
    • ActivityManagerService类的onTransact()方法实际上通过super.onTransact(code, data, reply, flags)这条语句又调用了ActivityManagerNative类中的onTransact()方法
    • super.onTransact(code, data, reply, flags)这条语句会调用到ActivityManagerService类的public final int startActivity()方法
    • ActivityManagerService类的startActivity()方法会调用到ActivityStack类的startActivityMayWait()方法
    • ActivityStack类位于com.android.server.am包下,startActivityMayWait()方法final int startActivityLocked()方法
    • startActivityLocked()方法最后会调用final boolean resumeTopActivityLocked()方法
    • resumeTopActivityLocked()方法会调用private final void startSpecificActivityLocked()方法
    • startSpecificActivityLocked()方法会调用startProcessLocked()方法
    • startProcessLocked()方法会调用android.os.Process类的public static final int start()方法
    • int pid = Process.start(“android.app.ActivityThread“, mSimpleProcessManagement ? app.processName : null, uid, uid, gids, debugFlags, null)
    • 下面进入android.os包下的Process类中
    • start()方法会调用private static int startViaZygote()方法
    • startViaZygote()方法会调用private static int zygoteSendArgsAndGetPid()方法
    • zygoteSendArgsAndGetPid()方法会使用socket与zygote进程通信
    • sZygoteSocket = new LocalSocket();
    • sZygoteSocket.connect(new LocalSocketAddress(ZYGOTE_SOCKET, LocalSocketAddress.Namespace.RESERVED));
    • 下面进入com.android.internal.os包下的ZygoteInit
    • ZygoteInit类里面含有LocalSocketServer的实例,会与上面提到的zygoteSendArgsAndGetPid()方法使用socket进行通信
    • 实际逻辑在ZygoteConnection这个类中的boolean runOnce()方法中
    • runOnce()方法会调用dalvik.system.Zygote这个类中的静态方法forkAndSpecialize()
    • 下面进入dalvik.system包中的Zygote类
    • forkAndSpecialize()最终调用了native的方法native public static int forkAndSpecialize()
    • 在c代码中开启应用程序的进程
    • 应用的进程从android.app包下的ActivityThread类开始运行
    • ActivityThread类中含有main()方法
    • ActivityThread.main()是应用的启动入口,在应用程序启动的时候就会调用

    Activity相关

    • ActivityManagerService中会使用ActivityStack类来保存当前打开的Activity的信息
    • ActivityStack类中实际保存的是一些列的ActivityRecord实例
    • 在ActivityManagerService中也就是系统服务端记录下Activity信息后,需要在客户端记录一份Activity的信息
    • 这个通过在ActivityStack类的realStartActivityLocked()方法中通过对ActivityThread类的scheduleLaunchActivity()调用来实现
    • scheduleLaunchActivity()方法会新建ActivityClientRecord类的实例,ActivityClientRecord是ActivityThread的内部类
    • ActivityClientRecord就是用来保存客户端Activity信息的
    • 在scheduleLaunchActivity()方法的最后会执行queueOrSendMessage(H.LAUNCH_ACTIVITY, r)
    • 上面这条语句把启动Activity的消息传给ActivityThread的另一个内部类H来处理
    • H类是一个Handle,其中会执行handleLaunchActivity()
    • handleLaunchActivity()会调用private final Activity performLaunchActivity()
    • performLaunchActivity()方法最终调用Instrumentation类中的newActivity()方法,根据ActivityClientRecord中的参数,创建了Activity类的实例
    • 在创建Activity之后,通过ActivityThread类的handleResumeActivity()方法将其显示在屏幕上

    一点补充

    • 上面提到的服务端指系统的服务,客户端指每个应用
    • ZygoteInit类的main()方法会调用startSystemServer()
    • 也就是说SystemService是在Zygote进程之后启动的
  • 相关阅读:
    简单易懂dubbo入门实例
    Java中String和byte[]间的 转换
    优秀项目
    Linux下命令行安装weblogic10.3.6
    Linux中VMware虚拟机增加磁盘空间的扩容操作
    office2016_windows永久激活查看方法
    解决eclipse报PermGen space异常的问题
    Ubuntu 18.04上nginx+php环境搭建
    git hook之commit-msg用于检测提交时间是否正确
    maven随记
  • 原文地址:https://www.cnblogs.com/zhengtu2015/p/5105492.html
Copyright © 2011-2022 走看看