Android进阶知识树——应用进程的启动过程

2023-11-15

程序的启动是从进程启动开始的,换句话说只有程序进程启动后,程序才会加载和执行,在AMS启动程序时首先会判断当前进程是否启动,对未启动的进程会发送请求,Zygote在收到请求后创建新的进程;

1、Zygote监听客户端请求

Android进阶知识树——Android系统的启动过程知道,系统的启动会执行到ZygoteInit.main()方法;

public static void main(String argv[]) {
   
   ZygoteServer zygoteServer = new ZygoteServer();//1
   zygoteServer.registerServerSocketFromEnv(socketName);
   caller = zygoteServer.runSelectLoop(abiList); //2
}

在main中创建并注册了服务端的Socket,然后执行runSelectLoop()循环等待AMS的请求创建进程,前一篇文章中跳过了这个部分,本片文章来分析下系统如何实现Socket通信的

  • registerServerSocketFromEnv()
void registerServerSocketFromEnv(String socketName) {
   
        if (mServerSocket == null) {
   
            int fileDesc;
            final String fullSocketName = ANDROID_SOCKET_PREFIX + socketName;//1
            try {
   
                String env = System.getenv(fullSocketName);//2
                fileDesc = Integer.parseInt(env);
            } 
            try {
   
                FileDescriptor fd = new FileDescriptor();//3
                fd.setInt$(fileDesc);
                mServerSocket = new LocalServerSocket(fd);//4
                mCloseSocketFd = true;
            } catch (IOException ex) {
   
        }
    }

在registerServerSocketFromEnv中()出入的参数为进程名称,由上一篇文章知道传入的为ztgote,然后使用ANDROID_SOCKET_PREFIX拼接Socket名称,最终的名称为ANDROID_SOCKET_zygote,然后将fullSocketName转换为环境变量的值,注释3处创建文件描述符,然后根据文件描述符fd创建LocalServerSocket对象;

public LocalServerSocket(FileDescriptor fd) throws IOException
    {
   
        impl = new LocalSocketImpl(fd);
        impl.listen(LISTEN_BACKLOG);
        localAddress = impl.getSockAddress();
    }

LocalService使用select监听文件描述符,当文件描述符上出现新内容时会自动触发中断,然后中断处理函数中再次读取文件描述福符上的数据,从而获取信息;

  • zygoteServer.runSelectLoop()
    Runnable runSelectLoop(String abiList) {
   
        ArrayList<FileDescriptor> fds = new ArrayList<FileDescriptor>();
        ArrayList<ZygoteConnection> peers = new ArrayList<ZygoteConnection>();
177        fds.add(mServerSocket.getFileDescriptor());//1
178        peers.add(null);
179
180        while (true) {
    //2
181            StructPollfd[] pollFds = new StructPollfd[fds.size()];
182            for (int i = 0; i < pollFds.length; ++i) {
   
183                pollFds[i] = new StructPollfd();
184                pollFds[i].fd = fds.get(i);
185                pollFds[i].events = (short) POLLIN;
186            }
187            try {
   
188                Os.poll(pollFds, -1);
189            } catch (ErrnoException ex) {
   
190                throw new RuntimeException("poll failed", ex);
191            }
192            for (int i = pollFds.length - 1; i >= 0; 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android进阶知识树——应用进程的启动过程 的相关文章

随机推荐

  • PCIe5.0的Add-in-Card(AIC)金手指layout建议(三)

    PCIe5 0的Add in Card AIC 金手指layout建议 一 PCIe5 0的Add in Card AIC 金手指layout建议 二 前面两篇文章介绍了第一种金手指的layout建议 适用速率在32 0 GT s 以下介绍
  • 关于爬虫技术

    1 什么是爬虫 爬虫是一种自动化程序 它能够模拟人类用户访问网站的行为 从网站上抓取数据并保存到本地或者进行进一步处理 爬虫是一种非常常用的网络数据采集工具 可以用于搜索引擎 电商数据采集 舆情监测等多个领域 通过使用爬虫 可以自动化地获取
  • springboot获取nacos的服务列表、实例列表及修改实例、发布配置等

    1 通过java sdk的方式发布配置 官方文档说明 https nacos io zh cn docs sdk html https nacos io zh cn docs open api html 1 1构造ConfigService
  • Linux系统中环境变量的设置

    目录 业务描述 设置环境变量的方法 系统环境变量 指定用户环境变量 临时有效的环境变量 系统常用环境变量应用分析 PATH 环境变量 HOME 环境变量 HISTSIZE 环境变量 LOGNAME环境变量 SHELL环境变量 业务描述 Li
  • 【JAVA进阶】File类、字节流

    个人主页 个人主页 系列专栏 JAVASE基础 前言 目前的编程中 数据存储方式有很多种 包括但不限于 文件存储 将数据以文件的形式存储在磁盘上 可以使用文件读写操作进行数据的存取 数据库存储 将数据以表格的形式存储在数据库中 可以使用SQ
  • 黑群晖docker安装人人影视_在云主机上手动安装腾讯PAI面板

    本文关键字 云主机上装管理面板 在前面 我们介绍过lnmp sandstorm paas 还有黑群晖 docker管理面板 这些都是云OS上的面板扩展和APPSTACK扩展 分散在不同级别被实现 像群晖这种是OS和面板一体的 包括这里要介绍
  • line-height的使用

    line height 26px 表示行高为26px line height 120 表示行高为当前字体大小的120 line height 2 6em 表示行高为当前字体的2 6倍 带单位的行高都有继承性 其子元素继承的是计算值 如父元素
  • 计算机盲打最快要多久,电脑打字怎样做到又快又准确

    除了熟悉26个字母 我们还要熟悉键盘 熟悉键盘是根本 可以下载个金山打字通练习下很快就上手了 而本文笔者着重给大家讲解下可以帮助自己快速输入的技巧 还是要利用工具的 我们聊天的时候 有的词语如果是你常用到的 而这个词又有点长 不是成语类的
  • ctfshow-网络迷踪-新手上路 ( 使用百度搜图收集景点信息)

    ctf show 网络迷踪模块第1关 只有一座桥的图片 拿到桥的名字即可 推荐使用百度搜图 先把图片下载到本地 使用百度搜图收集图片中的景点信息 根据搜图的结果可以发现 图片的来源均指向同一个地方 三亚蜈支洲岛 接下来 百度搜索 三亚蜈支洲
  • 死锁的讲解

    目录 1 死锁定义 2 死锁产生原因 3 如何解决死锁问题 1 死锁定义 死锁是指两个或两个以上的进程在执 过程中 由于竞争资源或者由于彼此通信 造成的 种阻塞的现象 若 外 作 它们都将 法推进下去 也就是两个线程拥有锁的情况下 在尝试获
  • 六、可解释性分析(Datawhale组队学习)

    文章目录 前言 理论简介 CAM算法 Lime算法 DFF算法 代码实战 torch cam工具包实战 pytorch gradcam工具包实战 captum工具包实战 shap工具包实战 lime工具包实战 总结 参考资料 本文内容为 同
  • alter table语法

    文档地址 http docs oracle com cd B19306 01 server 102 b14200 statements 3001 htm CIHCFDDJ ALTER TABLE Purpose Use the ALTER
  • shell脚本中的多行注释

    shell 中注释的使用方法 1 单行注释 单行注释最为常见 它是通过一个 来实现的 注意shell脚本的最开始部分 bin bash 的 号不是用来注释的 2 多行注释 在shell脚本中还有一种多行的注释方法 我们称之为 HERE DO
  • 机器视觉毕业设计 深度学习人体跌倒检测系统 - opencv python

    文章目录 0 前言 课题背景和意义 1 实现方法 传统机器视觉算法 基于机器学习的跌倒检测 SVM简介 SVM跌倒检测原理 算法流程 算法效果 深度学习跌倒检测 最终效果 网络原理 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不
  • 解决:报错cv2.error: OpenCV(4.1.2) error: (-215:Assertion failed) !_img.empty() in function ‘cv::imwrite‘

    cv2 error OpenCV 4 1 2 C projects opencv python opencv modules imgcodecs src l oadsave cpp 715 error 215 Assertion faile
  • 常见线性滤波(第一篇博客)

    一 基本概念了解 1 什么是图像滤波 官方解释 图像滤波 即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制 是图像预处理中不可缺少的操作 其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性 个人理解 为图像滤波是通过设计
  • Kubernetes 101,第二部分,pod

    在上一篇文章中 我们了解了Kubernetes 的基础知识以及对其主要架构的介绍 介绍完毕后 就该探索如何在 Kubernetes 中运行应用程序了 容器包装器 在 Kubernetes 中 我们无法直接创建单个容器 相反 为了更好 我们可
  • 加工中心G76,G87,G83,G84数控代码讲解

    G76表示精密镗孔循环 具体使用格式如下面 G76 X Y Z R Q F
  • Linux Shell脚本字符串变量拼接与赋值总结

    Linux Shell脚本字符串总结 1 字符串拼接 2 定义值为双引号或单引号的字符串 3 在单引号和双引号字符串中取变量值 最近在工作用到shell脚本 用到了字符串变量的拼接 同时需要对字符串进行赋值 这里与大家分享一下 1 字符串拼
  • Android进阶知识树——应用进程的启动过程

    程序的启动是从进程启动开始的 换句话说只有程序进程启动后 程序才会加载和执行 在AMS启动程序时首先会判断当前进程是否启动 对未启动的进程会发送请求 Zygote在收到请求后创建新的进程 1 Zygote监听客户端请求 由Android进阶