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

Android 7系统输入(六)定制安卓系统的输入模块 定制点位置核心代码作用① DOWN/UP 打印ALOGD(...)在源头过滤 MOVE,只打印按下和抬起② 窗口名打印知道事件发给了哪个窗口② 控件名打印知道事件最终被哪个控件消费③ 焦点变更去掉窗口切换时实时输出焦点信息三个定制点覆盖了输入系统从事件产生 → 目标定位 → 焦点管理的完整链路。这些改造不需要深入理解 Android 输入系统的全部细节——只需要知道在哪个文件的哪个函数里加一行日志,就能让原本"静默"的输入系统变得透明可见。 阅读详情
AI摘要

本文深入解析了Linux下的socketpair函数,用于创建匿名的进程间通信通道。通过示例代码展示了如何在C++中使用socketpair进行通信,并详细剖析了Android系统中socketpair在触摸事件处理中的应用,涉及InputChannel和Binder机制。此外,还介绍了Android Framework中socketpair的使用场景,以及其与传统socket的区别和优势。

csdn在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论

android跨进程通信实战视频课程(加群获取优惠)
Android Framework实战开发-socketpair介绍及它在android系统源码使用分析

1.socketpair介绍

在linux下,使用socketpair函数能够创建一对套节字进行进程间通信(IPC)。

函数原形:
#include <sys/types.h>
#include <sys/socket.h>

int socketpair(int domain, int type, int protocol, int sv[2]);

参数1(domain):表示协议族,在Linux下只能为AF_LOCAL或者AF_UNIX。(自从Linux 2.6.27后也支持SOCK_NONBLOCK和SOCK_CLOEXEC)
参数2(type):表示协议,可以是SOCK_STREAM或者SOCK_DGRAM。SOCK_STREAM是基于TCP的,而SOCK_DGRAM是基于UDP的
参数3(protocol):表示类型,只能为0
参数4(sv[2]):套节字柄对,该两个句柄作用相同,均能进行读写双向操作
返回结果: 0为创建成功,-1为创建失败,并且errno来表明特定的错误号,具体错误号如下所述:

EAFNOSUPPORT:本机上不支持指定的address。

EFAULT: 地址sv无法指向有效的进程地址空间内。

EMFILE: 已经达到了系统限制文件描述符,或者该进程使用过量的描述符。

EOPNOTSUPP:指定的协议不支持创建套接字对。

EPROTONOSUPPORT:本机不支持指定的协议。

2、出现背景及与socket对比优势

大家明显原来的socket是一种c/s模型,需要客户端与服务端进行连接,连接还需要知道服务端的ip,unix socket就是对应的unix的路径。连接后当然也完全可以实现服务端和客户端的双向通信,这种情况一般比较适合于很多个客户端对应一个服务的情况。但是如果说本身就只是单独2个进程进行相互通信的需求socketpair这个东西出现就显示更加简单一些,不要有客户端和服务端进行connect过程,也没有服务端的一个ip和unix socket路径的概念,它完全是匿名的,在创建socketpair初就已经确定了对应的2个socket的fd,两端直接与对应fd读写既可以。

3、实战demo代码开发

#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#define SOCKET_BUFFER_SIZE      (32768U)
int main ()
{
    int fd[2];
    int bufferSize = SOCKET_BUFFER_SIZE;
    int r = socketpair( AF_UNIX, SOCK_STREAM, 0, fd );
    if ( r < 0 ) {
        perror( "socketpair()" );
        exit( 1 );
    }
 /*设置socket描述符的选项*/
    setsockopt(fd[0], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize));
    setsockopt(fd[0], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize));
    setsockopt(fd[1], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize));
    setsockopt(fd[1], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize));

    if ( fork() ) {
        /* Parent process: echo client */
        int val = 0;
        close( fd[1] );
        while ( 1 ) {
            sleep( 1 );
            ++val;
            printf( "parent Sending data: %d\n", val );
            write( fd[0], &val, sizeof(val) );
            read( fd[0], &val, sizeof(val) );
            printf( "parent Data received: %d\n", val );

        }
    }
    else {
        /* Child process: echo server */
        int val ;
        close( fd[0] );
        while ( 1 ) {
            read( fd[1], &val, sizeof(val) );
            printf( "son Data received: %d\n", val );
            ++val;
            write( fd[1], &val, sizeof(val) );
            printf( "son send received: %d\n", val );
        }
    }
}

