Android 面试笔记整理-Binder机制

这篇具有很好参考价值的文章主要介绍了Android 面试笔记整理-Binder机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者:浪人笔记

面试可能会问到的问题

  1. 从IPC的方式问到Binder的优势
  2. 为什么zygote跟其他服务进程的通讯不使用Binder
  3. Binder线程池和Binder机制

等等这些问题都是基于你对Binder的理解还有对其他IPC通讯的理解

IPC方式有多少种
  • 传统的IPC方式有Socket、共享内存、管道、信号量等
  • 安卓特有的是Binder,其他系统也有自己定义的比如window的wfc(Windows Communication Foundation)
Binder机制的优势

传统的ipc管道跟信号量都是比较轻的,基本不能用于复杂的IPC通讯,Socket有个缺点就是数据要复制两遍,第一遍是进程A复制到Socket通道,第二遍是Socket通道复制到进程B。共享内存的缺点就是不方便管理,如果频繁的对共享内存进行操作很可能会导致死锁、饥饿等问题。

Android 面试笔记整理-Binder机制,移动开发,Android,面试,android,面试,笔记,移动开发,binder,Framework

为了解决这个痛点,安卓设计了Binder的通讯机制,提供更高效、安全、可靠的方式。下图是Binder机制图。只需要在内核里面复制一遍,这里可以简单的理解为单例模式,大家都只需要对Binder内存区域做操作,内存只有一份。

Android 面试笔记整理-Binder机制,移动开发,Android,面试,android,面试,笔记,移动开发,binder,Framework

还有一些概念,比如我们应该都听说Binder是内核里面的,Binder是怎么用到安卓系统里面的,再看一个图

Android 面试笔记整理-Binder机制,移动开发,Android,面试,android,面试,笔记,移动开发,binder,Framework

这里面有四个角色,其实很好理解,两个进程、一个Binder内核空间、一个ServiceManager服务。两个进程时采用的C/S结构一个客户端一个服务端。

  1. Binder内核空间就是一块存在于内核区的内存理解为一个通道

  2. ServiceManager是安卓的核心服务之一,AMS、PMS、WMS这些是一样的。它里面提供了很多线程池。Binder线程池只是其中的一种。在这里可以理解为是管理Binder给外部用的提供了一个注册机制用于识别不同的进程。下面是其他的几个线程池

    • Activity Manager线程池:用于处理Activity启动、停止等操作,保证UI界面的流畅性。
    • JobScheduler线程池:用于调度执行后台任务。
    • MediaServer线程池:用于处理音视频等媒体数据。
    • SurfaceFlinger线程池:用于处理UI界面绘制等操作。

有没有想过为什么要搞那么线程池,还要搞那么多个。其实也比较好理解,因为ServiceManager这个类的有很多地方用到,不可能是单线程处理的,这样就堵塞了。为什么搞那么多线程池是因为不同的功能不同比如有些调用比较频繁有些需要比较多的cpu。只有一个线程池的话很容易会导致占用时间过长等问题。

  1. server进程需要提供方法被别人调用,需要先在ServiceManager里面注册。
  2. server注册完以后会提供接口给client进程调用

来到这里应该可以回答剩下的那两个问题了。

Binder线程池和Binder机制
  • Binder线程池是ServiceManager提供的,利用的是Binder内核机制。
  • Binder机制是安卓为了提供更高效、稳定、可靠的方式实现的一套基于内核的IPC机制。
为什么zygote进程跟其他进程通讯使用socket而不是binder
  1. Binder虽然在内核,但是提供服务的是ServiceManager,这个时候如果要给AMS提供Binder IPC就需要等ServiceManager先初始化好,这个是没办法保证的,如果要保证这个先后顺序又要搞多一套进程通讯就更麻烦了。
  2. 另外,由于Zygote进程只与少数几个进程进行通讯,使用Socket通讯的开销相对较小,因此选择Socket通讯更加合适。而且这里面是优化过的LocalSocket效率会更高。

上面一直说内核空间,那内核空间跟用户空间有什么区别呢?

  1. 内核程序运行在操作系统的内核空间,具有更高的权限和更快的执行速度,能够实现更底层的操作,如硬件驱动、文件系统等,因此通常用于操作系统的核心功能的实现。

  2. 用户程序运行在操作系统的用户空间,具有更多的自由度和可移植性,能够实现更丰富的功能,如应用程序、服务进程等,因此通常用于操作系统的外围功能和应用程序的实现。

