Android Framework实战开发-跨进程通信之 epoll详细讲解

Android Handler之阻塞机制epoll 1.Linux epoll epoll全称eventpoll(poll译为投票数、计票),是Linux内核中的一种可扩展IO事件处理机制,能够提高应用程序同时有大量IO操作请求时的性能,它是Linux I/O多路复用的其中一个实现(除了epoll外,还有select和poll)。 那么linux系统是如何处理IO事件的呢? 一般当系统同时发起多个IO事件请求时,Linux需要轮询所有事件,处理每个事件对应的事件流。由于系统中链接Linux内核的IO事件太多了,每一次轮询都需要耗费大量的时间和资源。 阅读详情
AI摘要

本文介绍epoll的工作原理及其在跨进程通信中的应用。epoll通过高效地处理多路I/O事件,解决了传统阻塞I/O模式下的性能瓶颈。文章详细解释了epoll的主要方法、工作模式,并提供了服务端与客户端的具体实现代码。

1、epoll出现的背景

首先了解2个基本概念:
阻塞IO(blocking IO):
socket 的阻塞模式意味着必须要做完IO 操作(包括错误)才会返回。
非阻塞IO(blocking IO):
非阻塞模式下无论操作是否完成都会立刻返回,需要通过其他方式来判断具体操作是否成功。
回想一下上节课我们的网络通信的demo:
针对Server端它做的事情如下:

 while(1) {
        cliun_len = sizeof(cliun);
        if ((connfd = accept(listenfd, (struct sockaddr *)&cliun, &cliun_len)) < 0){
            perror("accept error");
            continue;
        }
        printf("new client connect to server,client sockaddr === %s \n",((struct sockaddr *)&cliun)->sa_data);
        while(1) {
            memset(buf,0,sizeof(buf));
            n = read(connfd, buf, sizeof(buf));
            if (n < 0) {
                perror("read error");
                break;
            } else if(n == 0) {
                printf("EOF\n");
                break;
            }

            printf("received: %s\n", buf);

            for(i = 0; i < n; i++) {
                buf[i] = toupper(buf[i]);
            }
            write(connfd, buf, n);
        }
        close(connfd);
    }

上面代码其实流程:
accept一直等待客户端连接
—>
客户端连接后,一直等待读取客户端发过来的数据
这里的accept和read默认一般都是一个阻塞的方法,即所谓的blocking IO,在调用read时候,会一直等到read到了数据才会进行返回。在没有数据这段时间那么程序就只能一直停留在read这个方法里面,不能继续执行下一步。
大家明显有没有发现一个问题,当前这个线程好像就只能服务一个客户端,但是真实的场景很可能有很多个客户端连接服务端,那这个时候服务端 是怎么做到和客户端同时通信的呢?你可以想到有哪些方法?
思路1、我们可以考虑针对一个客户端一个线程的方式,那样每个线程分别和一个客户端进行数据读取及回复,这种其实在客户端本身数量不会超过1-2个情况下是完全可以的,但是一旦客户端的数量一多呢?
假设有20个客户端与服务器进行通信,难道服务端还来20个线程,甚至更多20000个客户端呢?那不可能20000个线程吧

思路2、大家可能会想到read方法可以不可以做成那种 nonblocking IO 模式,在调用read时候,如果发现系统没有数据就立即返回,有数据就读取。这里告诉大家的是确实有这样的不阻塞模式。具体设置方法可以参考如下:
fcntl 函数可以将一个socket 句柄设置成非阻塞模式:

flags = fcntl(sockfd, F_GETFL, 0); //获取文件的flags值。 
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); 
//设置成非阻塞模式;
flags = fcntl(sockfd,F_GETFL,0);
fcntl(sockfd,F_SETFL,flags&~O_NONBLOCK); 
//设置成阻塞模式;

当read方法是非阻塞后,那么我们是不是可以一个线程里面不断的循环调用read各个客户端的数据,那么代码可能就变成这样:

while(1) {
	read(fd1...);//客户1
	read(fd2...);//客户2
	read(fd3...);//客户3
}