编译: gcc socketpair_2_process.c -o socketpair_2_process
执行打印结果:
在这里插入图片描述

注意: socketpair创建的只适用于父子进程或者线程间通信,不能用于两个进程之间通信。如果要实现两个进程之间的双向通信,则需要将socketpair创建的一个描述符fd发送给另一个进程。

4、android源码中对它的使用(这里我们不对某个模块进行详细分析,只是对使用到的socket相关的代码进行讲解)

首先来了解一下android触摸事件是怎么到我们app的,先看app的ViewRootImpl类:

  public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
        synchronized (this) {
            if (mView == null) {
                。。省略
                if ((mWindowAttributes.inputFeatures
                        & WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL) == 0) {
                    mInputChannel = new InputChannel();
                }
                。。省略
                    res = mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes,
                            getHostVisibility(), mDisplay.getDisplayId(),
                            mAttachInfo.mContentInsets, mAttachInfo.mStableInsets,
                            mAttachInfo.mOutsets, mInputChannel);
                } catch (RemoteException e) {
                   。。省略
               
    }

这里我们省略绝大部分代码,这里可以看出,app层面new InputChannel后然后调用mWindowSession.addToDisplay方法,注意哦这里方法是个跨进程通信方法:
在这里插入图片描述
这里可以看出我们传递了一个InputChannel实际上是由服务端来进行修改哦,客户端app这边只是刚开始搞了一个空壳。。,这里就是我们binder的中级部分的知识,是不是学过binder后看起这个代码来就瞬间秒懂
接下来我们看服务端的addToDisplay实现:

   @Override
    public int addToDisplay(IWindow window, int seq, WindowManager.LayoutParams attrs,
            int viewVisibility, int displayId, Rect outContentInsets, Rect outStableInsets,
            Rect outOutsets, InputChannel outInputChannel) {
        return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
                outContentInsets, outStableInsets, outOutsets, outInputChannel);
    }

这里其实调用是WindowManagerService的addWindow

public int addWindow(Session session, IWindow client, int seq,
            WindowManager.LayoutParams attrs, int viewVisibility, int displayId,
            Rect outContentInsets, Rect outStableInsets, Rect outOutsets,
            InputChannel outInputChannel) {
       。。省略
            final WindowState win = new WindowState(this, session, client, token, parentWindow,
                    appOp[0], seq, attrs, viewVisibility, session.mUid,
                    session.mCanAddInternalSystemWindow);
            

            if  (openInputChannels) {
                win.openInputChannel(outInputChannel);
            }
。。省略
        return res;
    }

这里调用的openInputChannel

void openInputChannel(InputChannel outInputChannel) {
        if (mInputChannel != null) {
            throw new IllegalStateException("Window already has an input channel.");
        }
        String name = getName();
        InputChannel[] inputChannels = InputChannel.openInputChannelPair(name);
        mInputChannel = inputChannels[0];
        mClientChannel = inputChannels[1];
        mInputWindowHandle.inputChannel = inputChannels[0];
        if (outInputChannel != null) {
            mClientChannel.transferTo(outInputChannel);
            mClientChannel.dispose();
            mClientChannel = null;
        } else {。。省略
        }
        mService.mInputManager.registerInputChannel(mInputChannel, mInputWindowHandle);
    }

这里重点优势调用了InputChannel这个静态方法的openInputChannelPair,最后会调用到native端nativeOpenInputChannelPair:

static jobjectArray android_view_InputChannel_nativeOpenInputChannelPair(JNIEnv* env,
        jclass clazz, jstring nameObj) {
。。省略
    status_t result = InputChannel::openInputChannelPair(name, serverChannel, clientChannel);
。。省略
    return channelPair;
}

这里又调用到了InputChannel::openInputChannelPair,但这个是native的c++代码,openInputChannelPair代码实现如下:

status_t InputChannel::openInputChannelPair(const String8& name,
        sp<InputChannel>& outServerChannel, sp<InputChannel>& outClientChannel) {
    int sockets[2];
    if (socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets)) {
        status_t result = -errno;
        ALOGE("channel '%s' ~ Could not create socket pair.  errno=%d",
                name.string(), errno);
        outServerChannel.clear();
        outClientChannel.clear();
        return result;
    }

    int bufferSize = SOCKET_BUFFER_SIZE;
    setsockopt(sockets[0], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize));
    setsockopt(sockets[0], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize));
    setsockopt(sockets[1], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize));
    setsockopt(sockets[1], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize));

    String8 serverChannelName = name;
    serverChannelName.append(" (server)");
    outServerChannel = new InputChannel(serverChannelName, sockets[0]);

    String8 clientChannelName = name;
    clientChannelName.append(" (client)");
    outClientChannel = new InputChannel(clientChannelName, sockets[1]);
    return OK;
}