简单的说就是内核空间有操作内存的方法,但是这一块对用户空间是封闭的,用户空间里面操作的都是内核提供的服务。比如操作文件用到的文件系统模块和操作内存用到的内存管理模块。拿内存管理模块里面用到的kmallockfree来说。这两个方法在用户空间就调用不到,这是内核封装的方法。

`kmalloc()` 和 `kfree()`: 内核内存分配器,用于在内核空间中动态分配和释放内存。
 // 这个还并不是c/c++的原生方法,是内核自己封装的

再看一下比如使用Binder的时候我们传的是一个序列化的文件,那他是怎么映射到内存中的?

在内核中有vm_map_ramvm_insert_page这些方法可以把文件插入到内存地址中。而如果在用户空间需要跟这些打交道用到的还是内存管理模块的mmap这些。 mmap 的实现在内核中使用了 vm_area_struct。意思是内存管理模块提供给外面的一层封装。所以与其这么麻烦还不如直接放到内核里面更合适。

这些方法其实都不重要,只需要知道一点,这些方法在用户进程空间是拿不到的


基于Binder的IPC

这里是一些基础,可以不看了。因为这些用的少,方便自己以后看

AIDL

服务端

// IMyService.aidl
interface IMyService {
    int add(int a, int b);
}

// MyService.java
public class MyService extends Service {
    @Override
    public IBinder onBind(Intent intent) {
        return new MyBinder();
    }

    private class MyBinder extends IMyService.Stub {
        @Override
        public int add(int a, int b) throws RemoteException {
            return a + b;
        }
    }
}

客户端

// MainActivity.java
public class MainActivity extends AppCompatActivity {
    private IMyService mService;

    private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mService = IMyService.Stub.asInterface(service);
            try {
                int result = mService.add(1, 2);
                Toast.makeText(MainActivity.this, "Result: " + result, Toast.LENGTH_SHORT).show();
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mService = null;
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent intent = new Intent(this, MyService.class);
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(mConnection);
    }
}
Messager

轻量级的AIDL只能单线程 服务端 MessengerService.java:

public class MessengerService extends Service {
    private static class IncomingHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    String clientMessage = (String) msg.obj;
                    Log.i("MessengerService", "Received message from client: " + clientMessage);

                    // Send a response back to the client
                    Messenger clientMessenger = msg.replyTo;
                    Message replyMessage = Message.obtain(null, 2);
                    Bundle bundle = new Bundle();
                    bundle.putString("serverResponse", "Hello from server!");
                    replyMessage.setData(bundle);
                    try {
                        clientMessenger.send(replyMessage);
                    } catch (RemoteException e) {
                        Log.e("MessengerService", "Failed to send message to client", e);
                    }
                    break;
                default:
                    super.handleMessage(msg);
            }
        }
    }

    private final Messenger mMessenger = new Messenger(new IncomingHandler());

    @Override
    public IBinder onBind(Intent intent) {
        return mMessenger.getBinder();
    }
}

客户端 MessengerClient.java:

public class MessengerClient extends AppCompatActivity {
    private Messenger mMessenger;

    private static class IncomingHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 2:
                    String serverMessage = msg.getData().getString("serverResponse");
                    Log.i("MessengerClient", "Received message from server: " + serverMessage);
                    break;
                default:
                    super.handleMessage(msg);
            }
        }
    }

    private final Messenger mClientMessenger = new Messenger(new IncomingHandler());

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent intent = new Intent(this, MessengerService.class);
        bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(mServiceConnection);
    }

    private final ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mMessenger = new Messenger(service);
            sendMessageToServer();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mMessenger = null;
        }
    };

    private void sendMessageToServer() {
        if (mMessenger == null) {
            return;
        }

        Message message = Message.obtain(null, 1);
        message.obj = "Hello from client!";
        message.replyTo = mClientMessenger;
        try {
            mMessenger.send(message);
        } catch (RemoteException e) {
            Log.e("MessengerClient", "Failed to send message to server", e);
        }
    }
}
广播、内容提供者

……

关于Android 面试笔记的真理还有许多知识点在这不能一一的展示,为了方便大家进行复习查阅,这边我整理成了文档的形式了,大家可以进行参考一下:https://qr18.cn/CgxrRy

Android 面试笔记整理-Binder机制,移动开发,Android,面试,android,面试,笔记,移动开发,binder,Framework文章来源地址https://www.toymoban.com/news/detail-659063.html

