mRemote

android 系统核心机制binder(09)binder java层实现

泄露秘密 提交于 2020-10-06 00:37:49
本章关键点总结 & 说明: 这里关注➕ Binder Java实现部分,主要谈了 java实现框架和demo,最后分析了 关键类 Binder、JavaBBinderHolder、JavaBBinder以及他们之间的关系。 1 binder java层的整体框架 1.1 整体框架图说明 Binder机制在C++层已经有了完整的实现。因此Java层完全不用重复实现,而是通过JNI衔接了C++层以复用其实现。因此java层的架构相对比较简单。如下所示: 同时这里用另一个图来说明下binder java层、 JNI的衔接以及binder C++层,如下所示: 1.2 binder相关类解读 类 名称 类 说明 IBinder Java层,提供了使用transact方法来调用远程服务的机制,以及DeathRecepient接口 Binder 实现IBinder接口,封装JNI实现,Java层Binder服务基类,BnXXX代表 BinderProxy 实现IBinder接口,封装JNI实现。提供transact方法调用远程服务,BpXXX代表 JavaBBinderHolder 内部存储了JavaBBinder JavaBBinder 将C++端的onTransact调用传递到Java端 BinderInternal 仅供Binder框架使用的类,内部有一个GcWatcher类

Android平台——Binder机制

送分小仙女□ 提交于 2020-08-17 02:36:21
由代码来补充部分: int main( int argc, char ** argv) { sp<ProcessState> proc(ProcessState::self()); sp<IServiceManager> sm = defaultServiceManager(); LOGI ("ServiceManager: %p", sm.get()); AudioFlinger::instantiate(); MediaPlayerService::instantiate(); CameraService::instantiate(); ProcessState::self()->startThreadPool(); IPCThreadState::self()->joinThreadPool(); } sp<ProcessState> proc(ProcessState::self()) ,这一行代码会建立 ProcessState 对象,一个进程只有唯一的一个 ProcessState 对象,而 ProcessState 类的作用是来打开 /dev/binder 设备。这也就说明了一个问题,一个进程只不可能同时存在多个对 /dev/binder 的操作。 sp<IServiceManager> sm = defaultServiceManager()

Android IPC机制—Binder的工作机制

北城以北 提交于 2020-05-08 03:28:46
进程和线程的关系 IPC机制即为跨进程通信,是inter-Process Communication的缩写。是指两个进程之间进行通信。在说进程通信之前,我们的弄明白什么是线程,什么是进程。进程和线程是两个截然不同的概念。按照操作系统中的描述,线程是CPU调度的最小单位,同时线程也是一种有限的系统资源。而进程一般是指一个执行单元,在pc端或者移动端上是指一个程序或者一个应用。一个进程中可以包含一个或者是多个线程。所以他们的关系应该是包含和被包含的关系。 跨进程的种类 在Android中跨进程通信的方式有很多种,Bundle,文件共享,AIDL,Messenger,ContentProvider,Socket,这些都能实现进程间之间的通信,当然,虽然都能够实现进程间通信,但是他们之间的实现原理或者说是底层的实现方式都是不一样的。下面,我们将会一一说明。 注:很多同学觉得创建进程就应该创建一个新的应用。其实不是的。只要我们在AndroidMenifest上加上这一句代码就可以了android:process=“:remote”具体的,同学们可以自己的了解。 在说IPC之前,先说一下一些基础概念,这样对后面的内容能够更好的理解。 1、Serializable,Parcelable接口 Serializable接口是java提供的一个序列化的接口,这是一个空的接口

Android10.0 Binder通信原理(八)-Framework层分析

孤街浪徒 提交于 2020-04-08 18:04:10
摘要:本节主要来讲解Android10.0 Binder 在Framework的使用分析 阅读本文大约需要花费15分钟。 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢! [Android取经之路] 的源码都基于Android-Q(10.0) 进行分析 [Android取经之路] 系列文章: 《系统启动篇》 Android系统架构 Android是怎么启动的 Android 10.0系统启动之init进程 Android10.0系统启动之Zygote进程 Android 10.0 系统启动之SystemServer进程 Android 10.0 系统服务之ActivityMnagerService Android10.0系统启动之Launcher(桌面)启动流程 Android10.0应用进程创建过程以及Zygote的fork流程 Android 10.0 PackageManagerService(一)工作原理及启动流程 Android 10.0 PackageManagerService(二)权限扫描 Android 10.0 PackageManagerService(三)APK扫描 Android 10.0 PackageManagerService(四)APK安装流程 《日志系统篇》 Android10

Android Binder机制

瘦欲@ 提交于 2020-02-29 02:14:33
研究Android底层代码时,尤其是Binder跨进程通信时,经常会发现interface_cast和asBinder,很容易被这两个函数绕晕,下面来讲解一下: interface_cast 下面根据下述ICameraClient例子进行分析一下: //伪代码 sp<ICameraClient> cameraClient = interface_cast<ICameraClient>(BpBinder(handle)); 看下interface_cast的实现,其代码在IInterface.h中 template<typename INTERFACE> inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj) { return INTERFACE::asInterface(obj); } //这是一个模板函数,展开即为: inline sp<ICameraClient > interface_cast(const sp<IBinder>& obj) { return ICameraClient ::asInterface(obj); } 那ICameraClient的asInterface在哪实现的呢?发现找了ICameraClient.h和ICameraClient.cpp只有下面两个定义: //frameworks

一起来聊聊Android基础之Binder的使用

我的未来我决定 提交于 2019-12-09 15:32:13
Binder实现了IBinder接口,通常我们不会直接去实现Binder,而是通过aidl工具来定义接口,自动生成相应的Binder的子类。 从Android Framework角度来说,Binder是ServiceManager连接各种Manager(ActivityManager,WindowManager,等等)和相应ManagerService的桥梁。 从Android应用层来说,Binder是客户端和服务端进行通信的媒介,通过bindService,服务端会返回一个Binder对象。同过这个Binder对象,客户端就可以获取服务端提供的服务或数据。 我们通过一个简单的AIDL示例来学习Binder的使用。 AIDL示例: 目录结构 Book.java: package com.weijie.aidlapplication.aidl; import android.os.Parcel; import android.os.Parcelable; /** * Created by weijie on 17-3-8. */ public class Book implements Parcelable { public int bookId; public String bookName; @Override public int describeContents() {

Android Binder机制(一)

送分小仙女□ 提交于 2019-12-01 16:24:50
binder用于android进程间的通讯。客户端程序和系统服务,客户端进程之间,都是通过binder进行进程间通讯的。 1.客户端程序和系统服务 客户端和系统服务通讯的入口:cotext.getSystemService(String name) android.app.ContextImpl: @Override public Object getSystemService(String name) { return SystemServiceRegistry.getSystemService(this, name); } android.app.SystemServiceRegistry: 静态代码块注册系统服务: static { registerService(Context.ACCESSIBILITY_SERVICE, AccessibilityManager.class, new CachedServiceFetcher<AccessibilityManager>() { @Override public AccessibilityManager createService(ContextImpl ctx) { return AccessibilityManager.getInstance(ctx); }}); registerService(Context