看到这里大家是不很熟悉??这个不就是socketpair么。。
这里就相当于创建socketpair第一个fd给服务端InputDispather,另一个呢给客户端,当然这里因为给客户端是直接binder跨进程通信的,就是前面开始我们看到的那个addToDisplay方法里面的最后一个参数
在这里插入图片描述
那么接下来客户端干了什么呢?
在setView中会创建对应WindowInputEventReceiver:

  if (mInputChannel != null) {
              。。省略
                    mInputEventReceiver = new WindowInputEventReceiver(mInputChannel,
                            Looper.myLooper());
                }

这里把我们wms返回的mInputChannel传递给了WindowInputEventReceiver,它的构造方法会调用super的构造:

   public WindowInputEventReceiver(InputChannel inputChannel, Looper looper) {
            super(inputChannel, looper);
        }

super对应构造如下:

 public InputEventReceiver(InputChannel inputChannel, Looper looper) {
      。。省略
        mInputChannel = inputChannel;
        mMessageQueue = looper.getQueue();
        mReceiverPtr = nativeInit(new WeakReference<InputEventReceiver>(this),
                inputChannel, mMessageQueue);

        mCloseGuard.open("dispose");
    }

这里会jni调用nativeInit:

static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak,
        jobject inputChannelObj, jobject messageQueueObj) {
  。。省略
    sp<NativeInputEventReceiver> receiver = new NativeInputEventReceiver(env,
            receiverWeak, inputChannel, messageQueue);
    status_t status = receiver->initialize();
。。省略
    return reinterpret_cast<jlong>(receiver.get());
}

这里构造NativeInputEventReceiver对象,然后调用initialize:

status_t NativeInputEventReceiver::initialize() {
    setFdEvents(ALOOPER_EVENT_INPUT);
    return OK;
}

这里就是调用setFdEvents:

void NativeInputEventReceiver::setFdEvents(int events) {
    if (mFdEvents != events) {
        mFdEvents = events;
        int fd = mInputConsumer.getChannel()->getFd();
        if (events) {
            mMessageQueue->getLooper()->addFd(fd, 0, events, this, NULL);
        } else {
            mMessageQueue->getLooper()->removeFd(fd);
        }
    }
}

注意啦,这里获取了InputChannel的socketpair的fd,然后调用Looper的addFd方法:

Looper的addFd实现在system/core目录寻找,它不在framework下面:

./libutils/Looper.cpp:430: return addFd(fd, ident, events, callback ? new SimpleLooperCallback(callback) : NULL, data);

int Looper::addFd(int fd, int ident, int events, const sp<LooperCallback>& callback, void* data) {
..省略

    { 
    ..省略
        if (requestIndex < 0) {
            int epollResult = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, fd, & eventItem);
            ..省略
            mRequests.add(fd, request);
        } else {
            int epollResult = epoll_ctl(mEpollFd, EPOLL_CTL_MOD, fd, & eventItem);
            if (epollResult < 0) {
                if (errno == ENOENT) {
      			..省略
                    epollResult = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, fd, & eventItem);
                   ..省略
            }
            mRequests.replaceValueAt(requestIndex, request);
        }
    } // release lock
    return 1;
}

大家是不是看到了,其实Loop本质也是用了epoll来实现的,这里的addFd其实就是epoll的add操作

Android中socketpair双向通信详解 主要为大家详细介绍了Android socketpair双向通信的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 立即下载

相关推荐

基于eBPF和LSM的强制文件访问控制系统架构设计和实现

本文介绍了一种基于 eBPF 与 Linux 安全模块(LSM)实现的强制文件访问控制系统。该系统利用 eBPF 的高性能和动态加载能力以及 LSM 的系统调用拦截功能,提供了灵活且强大的文件访问控制策略。文章详细描述了系统的设计思路、架构组成、关键代码实现及错误处理方式。通过用户空间程序与内核态 eBPF 程序的协作,实现了对文件操作的实时监控和控制,支持动态更新安全策略而无需重启系统。此外,文中还讨论了未来可能的扩展方向,如增加更多 hook 点、集成其他安全模块以及性能优化等。

Linux内核研究者 1839

基础篇_android应用到framework开发实战

课程简介本课程专为希望从Android应用开发转向Framework开发的程序员设计。我们将深入探讨Android系统源码,帮助学员全面掌握Framework开发的核心内容。本课程为入门篇,从系统开发中最常用和接触到的知识点入手,让大家平滑的掌握一定的系统开发能力课程目标了解和掌握Android系统源码:通过手把手的教学方式,让学员深入了解Android系统的各个组成部分及其源码。掌握实际系统开发岗位的日常作业:课程内容以实际Framework开发岗位的日常工作为基础,确保学员能够胜任真实的工作环境。掌握Framework开发的核心知识点:课程将以实际功能点和知识点为出发点,系统地教授Framework开发的基本内容。实现个性化开发:通过学习各种简单但有趣的功能点,学员不仅可以掌握Framework开发的知识点,还能定制化一个属于自己的Android操作系统。课程特色实战导向:所有课程内容都基于实际工作中的功能点和知识点,确保学员能够学以致用。源码解析:深入剖析Android系统源码,帮助学员理解底层实现原理。功能驱动:通过实现具体的功能点,让学习过程更加有趣和富有挑战性。个性化定制:最终目标是让学员能够自定义和优化Android操作系统,具备实际开发和调试能力。

gcc/g++ 链接库的编译与链接

gcc/g++ 链接库的编译与链接 surgewong@gmail.com http://blog.youkuaiyun.com/surgewong       程序编译一般需要经预处理、编译、汇编和链接几个步骤。在实际应用中,有些公共代码需要反复使用,就把这些代码编译成为“库”文件。在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态(链接)库,其特点是可

Surge 4万+

Android Framework实战预制packages/apps下应用APK预制使用Android.bp方式

hi粉丝朋友大家好! 以前在android framework入门课讲解过第三方应用apk的预制相关内容,那时候是基于Android 8.1的Android.mk,但大家依旧对Android.bp的预制不知道怎么做,所以很多粉丝经常私下问我,干脆这里给大家blog分享,这里我们来使用Android.bp进行预制,因为现在高版本大部分其实都是使用Android.bp,新版本packages/apps下面android 12几乎看不到Android.mk的身影,所以当然我们也需要与时俱进。但是Android.b

learnframework的博客 3369

OTP语音芯片SOP8的前世今生_如九齐_硕呈_钰绅等以及国产方案KT148A

语音芯片ic的其中一个品类,就是SOP8封装的OTP语音芯片,非常的经典和常用。源头的供应商基本都是台系的原厂,比如:九齐、硕呈、佑华等等,其中佑华就算是鼻祖了,早期的4位机也是在语音市场得到了升华。 OTP(One Time Programmable)是单片机的一种存储器类型,意思是一次性可编程:程序烧入单片机后,将不可再次更改和清除。

qyvhome的博客 1873

OpenCV学习笔记(25)基于MFC和OpenCV的摄像机定标与立体匹配测试程序(20140505更新)

最近整理了一下这两年一直在用的摄像机定标与立体匹配测试程序,将代码进行了重构,界面也做了调整,分享出来方便有需要的朋友使用。当然我的编程能力有限,程序可能还有各种bug,请大家多多包涵。相关问题欢迎留言或email联系讨论,谢谢! ==================================================================================源码

晨宇思远 5万+

Linux网络编程——Unix本地套接字

概述  今天,给大家讲解网络编程中的一个内容——Unix 本地套接字。   发现很多人不知道或者不太了解 Unix 本地套接字这个概念,这也难怪,socket API 原本就是为多台主机之间网络通信设计的,并且这种网络 socket 同样支持单台主机上的进程间通信,当然这样做的话,仍然需要 IP 地址和端口号(通过 loopback 地址 127.0.0.1)。Unix本地套接字,其实就是一种专门

程序员「阿基米东」的编程之旅 1万+

K-means在关键词聚类中的尝试

K-means在文本聚类中的尝试 K-means算法是无监督的聚类算法。它的算法思想是:先随机选取K个对象作为初始的聚类中心。然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。一旦全部对象都被分配了,每个聚类的聚类中心会根据聚类中现有的对象被重新计算。 K-means算法的关键点在于: 初始k个聚类中心的选择 距离的计...

BigPig_LittleTail的博客 5573

1个月学会Android开发,【Android面试题】

(因为过程比较顺利,题目没有好好记下来,大概就是下面这些吧)1.项目相关2.hashmap3.线程a 等b,b等c的实现4.类的equals重写5.线程安全是什么 如何保证多线程安全7.简单工厂 抽象工厂 是什么8.判断一个数组是不是后序遍历(代码 )(二面一开始的时候我还是有些紧张的,但是我没想到居然挺简单,这也直接导致我三面轻敌了)1.项目(10min)2.算法题:判断一个字符串是否是一个IPV43.算法题:连续子数组的最大和(剑指Offer上的题)

2401_84413145的博客 700

Arduino平台软硬件原理及使用——Arduino Uno板卡的使用

Arduino Uno板卡的基本使用

洪博hopes的博客 4174

【HOJ系列】HOJ判题机部署

【HOJ系列】HOJ判题机部署

随风浪仔的专栏 904

Android-Framework学习笔记(六)应用程序进程启动过程

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的14套腾讯、字节跳动、阿里、百度等2021面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。[外链图片转存中…(img-wH45wOWv-1711912226915)]

2401_84006689的博客 946

2026华为OD机试(Python)真题【E卷+A卷+B卷+C卷+D卷】目录+在线OJ

华为OD机试真题题库【E卷+A卷+B卷+C卷+D卷】目录,Python实现。

MISAYAONE的博客 29万+

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

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

weixin_29165465的博客 346

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

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

liaosongmao1的专栏 102

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Android输入子系统架构与排查实战:从EventHub到事件分发

在Android应用开发中,触摸事件响应、按键映射或输入卡顿等问题往往涉及从硬件到应用层的完整链路。理解输入子系统(Input Subsystem)的工作原理,是从应用层走向系统层的关键一步。该系统由EventHub负责内核设备事件的采集,InputReader完成原始事件的语义化转换,而InputDispatcher则根据窗口信息与焦点状态,将事件精准分发至目标应用,并通过InputChannel实现跨进程通信。掌握这一机制,不仅能帮助开发者快速定位点击无响应、ANR或事件错乱等典型故障,还能为ROM定制

weixin_33970449的博客 415

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Android Input事件分发全链路解析:从硬件中断到View onTouchEvent

Input事件分发是Android触摸交互的底层基石,其本质是系统对硬件输入信号(如/dev/input/eventX)的统一采集、跨进程调度与UI线程协同处理过程。核心原理在于InputManagerService(IMS)通过InputReader和InputDispatcher双线程协作,结合WMS窗口管理实现事件路由,并依托Binder IPC与Choreographer VSync机制保障低延迟与渲染一致性。该机制支撑了手势识别、多点触控、焦点切换等关键能力,广泛应用于自定义View、手写板、游戏

weixin_34310369的博客 279

Android Input事件分发全链路解析:从硬件中断到MotionEvent

