Binder实用指南(二) - 实战篇

Binder学习笔记(十二)—— binder_transaction(...)都干了什么? binder_open(…)都干了什么?在回答binder_transaction(…)之前,还有一些基础设施要去探究,比如binder_open(…),binder_mmap(…),这些调用是在打开设备文件/dev/binder之后必须完成的程式化操作,而在它们内部需要做一些数据结构的准备。首先来看binder_open(…) kernel/drivers/staging/android/bin 阅读详情

本章的内容主要说明如何在JavaFramework层和Native层自定义Client-Server组件,并且使用Binder进行通信。

一、Native Binder

源码目录结构:

alps/frameworks/native/cmds/NativeBinderDemo/

      
1
2
3
4
5
6
      
|-NativeBinderDemo
|---ClientDemo.cpp: 客户端程序
|---ServerDemo.cpp:服务端程序
|---IMyService.h:自定义的MyService服务的头文件
|---IMyService.cpp:自定义的MyService服务
|---Android.mk:源码build文件

1.1 服务端

alps/frameworks/native/cmds/NativeBinderDemo/ServerDemo.cpp

获取ServiceManager,注册service.myservice服务到ServiceManager,启动服务。

      
1
2
3
4
5
6
7
8
9
      
#include "IMyService.h"
int main() {
sp < IServiceManager > sm = defaultServiceManager(); //获取service manager引用
sm->addService(String16( "service.myservice"), new BnMyService()); //注册名为"service.myservice"的服务到service manager
ProcessState::self()->startThreadPool(); //启动线程池
IPCThreadState::self()->joinThreadPool(); //把主线程加入线程池
return 0;
}

1.2 客户端

alps/frameworks/native/cmds/NativeBinderDemo/ClientDemo.cpp

获取ServiceManager,拿到service.myservice服务,再进行类型转换成IMyService,最后调用远程方法sayHello()

      
1
2
3
4
5
6
7
8
9
      
#include "IMyService.h"
int main() {
sp < IServiceManager > sm = defaultServiceManager(); //获取service manager引用
sp < IBinder > binder = sm->getService(String16( "service.myservice")); //获取名为"service.myservice"的binder接口
sp<IMyService> cs = interface_cast < IMyService > (binder); //将biner对象转换为强引用类型的IMyService
cs->sayHello(); //利用binder引用调用远程sayHello()方法
return 0;
}

1.3 MyService

alps/frameworks/native/cmds/NativeBinderDemo/IMyService.h

申明IMyService,申明BpMyService(Binder客户端),申明BnMyService(Binder的服务端)。

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
      
#ifndef MY_SERVICE_DEMO
#define MY_SERVICE_DEMO
#include <stdio.h>
#include <binder/IInterface.h>
#include <binder/Parcel.h>
#include <binder/IBinder.h>
#include <binder/Binder.h>
#include <binder/ProcessState.h>
#include <binder/IPCThreadState.h>
#include <binder/IServiceManager.h>
using namespace android;
namespace android
{
class IMyService : public IInterface
{
public:
DECLARE_META_INTERFACE(MyService); //使用宏,申明MyService
virtual void sayHello()= 0; //定义方法
};
//定义命令字段
enum
{
HELLO = 1,
};
//申明客户端BpMyService
class BpMyService: public BpInterface<IMyService> {
public:
BpMyService( const sp<IBinder>& impl);
virtual void sayHello();
};
//申明服务端BnMyService
class BnMyService: public BnInterface<IMyService> {
public:
virtual status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply,
uint32_t flags = 0);
virtual void sayHello();
};
}
#endif

alps/frameworks/native/cmds/NativeBinderDemo/IMyService.cpp

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
      
#include "IMyService.h"
namespace android
{
IMPLEMENT_META_INTERFACE(MyService, "android.demo.IMyService"); //使用宏,完成MyService定义
//客户端
BpMyService::BpMyService( const sp<IBinder>& impl) :
BpInterface<IMyService>(impl) {
}
// 实现客户端sayHello方法
void BpMyService::sayHello() {
printf( "BpMyService::sayHello\n");
Parcel data, reply;
data.writeInterfaceToken(IMyService::getInterfaceDescriptor());
remote()->transact(HELLO, data, &reply);
printf( "get num from BnMyService: %d\n", reply.readInt32());
}
//服务端,接收远程消息,处理onTransact方法
status_t BnMyService::onTransact( uint_t code, const Parcel& data,
Parcel* reply, uint32_t flags) {
switch (code) {
case HELLO: { //收到HELLO命令的处理流程
printf( "BnMyService:: got the client hello\n");
CHECK_INTERFACE(IMyService, data, reply);
sayHello();
reply->writeInt32( 2015);
return NO_ERROR;
}
break;
default:
break;
}
return NO_ERROR;
}
// 实现服务端sayHello方法
void BnMyService::sayHello() {
printf( "BnMyService::sayHello\n");
};
}

1.4 Android.mk

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
      
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SHARED_LIBRARIES := \
libcutils \
libutils \
libbinder
LOCAL_MODULE := ServerDemo
LOCAL_SRC_FILES := \
IMyService.cpp \
ServerDemo.cpp
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)
include $(CLEAR_VARS)
LOCAL_SHARED_LIBRARIES := \
libcutils \
libutils \
libbinder
LOCAL_MODULE := ClientDemo
LOCAL_SRC_FILES := \
IMyService.cpp \
ClientDemo.cpp
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)

1.5 原理图

native_binder_demo.jpg

1.6 运行

编译:
mm alps/frameworks/native/cmds/NativeBinderDemo目录,然后到alps/out/target/product/{Project}/system/bin/会生成ClientDemo和ServerDemo

执行:

      
1
2
3
      
adb remount
adb push ServerDemo /system/bin
adb push ClientDemo /system/bin

开两个窗口分别执行下面两个命令便可以看到结果了:
adb shell system/bin/ServerDemo , adb shell system/bin/ClientDemo

二、JavaFramework Binder

源码目录结构:

alps/frameworks/base/cmds/FrameworkBinderDemo/

      
1
2
3
4
5
6
7
8
      
|-Server端
|---ServerDemo.java:可执行程序
|---IMyService.java: 定义IMyService接口
|---MyService.java:定义MyService
|-Client端
|---ClientDemo.java:可执行程序
|---IMyService.java: 与Server端完全一致
|---MyServiceProxy.java:定义MyServiceProxy

2.1 Server端

(1)ServerDemo.java

可执行程序

      
1
2
3
4
5
6
7
8
9
10
11
12
      
public class ServerDemo {
public static void main(String[] args) {
System.out.println( "MyService Start");
//准备Looper循环执行
Looper.prepareMainLooper();
//设置为前台优先级
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND);
//注册服务
ServiceManager.addService( "MyService", new MyService());
Looper.loop();
}
}

(2)IMyService.java

定义sayHello()方法,DESCRIPTOR属性

      
1
2
3
4
5
      
public interface IMyService extends IInterface {
static final java.lang.String DESCRIPTOR = "com.yuanhh.frameworkBinder.MyServer";
public void sayHello(String str) throws RemoteException ;
static final int TRANSACTION_say = android.os.IBinder.FIRST_CALL_TRANSACTION;
}

(3)MyService.java

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
      
public class MyService extends Binder implements IMyService{
public MyService() {
this.attachInterface( this, DESCRIPTOR);
}
@Override
public IBinder asBinder() {
return this;
}
/** 将MyService转换为IMyService接口 **/
public static com.yuanhh.frameworkBinder. IMyService asInterface(
android.os.IBinder obj) {
if ((obj == null)) {
return null;
}
android.os.IInterface iInterface = obj.queryLocalInterface(DESCRIPTOR);
if (((iInterface != null)&&(iInterface instanceof com.yuanhh.frameworkBinder.IMyService))){
return ((com.yuanhh.frameworkBinder.IMyService) iInterface);
}
return null;
}
/** 服务端,接收远程消息,处理onTransact方法 **/
@Override
protected boolean onTransact(int code, Parcel data, Parcel reply, int flags)
throws RemoteException {
switch (code) {
case INTERFACE_TRANSACTION: {
reply.writeString(DESCRIPTOR);
return true;
}
case TRANSACTION_say: {
data.enforceInterface(DESCRIPTOR);
String str = data.readString();
sayHello(str);
reply.writeNoException();
return true;
}}
return super.onTransact(code, data, reply, flags);
}
/** 自定义sayHello()方法 **/
@Override
public void sayHello(String str) {
System.out.println( "MyService:: Hello, " + str);
}
}

(4) Android.mk

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
      
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_MODULE := ServerDemo
LOCAL_MODULE_TAGS := optional
include $(BUILD_JAVA_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := ServerDemo
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_PATH := $(TARGET_OUT)/bin
LOCAL_MODULE_CLASS := UTILITY_EXECUTABLES
LOCAL_SRC_FILES := ServerDemo
include $(BUILD_PREBUILT)

(5) ServerDemo

      
1
2
3
      
base=/system
export CLASSPATH=$base/framework/ServerDemo.jar
exec app_process $base/bin com.shun.frameworkBinder.ServerDemo "$@"

2.2 Client端

(1)ClientDemo.java

可执行程序

      
1
2
3
4
5
6
7
8
9
10
      
public class ClientDemo {
public static void main(String[] args) throws RemoteException {
System.out.println( "Client start");
IBinder binder = ServiceManager.getService( "MyService"); //获取名为"MyService"的服务
IMyService myService = new MyServiceProxy(binder); //创建MyServiceProxy对象
myService.sayHello( "binder"); //通过MyServiceProxy对象调用接口的方法
System.out.println( "Client end");
}
}

(2)IMyService.java

与Server端的IMyService是一致,基本都是拷贝一份过来。

(3)MyServiceProxy.java

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
      
public class MyServiceProxy implements IMyService {
private android.os.IBinder mRemote; //代表BpBinder
public MyServiceProxy(android.os.IBinder remote) {
mRemote = remote;
}
public java.lang. String getInterfaceDescriptor() {
return DESCRIPTOR;
}
/** 自定义的sayHello()方法 **/
@Override
public void sayHello(String str) throws RemoteException {
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeString(str);
mRemote.transact(TRANSACTION_say, _data, _reply, 0);
_reply.readException();
} finally {
_reply.recycle();
_data.recycle();
}
}
@Override
public IBinder asBinder() {
return mRemote;
}
}

(4) Android.mk

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
      
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_MODULE := ClientDemo
LOCAL_MODULE_TAGS := optional
include $(BUILD_JAVA_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := ClientDemo
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_PATH := $(TARGET_OUT)/bin
LOCAL_MODULE_CLASS := UTILITY_EXECUTABLES
LOCAL_SRC_FILES := ClientDemo
include $(BUILD_PREBUILT)

(5) ClientDemo

      
1
2
3
      
base=/system
export CLASSPATH=$base/framework/ClientDemo.jar
exec app_process $base/bin com.shun.frameworkBinder.ClientDemo "$@"

2.3 原理图

MyServer_framework_binder.jpg

2.4 运行

编译:

mm alps/frameworks/base/cmds/FrameworkBinderDemo/目录,然后:
alps/out/target/product/{Project}/system/bin/ 生成ClientDemo和ServerDemo
alps/out/target/product/{Project}/system/framework/ 生成ClientDemo.jar和ServerDemo.jar。

执行:

      
1
2
3
4
5
      
adb remount
adb push ServerDemo /system/bin
adb push ClientDemo /system/bin
adb push ServerDemo.jar /system/framework/
adb push ClientDemo.jar /system/framework/

开两个窗口分别执行下面两个命令便可以看到结果了:
adb shell system/bin/ServerDemo , adb shell system/bin/ClientDemo

原文地址: https://maoao530.github.io/2016/12/25/android-binder-02/

Binder系列10 Binder线程池管理 一 概述 Android系统启动完成后,ActivityManager, PackageManager等各大服务都运行在system_server进程,app应用需要使用系统服务都是通过binder来完成进程之间的通信,上篇文章彻底理解Android Binder通信架构,从整体架构以及通信协议的角度来阐述了Binder架构。那对于binder线程是如何管理的呢,又是如何创建的呢?其实无论是system_server进程,还是app进程,都是在进程fork完成后,便会在新进程中执行onZygoteInit( 阅读详情

相关推荐

Android binder 机制驱动核心源码详解_binder_thread_read

其中第 1 个工作涉及到的方法为 binder_ioctl() -> binder_get_thread() -> binder_ioctl_write_read() -> binder_thread_write() ,主要是一些数据的准备和方法转跳,没做什么实质的事情。在唤醒目标线程后,调用线程就执行完 binder_thread_write() 写完了数据,返回到 binder_ioctl_write_read() 方法中,接着执行 binder_thread_read() 方法。

2401_86391921的博客 1543

内置apk

本文目的是实现内置apk和第三方apk通过aidl通信,着重说下,如何内置apk及内置时有关aidl的一些注意事项。一、内置带源码的apk 1. 准备工作: 1.1 Android源码 1.2 先在Android Studio中,通过AIDL实现Service[服务端]、Client[客户端]的通信2. 内置:有以下两种内置方式 2.1 把Service整体作为一个独立的apk进行内置 1) 在p...

lyl0530的博客 1286

Android Binder分析二:Natvie Service的注册

这一章我们通过MediaPlayerService的注册来说明注册Service的过程

lilian0118的专栏 3267

Android中的binder机制分析一:写一个native层最简单的demo

myservice/ ├── Android.mk ├── client │ ├── Android.mk │ ├── main_client.cpp │ └── Main_MyClient.cpp ├── interface │ ├── IMyService.cpp │ └── IMyService.h └── service ├── Android.mk ├── Main_MyService.cpp ├── MyService.cpp └── M

achina2011jy的博客 1256

Binder机制总结

在android中进行跨进程通信通常有以下几种方式: 使用Intent 使用文件共享 使用Messenger 使用AIDL 使用ContentProvider 其中Intent中可以携带Bundle,而Bundle实现了Parcelable接口,所以可以在不同的进程间进行传输。文件共享就是读写文件,比如常用的SharedPreferences就是以XML来存储的文件。而Messenger...

流月的博客 3377

Binder (二) binder 机制的管理者的角色Service Manager

binder 机制的管理者的角色Service Manager Service Manager进程负责管理client server角色, 上下文管理者context_manager BINDER_SET_CONTEXT_MGR int binder_become_context_manager(struct binder_state *bs) { return ioctl(bs->...

gbmaotai的博客 473

Android-Framework:Binder全解析(一

下面是有几位Android行业大佬对应上方技术点整理的一些进阶资料。希望能够帮助到大家提升技术高级UI,自定义ViewUI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!体系化!**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新。

2301_79987255的博客 935

Android Binder原理(二)ServiceManager中的Binder机制

本文首发于微信公众号「后厂技术官」 前言 在上一篇文章中,我们了解了学习Binder前必须要了解的知识点,其中有一点就是Binder机制的三个部分:Java Binder、Native Binder、Kernel Binder,其中Java Binder和Native Binder都是应用开发需要掌握的。Java Binder是需要借助Native Binder来工作的,因此需要先了解Nat...

Android进阶三部曲 - 刘望舒 2395

客户端是如何通过Binder与服务端通信的

binder基于AIDL的通信流程图如下:Client端: ClientActivity;Server端: RemoteService;Service的对外aidl接口如上面代码所示,ClientActivity已经通过BindService拿到了RemoteService的IBinder对象AIDL通信的基本步骤如下:1. Client通过获取到Server的Binder,并且封装成一个Proxy。2.通过Proxy来同步调用IPC。

weixin_43700867的博客 1209

new delete 详解

常规的new 和 delete 当需要内存时,可以使用new申请内存,但在用完内存时应当使用delete 去归还内存,以防止内存泄漏,具体使用方案见下面代码: int* ps = new int ; // 使用new 申明变量空间 ... ... delete ps ; '// delete 删除所申明的变量空间 上述代码将删除ps 指针指向的内存空间,但不会删除指针本身,即仍然可以使用该指针去指向其他int 类型的变量。new 和 delete 一定需要成对的使用否则极易发生内存泄漏。 注意:不

qq_42138448的博客 6938

使用PaddleOCR识别查验平台验证码

PaddleOCR识别国税查验平台验证码

m0_63932300的博客 1266

【Android】Binder(一)Binder的介绍和AIDL使用Binder的实例

Binder的介绍和AIDL使用Binder的实例

每天不是在写bug就是在写bug的路上 5071

Neo4j桌面版导入CVS文件

我们的relation.csv是这样的。

m0_53573725的博客 816

【Binder系列课】二、Binder通信服务应知应会

android binder常见面试题。

weixin_65771318的博客 1584

从标记基因到功能分析:手把手教你人工注释单细胞亚群的完整流程

本文详细介绍了人工注释单细胞亚群的完整流程,从标记基因筛选到功能分析验证,特别针对肿瘤微环境、发育轨迹等复杂场景提供解决方案。通过差异表达分析、多维数据整合和实验验证,帮助研究者准确识别细胞类型,提升单细胞转录组研究的生物学解读深度。

jenkins8butler的博客 243

告别裸机:在FreeRTOS上为STM32移植SOEM EtherCAT主站的思路与实战

本文详细介绍了在FreeRTOS环境下为STM32移植SOEM EtherCAT主站的工程实践。通过重构任务调度模型、优化内存管理和中断响应,成功将通信周期抖动控制在±100ns以内,满足工业控制系统的严苛实时性要求。文章包含完整的移植策略、性能优化方法和实测数据,为开发者提供了一套可靠的EtherCAT主站解决方案。

weixin_30342363的博客 388

Binder实用指南(一) - 理解篇

这是关于Android Binder机制的一篇文章,Binder是Android里面非常重要的组成,也是最难理解的一块知识点,学习Binder最好的方法是深入源码阅读,因为Binder相关的知识错综复杂,一般初学者也很容易迷失在源码的汪洋里,本文旨在梳理Binder的架构和流程,并且试着以实用的角度来看待Binder。 一、为什么需要Binder机制? Android系统中,每个应用程序是...

zhangcanyan的博客 849

解密微信DAT图片:一键转换JPG/PNG/GIF的实用指南

本文详细解析微信DAT图片的加密机制及转换方法,提供从定位文件到使用WeijieSoft工具一键转换JPG/PNG/GIF的完整指南。涵盖新旧版微信存储路径差异、批量处理技巧及常见问题解决方案,帮助用户高效恢复重要图片并释放存储空间。

weixin_29305337的博客 2874

Android10.0 Binder通信原理(二)-Binder入门篇

Modify the binder to request 1M - 2 pages instead of 1M. The backing store in the kernel requires a guard page, so 1M allocations fragment memory very badly. Subtracting a couple of pages so that they fit in a power of two allows the kernel to make more e

IngresGe 的专栏 1万+

TDS水质检测传感器原理图设计,已量产(液体传感器)

最近调试了一款针对生活用水、水培系统的 TDS 水质检测模块 —— 毕竟 TDS(总溶解固体)值直接关联水的洁净程度,是这类场景里既实用又易获取的水质指标。下面拆解下这个电路的设计逻辑,说说每个部分是怎么配合实现精准检测的。

不脱发的程序猿 1536

【实战项目开发技术分享】机器人安全通过狭窄区域的方案

在机器人的应用领域中,有时会遇到需要机器人通过狭窄区域的情况。无论是室内还是室外,机器人需要具备适应性和灵活性,以便在狭窄的空间中进行安全、高效的导航。本文将提供一些如何让机器人通过狭窄区域的实现方案和思路,希望帮助读者可以根据实际的开发需要进行适当调整和扩展。

xiewf的博客 2万+

Binder驱动之设备控制----binder_ioctl -- 二

接前文 3.2 数据读写 3.2.1BINDER_WRITE_READ 首先我们来看一下BINDER_WRITE_READ的定义如下,它是通过调用内核提供的_IOWR宏来构造。关于ioctl命令的构造方法,有兴趣可以看看这篇文章, 基本讲清楚了。 ——构造IOCTL学习心得. #define BINDER_WRITE_READ _IOWR(‘b’/*type 魔数域*/, ...

私房菜 3016

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

binder系列二-binder内存管理

binder 内存映射中binder_alloc、binder_buffer、binder_lru_page之间的关系。

wulaladamowang的博客 1309

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【新手入门】Android基础知识(二):Binder进程间通信,理解Binder工作原理以及Binder实体、Binder引用、Binder代理概念

Android Binder机制是一种跨进程通信(IPC)解决方案,采用C/S架构实现进程间通信。核心组件包括:服务端(Server)提供功能服务并在ServiceManager注册;客户端(Client)通过ServiceManager获取服务引用;内核Binder驱动负责数据传输。通信过程涉及三个关键对象:服务端的Binder实体、客户端的Binder代理以及内核的Binder引用。服务调用时,客户端通过代理发起请求,请求经Binder驱动转发至服务端处理,结果再沿原路径返回。该机制实现了进程间透明的方

Chesnut. 1381

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Android Binder机制学习总结(二)-Driver部分

本文主要分析Binder Driver的实现。Binder Driver 的实现代码位于 android kernel中:\drivers\staging\android\binder.c & \drivers\staging\android\binder.h.代码量不大,总计4000行左右。关于Kernal代码的下载,可以使用指令(如果https不行,就用http试试): git clon

a220315410的专栏 9533
上一篇: Binder实用指南(一) - 理解篇
下一篇: 理解和使用systrace
Omni-Space
博客等级 码龄11年 2158粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值