但以上方式也有一些严重问题:
如:当客户都没有数据时候,那么这个线程就一直在空跑,死循环的调用read数据,实际又还没有,白白浪费大量cpu,这里有同学会说那么while时候进行一个延时不就行了么?其实这种思路也是不行的,因为你没办法确认这个延时多少合适,如果小了一样耗费cpu,如果设置大了,那么就会造成接收数据的延时。

由于上述方案的种种缺点,引出了 I/O 多路复用技术(I/O multiplexing)。复用是指在同一个进程(线程)中,处理多路 I/O,多路指多个文件描述符。它核心思想收集进程感兴趣的全部描述符,然后调用一个函数,当这些描述符中的一个或多个准备好 I/O 时,函数返回并告知进程是哪些描述符准备好了。此时进程只需要去这些准备好的描述符上操作即可。这多路复用的在linux上具体实现方法目前使用最多的是select,poll,epoll。目前android系统中大部分都是epoll,所以这里就重点介绍epoll。

2、epoll主要方法

2、epoll接口

epoll操作过程需要三个接口,分别如下:

#include <sys/epoll.h>
int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
(1) int epoll_create(int size);

创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大。这个参数不同于select()中的第一个参数,给出最大监听的fd+1的值。需要注意的是,当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致fd被耗尽。

(2)int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

epoll的事件注册函数,它不同与select()是在监听事件时告诉内核要监听什么类型的事件epoll的事件注册函数,它不同与select()是在监听事件时告诉内核要监听什么类型的事件,而是在这里先注册要监听的事件类型。第一个参数是epoll_create()的返回值,第二个参数表示动作,用三个宏来表示:
EPOLL_CTL_ADD:注册新的fd到epfd中;
EPOLL_CTL_MOD:修改已经注册的fd的监听事件;
EPOLL_CTL_DEL:从epfd中删除一个fd;
第三个参数是需要监听的fd,第四个参数是告诉内核需要监听什么事,struct epoll_event结构如下:

struct epoll_event {
  __uint32_t events;  /* Epoll events */
  epoll_data_t data;  /* User data variable */
};

events可以是以下几个宏的集合:
EPOLLIN :表示对应的文件描述符可以读(包括对端SOCKET正常关闭);
EPOLLOUT:表示对应的文件描述符可以写;
EPOLLPRI:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);
EPOLLERR:表示对应的文件描述符发生错误;
EPOLLHUP:表示对应的文件描述符被挂断;
EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。
EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里

(3) int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

等待事件的产生,类似于select()调用。参数events用来从内核得到事件的集合,maxevents告之内核这个events有多大,这个maxevents的值不能大于创建epoll_create()时的size,参数timeout是超时时间(毫秒,0会立即返回,-1将不确定,也有说法说是永久阻塞)。该函数返回需要处理的事件数目,如返回0表示已超时。

3、工作模式

epoll对文件描述符的操作有两种模式:LT(level trigger)和ET(edge trigger)。LT模式是默认模式,LT模式与ET模式的区别如下:

LT模式:当epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序可以不立即处理该事件。下次调用epoll_wait时,会再次响应应用程序并通知此事件。

ET模式:当epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序必须立即处理该事件。如果不处理,下次调用epoll_wait时,不会再次响应应用程序并通知此事件。

ET模式在很大程度上减少了epoll事件被重复触发的次数,因此效率要比LT模式高。epoll工作在ET模式的时候,必须使用非阻塞套接口,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。

3、epoll的实战demo

服务端epoll:

#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>
#include <sys/epoll.h>
#define MAXLINE 80

char *socket_path = "server-socket";