Input事件是Android交互体验的底层基石,其本质是将硬件产生的原始输入信号(如触摸、按键)经内核驱动、HAL层、Native服务、Java框架,最终转化为应用可处理的MotionEvent或KeyEvent。该过程涉及Linux input子系统、InputReader事件采集、InputDispatcher窗口路由、ViewRootImpl跨进程投递及View体系分发等核心机制。理解其五层架构与时间敏感性(如16ms采样周期、VSYNC对齐),对解决触摸延迟、手势冲突、ANR及定制化输入行为(如游

weixin_33842304的博客 227

Android Input事件分发全链路解析:从硬件采样到onClick回调

Input事件分发是Android交互体验的底层基石,本质是将硬件层原始输入流(如触摸坐标、按键码)经Linux内核、HAL、Native Service与Java Framework多层协同处理,最终投递至View的onTouchEvent或onClick回调。其核心依赖InputReader与InputDispatcher双线程模型实现高吞吐与低延迟,通过四类Target(Window/Touch/Pointer/Key)路由策略保障窗口层级与触摸目标精准匹配,并由五种DispatchMode(Sync

weixin_33860528的博客 209

Android Framework实战开发篇

广大的Android应用开发者是不是对Android系统充满着好奇,是不是很想学习Android系统开发,可惜自己学习难度又太大,本课程将手把手教你学Android Framework开发,带你走进Android系统开发的殿堂,全课程以实战为主,让你自己动手可以定制自己喜欢的Android系统,让你的Android职业道路越走越顺。学完本课程能让你学会如下知识点:-学习对BootAnimation的启动源码分析-学习对BootAnimation的opengl绘制源码分析-学习对BootAnimation的zip方式绘制源码分析-学习制作一个带有时间的显示的BootAnimation的动画-深入理解zip方式定制BootAnimation-学习android native层的posix线程实现-学习android native层封装的Threads类源码及使用-学习zygote的启动源码分析-学习zygote的进程创建过程源码分析-学习zygote启动systemserver过程分析-学习systemserver的启动分析-学习systemserver的HomeActivity的启动源码分析-学习systemserver与zygote进行socket通信创建进程源码分析-学习systemserver启动FallbackHome的Activtiy-学习FallbackHome结束及跳转Launcher源码分析-学习native c/c++层的堆栈打印

android framework实战-跨进程通信binder专题

千里马8年Android系统及应用开发经验,曾担任过美国unokiwi公司移动端技术总监兼架构师,对系统开发,性能优化,应用高级开发有深入的研究,Android开源定制ROM Lineage的贡献者之一,国内首家线下开辟培训Android Framework课程,拥有2年的Android系统培训经验。成为腾讯课堂专业负责android framework课程分享第一人,致力于提高国内android Framework水平Android Framework领域内是国内各大手机终端科技公司需要的人才,应用开发者都对Android系统充满着好奇,其中的binder是重中之重,都说无binder无Android,binde是Android系统的任督二脉。课程水平循序渐进,由中级再到高级,满足各个层次水平的android开发者。1、灵活使用binder跨进程通信,在app端对它的任何api方法等使用自如2、可以单独分析android系统源码中任何binder部分,分析再也没有难度3、掌握binder驱动本质原理,及对应binder驱动怎么进行跨进程通信,及内存等拷贝方式数据等4、对binder从上层的java app端一直到最底层的内核binder驱动,都可以顺利理通5、针对系统开发过程中遇到的binder报错等分析方法,及binder bug案例学习6、针对面试官任何的binder问题都可以对答自如7、socket这种跨进程通信实战使用8、针对android源码中使用的socket源码轻松掌握9、android系统源码中最常见的socketpair中双向跨进程通信10、使用socket实现一个可以让app执行shell命令的程序

深入Android Framework开发(入门篇)

广大的Android应用开发者是不是对Android系统充满着好奇,是不是很想学习Android系统开发,可惜自己学习难度又太大,本课程将手把手教你学Android Framework开发,带你走进Android系统开发的殿堂,全课程以实战为主,让你自己动手可以定制自己喜欢的Android系统,让你的Android职业道路越走越顺。 学完本课程能让你学会如下知识点: -学习Framework背景及它的巨大作用-Android源码环境搭建及让自己系统第一次跑起来-学习Frameowork开发的一些必要基础知识-学习怎么进行Android源码定位分析,实例:Activity启动流程源码分析-实战开发Frameowork项目--去除第三方应用入口广告页

进阶篇_android应用到framework开发实战——开机向导

课程简介本课程是为希望从 Android 应用开发转向 Framework 开发,并进一步提升技能的程序员设计的进阶篇。在本课程中,我们将聚焦于 Android 系统中的开机向导功能,深入探讨其源码和实现方式,帮助学员全面掌握 Framework 开发的核心内容。通过实际项目的驱动,本课程将带领学员从开发 Android 系统应用的角度切入,详细讲解开机向导的实现过程,以及如何在 Framework 层面进行定制和优化。OOBE课程目标深入了解和掌握 Android 开机向导:通过详细的源码解析和实际开发,学员将深入理解开机向导的各个组成部分及其实现原理。掌握系统应用的开发和定制:以开机向导为例,课程将教授如何开发和定制系统级应用,确保学员能够胜任真实的工作环境。提升 Framework 开发的核心能力:通过实际项目的驱动和功能点的实现,系统地提升学员在 Framework 开发中的实战能力。实现系统应用的个性化开发:通过学习和实践,学员不仅可以掌握开机向导的开发,还能定制化自己的系统应用,打造个性化的 Android 操作系统。课程特色项目导向:课程内容紧密结合实际项目,以开机向导为核心,确保学员能够学以致用。源码解析:深入剖析开机向导的源码,帮助学员理解其底层实现原理和逻辑。功能驱动:通过实现具体的功能点,让学习过程更加有趣和富有挑战性,增强学员的实战能力。个性化定制:最终目标是让学员能够自定义和优化 Android 操作系统中的开机向导,具备实际开发和调试能力。

上一篇: Android Framework实战开发-socket跨进程通信之native程序与apk java通信
下一篇: 千里马Android Framework实战开发-native程序之间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、付费专栏及课程。

余额充值