android启动app详细,Android APP启动方式、启动流程及启动优化分析

从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()是应用的启动入口,在应用程序启动的时候就会调用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值