int main()
{
    struct sockaddr_un serun, cliun;
    socklen_t cliun_len;
    int listenfd, connfd, size;
    char buf[MAXLINE];
    int i, n;

    if ((listenfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
        perror("socket error");
        exit(1);
    }

    memset(&serun, 0, sizeof(serun));
    serun.sun_family = AF_UNIX;
    strncpy(serun.sun_path,socket_path ,
                   sizeof(serun.sun_path) - 1);
    unlink(socket_path);
    if (bind(listenfd, (struct sockaddr *)&serun, sizeof(struct sockaddr_un)) < 0) {
        perror("bind error");
        exit(1);
    }
    printf("UNIX domain socket bound\n");

    if (listen(listenfd, 20) < 0) {
        perror("listen error");
        exit(1);
    }
    printf("Accepting connections ...\n");
     // 4. 创建epoll树
    int epfd = epoll_create(1000);
    if(epfd == -1)
    {
        perror("epoll_create");
        exit(-1);
    }
    //5、将用于监听的lfd挂的epoll树上(红黑树)
    struct epoll_event ev;//这个结构体记录了检测什么文件描述符的什么事件
    ev.events = EPOLLIN;
    ev.data.fd = listenfd;
    epoll_ctl(epfd, EPOLL_CTL_ADD, listenfd, &ev);//ev里面记录了检测lfd的什么事件
    // 循环检测 委托内核去处理
    struct epoll_event events[1024];//当内核检测到事件到来时会将事件写到这个结构体数组里


    while(1) {
        int num = epoll_wait(epfd, events, sizeof(events)/sizeof(events[0]), -1);//最后一个参数                                                                                                                                              表示阻塞
        for (int i = 0;i<num;i++) {
            if(events[i].data.fd == listenfd)//有连接请求到来
            {

                int len = sizeof(cliun);
                int connfd = accept(listenfd, (struct sockaddr *)&cliun, &len);
                if(connfd == -1)
                {
                    perror("accept");
                    exit(-1);
                }
                printf("a new client connected! \n");
                //将用于通信的文件描述符挂到epoll树上
                ev.data.fd = connfd;
                ev.events = EPOLLIN;
                epoll_ctl(epfd, EPOLL_CTL_ADD, connfd, &ev);
            } else {
                 //通信也有可能是写事件
                if(events[i].events & EPOLLOUT)
                {
                    //这里先忽略写事件
                    continue;
                }
                char buf[1024]={0};
                int count = read(events[i].data.fd, buf, sizeof(buf));
                if(count == 0)//客户端关闭了连接
                {
                    printf("客户端关闭了连接。。。。\n");
                    //将对应的文件描述符从epoll树上取下
                    close(events[i].data.fd);
                    epoll_ctl(epfd, EPOLL_CTL_DEL, events[i].data.fd, NULL);
                }
                else
                {
                    if(count == -1)
                    {
                        perror("read");
                        exit(-1);
                    }
                    else
                    {
                        //正常通信
                        printf("client say: %s\n" ,buf);
                        write(events[i].data.fd, buf, strlen(buf)+1);
                    }
                }

            }

        }
    }
    close(listenfd);
    return 0;
}

客户端的epoll实现:

#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#define MAXLINE 80

char *client_path = "client-socket";
char *server_path = "server-socket";

int main() {
        struct  sockaddr_un cliun, serun;
        int len;
        char buf[100];
        int sockfd, n;

        if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){
                perror("client socket error");
                exit(1);
        }
//    signal(SIGPIPE, SIG_IGN);
    memset(&serun, 0, sizeof(serun));
    serun.sun_family = AF_UNIX;
    strncpy(serun.sun_path,server_path ,
                   sizeof(serun.sun_path) - 1);
    if (connect(sockfd, (struct sockaddr *)&serun, sizeof(struct sockaddr_un)) < 0){
        perror("connect error");
        exit(1);
    }
    printf("please input send char:");
    while(fgets(buf, MAXLINE, stdin) != NULL) {
         write(sockfd, buf, strlen(buf));
         n = read(sockfd, buf, MAXLINE);
         if ( n <= 0 ) {
            printf("the other side has been closed.\n");
            break;
         }else {
            printf("received from server: %s \n",buf);
         }
         printf("please input send char:");
    }
    printf("end server  date");
    close(sockfd);
    return 0;
}

更多framework干货请关注“千里马学框架”

Android进阶——Handler底层fd监听之epoll机制 Handler 消息循环机制底层也是依赖于epoll 实现的。 阅读详情

相关推荐

Android-深入底层:Linux事件管理机制-epoll

当调用 epoll_wait检查是否有发生事件的连接时,只是检查 eventpoll对象中的 rdllist双向链表是否有 epitem元素而已,如果 rdllist链表不为空,则把这里的事件复制到用户态内存中,同时将事件数量返回给用户。因此,epoll_wait的效率非常高。epoll_ctl在向 epoll对象中添加、修改、删除事件时,从 rbr红黑树中查找事件也非常快,也就是说,epoll是非常高效的,它可以轻易地处理百万级别的并发连接。

2401_86399813的博客 875

Android深入浅出——Epoll机制

一个核心的方法是mHandler.getLooper().getQueue().isPolling()watchdog并没有过多解释,这还得去Handle源码来探究Epoll机制。Looper是整个消息机制流水线的发动机,其动力在。Looper直接调用了queue的。MessageQueue的。学习watchdog时,

qq_53884337的博客 697

Android Framework开发核心能力与面试指南

Android Framework开发是移动互联网领域的关键技术方向,涉及Linux内核、Java/Kotlin语言和系统架构设计的深度融合。其核心价值在于理解系统底层机制与上层设计的协同原理,如Binder IPC机制和Handler消息循环等关键技术。掌握这些能力不仅能提升应用性能优化水平,还能解决系统级问题如内存泄漏和启动速度优化。在工程实践中,Framework开发者需要具备源码调试、性能分析和跨模块问题排查等实战技能。对于求职者而言,深入理解Android系统启动流程、AMS工作原理等高频面试题,

weixin_30700099的博客 360

千里马Android Framework实战开发-跨进程通信专题博客总结

千里马Android Framework实战开发-跨进程通信专题课表介绍 因为课程还剩下最后一部分binder驱动没有讲完,但是粉丝同学们已经迫不及待想要要提前看,这里就先分享一个课表给大家,提醒一下,课表的很大,你忍一下。。。。。 预计一星期左右可以上线全部视频,大家敬请期待课程杀青 ...

learnframework的博客 4279

Android Framework学习路线:从Binder到SystemServer的系统进阶指南

Android系统架构中,应用层与底层之间的桥梁是Framework,它承载着跨进程通信、消息驱动与系统服务调度等关键机制。其中,Binder作为Android核心IPC通信骨架,依靠mmap实现一次拷贝,为应用与系统服务的高效交互提供基础;Handler消息循环则保障了单线程模型下任务的有序执行,是主线程稳定运行的根基。理解这些原理,不仅有助于优化应用性能,更是掌握系统定制与问题定位的前提。从应用启动到视图绘制,从触摸事件分发到画面合成,Framework贯穿始终。本文将结合实际工程视角,系统梳理从Bin

weixin_34209851的博客 352

Android高级工程师面试核心考点与实战解析

Android系统开发中,Framework层原理与性能优化是构建高质量应用的技术基石。Binder机制通过内存映射实现高效跨进程通信,其设计融合了Linux内核的进程隔离与mmap技术,成为Android系统级通信的核心方案。在性能优化领域,内存泄漏检测、ANR分析等工具链的深度使用,直接影响应用流畅度与稳定性。这些技术广泛应用于电商、社交等高频场景,解决诸如界面卡顿、冷启动耗时等工程难题。本文以高级工程师面试为切入点,深入解析Handler消息机制、Flutter渲染管线等热点技术,帮助开发者系统掌握从

circularr9834的博客 403

android Framework 中用到了哪些跨进程通信方式?

我们常用的AMS,PMS 等都是通过Binder机制来完成跨进程通信的,那么除了Binder ,Linux 还有其他跨进程通信的方式可以选择?

Lud的博客 1077

Android Framework学习路线:从Binder到AMS的系统级进阶指南

Android应用开发者的技术成长,往往受限于对底层的理解程度。掌握Android Framework,意味着从调用API升级为理解系统设计,能够真正解决App启动慢、进程被杀、ANR等疑难问题。核心机制如Binder跨进程通信、Handler消息循环、AMS组件调度,构成了整个系统的神经网络与心脏。理解这些原理,不仅有助于精准定位性能瓶颈,还能在混合开发通信、多进程架构等场景中做出更优的技术决策。无论是突破业务开发的天花板,还是应对高级岗位面试中对系统原理的追问,深入学习Framework都是关键路径。本

weixin_34209851的博客 399

【安卓BInder底层1】Linux常见跨进程通信方式

Linux 中跨进程通信方式有很多种,安卓framework中主要使用到了四种。 管道 Socket 内存共享 信号 一、管道 1、特点 a、半双工的,即单项的。 管道描述符数据只能往一个方向流,要么是读,要么是写。 如果需要既能读又能写,那么管道需要两个文件描述符。Linux还是很人性化的,提供了api pipe(fds),这个api可以生成一对描述符,一个用于读,一个用于写。 int result = pipe(fd) // 创建管道 fd[0] // 数组代表

dev晴天的博客 619

C#精准获取Windows已安装应用清单的完整方案

Windows已安装应用识别是IT资产管理、安全合规与自动化运维的基础能力。其核心原理在于突破文件系统表象,以注册表为可信数据源,分层解析HKLM/HKCU、64位/32位视图及MSI Products路径中的元数据。技术价值体现在可验证(如过滤SystemComponent=1)、可关联(通过ProductCode绑定补丁与许可证)、可操作(启动路径二次验证+卸载命令沙箱执行)。典型应用场景包括终端合规审计、软件资产清查、静默卸载脚本开发及多版本应用聚合分析。本文聚焦C#原生实现,覆盖注册表四路采集、La

weixin_33552698的博客 634

yolov5 onnx推理时报错[ONNXRuntimeError] : 2 : INVALID_ARGUMENT : Unexpected input data type.

yolov5 onnxruntime 推理报错

zjulkw的博客 1223

Android Framework实战开发-socketpair介绍及它在android系统源码使用分析

csdn在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论 android跨进程通信实战视频课程(加群获取优惠) Android Framework实战开发-socketpair介绍及它在android系统源码使用分析 1.socketpair介绍 在linux下,使用socketpair函数能够创建一对套节字进行进程间通信(IPC)。 函数原形: #include <sys/types.h> #include <sys/socket.h> int so

liaosongmao1的专栏 383

【Matlab】如何使用Simulink进行电池建模和SOC预估

“通过Simulink电池建模进行SOC预估,其实挺容易!” 1 声明 本文只描述一般性电池建模方法,文中出现的电池相关数据来自一些论文或者外文文献,对数据的真实性不做任何保证。 本文参考了不少国内高校的硕士论文和外文文献,所以本篇文章只作为学术性交流,未经...

wanff1204的博客 2万+

Framework笔记 | Android Framework用到了哪些IPC方式,分别在哪里用到

是否了解Linux常用的跨进程通信方式 android很多底层实现, 都依赖于Linux的操作系统调用; 是否研究过Android Framework并了解一些实现原理 是否了解Framework各组件之间的通信原理 很多组件基本都是要跨进程的, 跨进程通讯并不全是用Binder机制; 主要关注三个层面 列举用到哪些IPC方式 各个IPC方式的特点...

aaLiweipeng的博客 339

ROS局部路径规划器插件teb_local_planner流程梳理(上)

在我之前的文章《ROS导航包Navigation中的 Movebase节点路径规划相关流程梳理》中已经介绍过Move_base节点调用局部路径规划器插件的接口函数是computeVelocityCommands,接下来,我们就从这个函数入手梳理一下teb_local_planner功能包的工作流程。

慕羽★的博客 5165

VTK在QT与非QT环境下使用的区别

VTK可以在QT框架内使用,也可以独立于QT使用,这两种使用方式在架构、交互和渲染方面有显著差异。

深之JohnChen的专栏 629

Android socketpair 源码深度解析与跨进程通信应用实践

