您的位置:首页 > 编程语言 > Go语言

zygote笔记

2016-07-15 00:59 423 查看
新的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(是通过类的静态方法注册
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: