Android应用程序的启动

1,ActivityManagerService,通过Socket发送新建应用进程的请求到Zygote进程。

2,Zygote进程fork(通过复制自身)应用进程。

因为Zygote进程内部有虚拟机实例,所以应用进程就有一个拷贝的虚拟机,除此之外还可以获得一个Binder线程池和一个消息循环(就是Handler机制)。

如下代码:

public final class ActivityManagerService extends ActivityManagerNative
   implement Watchdog.Monitor,BatterStatsImpl.BatteryCallback{
    ...
    private final void startProcessLocked(ProcessRecord app,
             String hostingType,String hostingNamestr){
        try{
            int uid=app.info.uid;
            int[] gid=null;
            gid=mContext.getPackagemanager().getPackageGids(app.info.packageName);
            
            ...
            int pid=Process.start("android.app.ActivityThread",
                mSimpleProcessManagement?app.processName:null,
                did,uid,gids,debugFlags,null);

        }catch(RuntimeException){
            ...
        }
     }
}

在ActivityManagerService中,首先获取要创建应用进程的用户ID、用户组ID,然后调用Process类的静态方法start创建应用程序进程,并且指定了应用程序入口函数为android.app.ActivityThread类的main()方法。

   在Process.start(...)方法中,通过一系列的调用使Zygote进程fork出应用进程,在这个过程中创建了Binder线程池,用于进程间通信。并在ActivityThread类中开启消息循环。如下:

public final class ActivityThread{

      ...
      public static final void main(String[] args){
           ..
        Looper.prepareMainLooper();
        ...
        ActivityThread thread =new ActivityThread();
        thread.attach(false);
        ...
        Looper.loop();
        ...
      }
}

至此,应用程序的进程的消息循环创建完成,整个应用程序进程启动也完成。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值