在操作系统底层机制中,进程间通信(IPC)始终是连接各模块的核心纽带。与广为人知的 Binder 相比,socketpair 作为一种基于 Unix domain socket 的全双工本地通信机制,在特定场景下展现出不可替代的价值。它无需依赖系统服务管理器,天然支持双向数据传输,并具备内核级阻塞唤醒特性,可有效解决跨进程大数据传输、Looper 线程唤醒、渲染同步等工程难题。从源码层面看,socketpair 的创建路径、缓冲区管理逻辑及与 Binder 驱动的协同方式,决定了它在 Android 系统中

weixin_29165465的博客 346

Java使用POI生成柱状图导出到word文档(柱状图)

本篇文章主要介绍,如何使用Apache POI组件生成柱状图导出到word文档中,具体步骤看下文。 一、实现效果 Java使用POI技术生成柱状图导出到word文档中,最终生成的柱状图如下所示: 二、环境准备 编程语言:Java 第三方依赖:Apache POI Apache POI依赖代码如下所示: <dependencies> <dependency> <groupId>org.apache.poi</groupId.

✅ Java 开发工程师 7371

Android Framework用到了哪些IPC方式?

文章目录管道通信socket通信共享内存信号总结 这道题想考察什么? 是否了解Linux常用的跨进程通信方式 是否研究过Android Framework并了解一些实现原理 是否了解Framework各组件之间的通信原理 Linux IPC方式 管道 Socket 共享内存 信号 管道通信 半双工的,单向的 一般是在父子进程之间使用 int main(void) { int n, fd[2]; char buf[SIZE]; //生成一对描述符,一个用来写,一

hongxue8888的博客 390

如何用 Claude Code 阅读和理解陌生代码

摘要: 在接手陌生代码时,Claude Code能显著提升理解效率。核心策略是结构化拆解而非逐行阅读: 从整体入手:先扫描目录结构、定位核心模块,建立项目地图; 聚焦关键路径:通过数据流追踪、异常逻辑分析,识别技术债与风险点; 规避常见错误:避免抽象提问或一次性提交全部代码,应分模块精准提问; 高阶应用:可生成逻辑分层图、标记高复杂度区域,甚至定制阅读顺序。 最终目标是通过结构优先的提问策略,将理解周期从数天压缩至数小时。

sg_knight的专栏 1020

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Android Framework实战视频--init进程的bootanimation启动源码分析(补充Android 10部分的BootAnimation的启动源码分析)

课程答疑和新课信息:QQ交流群:422901085进行课程讨论 FrameWork入门课视频链接:https://edu.youkuaiyun.com/course/detail/30298 FrameWork实战课1视频链接:https://edu.youkuaiyun.com/course/detail/30275 FrameWork跨进程通信视频链接:https://edu.youkuaiyun.com/course/detail/35911 专题博客系列: Android 8.1 zygote 启动过程源码 Android Frame

liaosongmao1的专栏 273

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Android Framawork : IPC总结

7-1 Android Frmawork用到了哪些IPC 考察: 1,看你是否了解Linux常用的跨进程通信,比较Android底层是Linux,它很多底层实现依赖于Linux的OS调用, 2,是否研究过Android Framework的一些原理 3,是否了解Framwork各个组件之间的通信原理。 组件之间通信都要跨进程,而且并不只是用了binder 这节课不讲binde...

小老鼠的博客 461

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

面试福利2:安卓系统framework开发面试题目汇总(不断更新)

这篇文章汇总了Framework开发相关的常见面试题,内容涵盖Socket通信、Binder机制、ANR分析、系统性能优化等多个方面。文章分为三个部分:第一部分列出20多个高频技术问题,包括socketpair跨进程通信、Binder的oneway模式、ANR触发条件等;第二部分展示三位学员的真实面试经历,涉及项目经验、系统优化、多线程等实战问题;第三部分提出一个关于InputFlinger进程设计的思考题。所有问题都鼓励学员在VIP群内讨论交流,文章最后还推荐关注"千里马学框架"获取更

liaosongmao1的专栏 102
上一篇: Android Framework实战开发视频--跨进程通信之Unix Socket通信
下一篇: 千里马Android Framework实战课程-应用程序app的Binder启动篇
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值