zygote笔记

新的android应用程序A并非通过fork来重新装载已有进程的代码区,而是被动的加载到复制出的Dalvik虚拟机上,Zygote进程将执行流程交给应用程序A类的方法.  Zygote子进程动态加载并运行Android应用程序A   通过已加载至内存中的类与资源来加快运行速度
共享父进程的内存空间 需要修改才复制到自身的内存空间进行修改


Zygote是由java编写的 不能由init进程启动运行  若想运行Zygote必须先生成Dalvik虚拟机,再在虚拟机上面装载Zygoteinit类
执行这一任务的就是app_process进程 先创建虚拟机,然后运行ZygoteInit.main
传递给虚拟机的选项都是以-开始.  /system/bin 保存在AppRuntime 的mParentDir
init.rc
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
第三个参数表示加载com.android.internal.os.ZygoteInit类,最后一个参数,作为选项传递给生成的类  用于启动运行系统服务器
AppRuntime的start成员函数,生成并初始化虚拟机,而后将ZygoteInit类加载至虚拟机中
开启java虚拟机startVm
startReg注册虚拟机要使用的jni函数
findclass都是带/的  env->callStaticVoidMethod方法 转到java虚拟机中运行java应用程序C++代码执行流会一致等待
ZygoteInit类装载到了虚拟机中
绑定套接字registerZygoteSocket(),接收新Android应用程序运行请求./dev/socket/zygote形式注册的套接字
从ActivityManager接收新Android应用程序的生成请求  该套接字在系统启动过程中由init进程生成
LocalServerSocket  sServerSocket = new LocalServerSocket(createFileDescriptor(fileDesc)和/dev/socket/zygote绑定在一起    sServerSocket实例接收生成Android进程的信息
  preloadClasses();加载类的
  preloadResources();加载资源 访问系统资源 先调用Resource类的静态方法getSystem
执行SystemServer进程中运行类的main方法,会加载名称为android_servers的本地库,libandroid_servers  android_server_SystemServer_init1->
本地库加载完毕后,继续调用init1函数(是初始化本地服务的).然后执行system_init函数.
frameworks/base/cmds/system_server/library/system_init.cpp  本地服务注册完毕后,再次调用 system_server类的静态方法init2 初始化Android services服务,方法创建serverThread线程,启动framework服务
若ZYGOTE_FORK_MODE为false 程序调用runSelectLoopMode()方法采用异步处理方式,直到zygote进程终止.
为了处理传递给/dev/socket/zygote套接字的链接请求,程序先创建出ZygoteConnection类的对象  生成Credentials,检查请求连接一方的访问权限. 为了处理ZygoteConnection的输入输出事件,将套接字描述符添加到描述符数组中,此时,index必大于0
runonce生成新的Android应用程序 ZygoteConnection的runOnce方法
pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid,parsedArgs.gids, parsedArgs.debugFlags, rlimits);
binderService是为了控制  创建的服务在同一个进程中,则该服务为本地服务,
远程服务并不在同一进程中    绑定是服务的客户端为实现服务的远程控制而进行相互连接的一个过程
远程服务    
使用RemoteService的客户端通过Isecondary接口,调用RemoteService提供的getPid函数.
bindService(new Intent(ISecondary.class.getName()),mSecondaryConnection, Context.BIND_AUTO_CREATE);
        mSecondaryBinder = new ISecondary.Stub()
                mSecondaryService = ISecondary.Stub.asInterface(service);
                        new com.example.android.apis.app.ISecondary.Stub.Proxy(obj);
Process.killProcess(pid);
本地服务使用C++编写,运行在Libraries层  所以音频数据均有Audio Flinger进行输出
Surface Flinger 提供系统范围内的   将各种应用程序的surface组合后渲染到frame buffer
核心平台服务AMS  WMS位于Surface flinger之上 将要绘制到机器上的内容传递给Surface flinger  pms加载apk文件
硬件服务
  alarm manager servicce      Connectivity service网络连接服务 location service power service 设备电源管理
  sensor service传感器服务  Telephony service电话机状态及电话服务 wifi service 无线网络连接
  getSystemService创建对于的Local manager对象 通过生成的Local Manager对象调用Location Service
  应用程序服务需要startservice 而 系统服务 直接调用getSystemService  媒体服务器 Media Server和系统服务器system server   surface flinger由system server启动
  frameworks/base/media/mediaserver/main_mediaserver.cpp
74 void CameraService::instantiate() {
75    defaultServiceManager()->addService(
76            String16("media.camera"), new CameraService());


frameworks/base/libs/audioflinger/AudioPolicyService.cpp
426   void AudioPolicyService::instantiate() {
427    defaultServiceManager()->addService( 
428            String16("media.audio_policy"), new AudioPolicyService());


SystemServer的main方法代码主要功能是加载android_servers库,并调用init1方法,init1方法通过JNI调用system_init本地函数
callStatic是JNI包装函数  ServiceManager.addService(是通过类的静态方法注册
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值