到了这里,关于Android 面试笔记整理-Binder机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android相机开发实战,面试题+笔记+项目实战

    private SurfaceView mSurfaceView; private SurfaceHolder mHolder; private Size mPreviewSize; private Size adapterSize; //private List mSupportedPreviewSizes; private Camera mCamera; private boolean isSupportAutoFocus = false; private Camera.Parameters parameters = null; private Context mContext; //private int mCurrentCameraId = 0; private int screenWidth; pri

    2024年04月16日
    浏览(33)
  • BpBinder与PPBinder调用过程——Android开发Binder IPC通信技术

    在Android系统中,进程间通信(IPC)是一个非常重要的话题。Android系统通过Binder IPC机制实现进程间通信,而Binder IPC通信技术则是Android系统中最为重要的进程间通信技术之一。本文将介绍Binder IPC通信技术的原理,并详细解析BpBinder与PPBinder调用过程的使用以及注意事项。 Bind

    2024年02月13日
    浏览(28)
  • Android面试题精选——再聊Android-Handler机制-1,已开源

    下面想看Handler的工作流程图:(第一次画图,有点丑,凑合着看吧) 因为Handler的主要作用就是线程切换,所以在图中我把Handler线程变化也画了出来。从这张图我们能看出几点信息: **1、Handler负责消息的发送和处理:**Handler发送消息给MessageQueue和接收Looper返回的消息并且处理

    2024年04月12日
    浏览(34)
  • Android事件分发机制五:面试官你坐啊

    学过事件分发吗,聊聊什么是事件分发 事件分发是将屏幕触控信息分发给控件树的一个套机制。 当我们触摸屏幕时,会产生一些列的MotionEvent事件对象,经过控件树的管理者ViewRootImpl,调用view的dispatchPointerEvnet方法进行分发。 那主要的分发流程是什么: 在程序的主界面情况

    2024年04月15日
    浏览(34)
  • vue代码安全,10项防范措施_vue中的安全,binder机制面试题

    先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年最新网络安全全套学习资料》

    2024年04月23日
    浏览(31)
  • Flutter 与 原生交互(Android),靠着这份900多页的PDF面试整理

    private static final String TAG = “FlutterPluginBasicTest”; public static String CHANNEL = “com.mmd.flutterapp/plugin”; static BasicMessageChannel messageChannel; public static void registerWith(PluginRegistry.Registrar registrar) { messageChannel = new BasicMessageChannel(registrar.messenger(),CHANNEL,StandardMessageCodec.INSTANCE); FlutterPluginBas

    2024年04月14日
    浏览(35)
  • 【Android】Binder(一)Binder的介绍和AIDL使用Binder的实例

    Android 中的 Binder 是一个进程间通信机制,它允许不同进程之间相互调用方法和传递数据。Binder 主要用于实现系统服务和应用程序之间的通信,以及实现 IPC(Inter-Process Communication,进程间通信)。 Binder 的核心是 Binder 驱动程序,它负责管理不同进程之间的通信。每个进程都可

    2024年02月07日
    浏览(30)
  • Android 13(T) - binder阅读(1)- binder driver

    想要使用binder完成进程间通信(IPC)或者完成远程过程调用(RPC),那么我们需要有如下三个要素: 源:即调用者(Client) 目的:即服务提供者(Server)。这里会有一个问题,client怎么知道我要向哪里发送数据呢?这里就需要用到ServiceManager,Server需要先注册到ServiceManager中

    2024年02月11日
    浏览(25)
  • 【Android】深入Binder拦截

    ☞ Github ☜ ☞ Gitee ☜ Binder 作为 Android 系统跨进程通信的核心机制。网上也有很多深度讲解该机制的文章,如: Android跨进程通信详解Binder机制原理 Android系统核心机制Binder【系列】 这些文章和系统源码可以很好帮助我们理解Binder的实现原理和设计理念,为拦截做准备。借助

    2024年02月03日
    浏览(29)
  • Android Binder小结

    Binder是Android中一种跨进程通信方式,Binder也是一个虚拟设备,对于客户端来说Bidner是一个可以跨进程通信的一个类 Android底层是Linux,但是Linux已有的跨进程通信方式都不能满足Android移动设备的需求,在Android中跨进程通信方式,要求是CS的一对多的架构、需要保证安全,并且

    2023年04月08日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包