跨进程C/S native service服务编写

Android Native binder 通信实例 本文是实现android native层binder通信案例,包含callback 实现。 阅读详情

纯Native的Service表示代码都在Native层,前面的文章讲到了两个service进程通过这binder中的onTransacton进行通讯,而这篇文章主要讲利用C/S结构的方法,利用IInterface进行相互访问。


以具体代码为例:
test.cpp :
using namespace android;

int main(int argc, char** argv)
{
    sp<ProcessState> proc(ProcessState::self());
    sp<IServiceManager> sm = defaultServiceManager();
    LOGI("ServiceManager: %p", sm.get());
    sm->addService("test.service",new Test);  //这里加入serviceManager中

    ProcessState::self()->startThreadPool();
    IPCThreadState::self()->joinThreadPool();

    //在2.3版本中可以定义用一句话代替上面的代码:

    TestService::publishAndJoinThreadPool();
    return 0;

}

BinderService中定义如下:
    static void publishAndJoinThreadPool() {
        sp<ProcessState> proc(ProcessState::self());
        sp<IServiceManager> sm(defaultServiceManager());
        sm->addService(String16(SERVICE::getServiceName()), new SERVICE());
        ProcessState::self()->startThreadPool();
        IPCThreadState::self()->joinThreadPool();
    }

这里定义的是跨进程的C/S结构,所以分为本地服务端BnTest及客户端BpTest,为隐藏性Bp与Bn的定义与实现都入在BnTest.cpp中。
BnXX代表服务端,Bp代码客户端


头文件ITest.h定义如下:
#define ANDROID_ITEST_H
#ifndef ANDROID_ITEST_H
class ITest: public IInterface
{
protected:
enum
{
TEST_GETTEST = 0,
TEST_SETTEST,
};
public:
DECLARE_META_INTERFACE(Test); //声明重要宏定义
//定义纯虚函数
virtual void getTest() = 0;
virtual void setTest() = 0;
};


//BnTest 声明
class BnTest: public BnInterface<ITest>
{
public:
    virtual status_t    onTransact( uint32_t code,
                                    const Parcel& data,
                                    Parcel* reply,
                                    uint32_t flags = 0);
};


// ----------------------------------------------------------------------------




}; // namespace android


#endif // ANDROID_ITEST_H


接口实现ITest.cpp
namespace android {

//BpTest实现
class BpTest : public BpInterface<ITest>
{
public:
    BpTest(const sp<IBinder>& impl)
        : BpInterface<ITest>(impl)
    {
    }

    
    virtual void getTest()
    {
    Parcel data,reply;
    data.writeInterfaceToken(ITest::getInterfaceDescriptor());
   
    //TODO... 使用类似的writeXXX函数
    remote()->transact(TEST_GETTEST,data,&reply);
    int ret = reply.readXXX();
    return ;
    }
    
    virtual void setTest()
    {
    Parcel data,reply;
    data.writeInterfaceToken(ITest::getInterfaceDescriptor());
   
    //TODO... 使用类死的writeXXX函数
    remote()->transact(TEST_SETTEST,data,&reply);
    int ret = reply.readXXX();
    return ;
    }
};


//BnTest实现
//重要的一个定义实现
IMPLEMENT_META_INTERFACE(Test, "android.test.ITest"); 


status_t BnTest::onTransact(
    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
switch(code){
case TEST_GETTEST:{
CHECK_INTERFACE(ITest, data, reply);
//TODO... setTest()
}break;
case TEST_GETTEST:{
CHECK_INTERFACE(ITest, data, reply);
//TODO... getTest()
}break;
default:
break;
}
}


// ----------------------------------------------------------------------
}


从上面所述,很多代码都基本上是一致的形式,只是往其中添加上不同的处理代码而已,重要的是利用Parcel对象进行序列化。


后面讲讲客户端和服务端如何实现及调用情况:

客户端如何调用:

static sp<ITest> getTestSerivce()
{
    sp<IBinder> binder;
    static sp<ITest> sTestManager = NULL;
    
    if(sTestManager != NULL)
    return sTestManager;
    
    sp<IServiceManager> sm = defaultServiceManager();
    do {
        binder = sm->getService(String16("test.service"));
        if (binder == 0) {
            LOGW("TestService not published, waiting...");
            usleep(500000); // 0.5 s
        }
    } while(binder == 0);

if(sTestManager == NULL){
sTestManager = interface_cast<ITest>(binder);
}

return sTestManager;
}

利用getTestSerivce函数获取到客户端管理器句柄,然后利用sTestManager->setTest/getTest调用
这是一种常用的客户端访问service的函数实现方法。

服务端实现:
class TestService:
public BinderService<TestService>, //2.3 存在,而2.2版本实现instantiate()函数
        public BnTest,
        protected Thread
{
public:
static void instantiate();
static char const* getServiceName() { return "test.service"; }

//服务端实现接口函数
virtual void getTest() ;
virtual void setTest() ;
};


void TestService::instantiate() {
    defaultServiceManager()->addService(
            String16("test.service"), new TestService());
}


2.3版本如此做法,在BinderService类中做了此事情:
class BinderService
{
public:
    static status_t publish() {
        sp<IServiceManager> sm(defaultServiceManager());
        return sm->addService(String16(SERVICE::getServiceName()), new SERVICE());
    }
    static void instantiate() { publish(); }
...

};

ok,跨进程的C/S结构代码框架就是这样子了,比较明了。

Android Binder机制解析与优化 本文分析了Android系统Binder跨进程通信机制的核心实现。Binder采用C/S架构,包含Client、Server、Service Manager和驱动层,通过addService/getService完成服务注册与获取。系统架构分为Java层(IBinder/Binder/BinderProxy)和Native层(C/C++实现),Java层通过JNI调用Native层核心逻辑。 阅读详情

相关推荐

AI 赋能测试全生命周期:多 Agent 协同的自动化提效方案

本文提出了一种基于Coze平台的多Agent协同测试解决方案,旨在解决软件测试中PRD解析不清晰、测试点覆盖不全、用例编写效率低、代码生成耗时等痛点。通过PRD优化、测试点生成、测试用例生成和单元测试框架生成四个Agent的协同工作,结合Cursor工具实现从需求到代码的全链路自动化。以电商平台登录模块为例,展示了从模糊PRD到标准化测试用例和可执行Java单元测试代码的完整转化流程。该方案通过AI赋能显著提升测试效率,减少人工干预,实现测试覆盖率≥95%,为快速迭代的软件研发提供了高效的测试自动化支持。

QINJIEEE的博客 1104

从JAVA层addService到SM

经过前面几篇文章得分析,可以大致知晓从native层往下是如何进行SM的获取,那么这篇文章将着手从JAVA层开始梳理service服务端如何添加服务到SM中的 addService()整体流程简介 照例先给出整个流程的时序图 addService整个流程的示意图如下: AMS启动 本篇以AMS的addService为例进行梳理分析,其他的服务也都是大同小异,这里简单说一下AMS服务的启动 AMS是由SystemServer进行开启的,我们从AMS开启入手。 代码路径:androi.

super_marie的博客 483

逆向选择启示录:一个失败高频策略如何意外跑赢市场

本文探讨了高频交易中的逆向选择现象,揭示了一个失败的高频策略如何通过简化意外跑赢市场。通过加密货币市场的实证分析和蒙特卡洛模拟,研究发现低预测性的简单策略反而更具鲁棒性,有效规避了逆向选择风险。文章还提供了小币种做市策略的优化框架和实践建议,为量化交易者提供了宝贵洞见。

weixin_29191669的博客 401

Android Binder 机制之ServiceManager 续

上一篇写完了servicemanager进程,其主要功能1. 注册服务(addService) 2. 获取服务(getService),并且通过一个链表来维护当前已经注册的service组件。接下来的分析,将进入binder的框架的世界,首先来分析下IServiceManager接口,注册服务和获取服务都是从这里开始的。在介绍IServiceManager接口之前,先看下系统进程mediaserv...

小杰的专栏 396

离线安装WSL2系统

由于办公环境在内网环境中,需将开发环境部署到内网中。环境:内网:win10。

qq_40224400的博客 3513

论文阅读--射频电源在半导体领域的应用

射频电源(RF Power Supply)是能够输出300kHz~300GHz正弦波电压的高频交流电源,在半导体制造领域,射频电源的典型工作频率范围为400kHz∼60 MHz,主要由射频发生器(功率源)、匹配器及配套控制电路组件构成,其关键组件包括变压器与电抗器、晶闸管、绝缘栅双极型晶体管(IGBT)、钣金件、铜材及各种电子元器件。射频电源是刻蚀和薄膜沉积工艺的核心,主要用于产生等离子体,以增强气体反应活性,其性能直接影响反应腔体内等离子体的浓度、均匀性和稳定性。

伊丽莎白的学习之路 2342

addService实例分析

这个例子源自ActivityManagerService(AMS),我们通过它揭示Java层Binder的工作原理。该例子的分析步骤如下: 首先分析AMS如何将自己注册到ServiceManager。 然后分析AMS如何响应客户端的Binder调用请求。 本例的起点是setSystemProcess函数,其代码如下所示: [-->ActivityManagerService.java::s

freexuejin_business的专栏 1426

GPU基准测试全攻略:从驱动验证到深度学习环境部署

GPU基准测试是评估显卡性能与稳定性的核心方法,其原理在于通过标准化负载程序,对GPU的计算单元、显存和散热系统进行压力测试。这项技术的价值在于,它能科学量化硬件性能,确保软件环境配置正确,为深度学习、科学计算等重负载任务提供稳定基础。在实际应用场景中,无论是新卡验机、排查深度学习环境问题(如“warning: no usable gpu found”报错),还是验证“PyTorch GPU版本安装”后的实际算力,系统的基准测试都是不可或缺的工程实践环节。通过结合通用计算测试与深度学习框架验证,用户可以提前

weixin_30080745的博客 343

Andriod Binder原理解析

Andriod Binder原理解析 概述: Binder通信涉及的源码纷繁复杂,细节更是深得难以细究,本文试图以简洁的语言说明binder原理,以让读者理解binder大致框架和流程,至于具体的细节这里不错陈述,需要读者自己研读源码了. 由于java层的binder只是对c++层binder的封装调用,要想真正理解binder还是要从c++层分析,因此本文所涉及的代码均是c++层.文章最后也会贴个小demo 首先,binder是什么? 简单来说binder就是一套通信协议,可以和网络通信类.

u010425418的博客 366

基于STM32设计的老人摔倒检测报警系统【升级版】(235)

在 `235 基于STM32设计的老人摔倒检测报警系统(OneNet+MQTT)` 项目基础上增加了心率、血氧、体温测量3个功能。

1511

【Codex】Codex安装+DeepSeek API接入;无需登录,手把手带你使用codex

好多人使用codex时都卡在验证码登录那一步,今天就来介绍一种方法,不需要登录ChatGPT的账号,自然也就不需要手机验证码了;接入DeepSeek的api,一样可以丝滑使用codex;记录从零开始安装使用codex以及DeepSeek API接入的整个过程。不需要登录openAI;

AnChenliang_1002的博客 3543

Android Binder学习(四)之addService流程分析

Android Binder学习(四)之addService流程分析备注:本文基于Android5.1分析   该篇博文去年年底就基本整理完毕,年后几个月太忙,最近才有时间整理一下发表出来。博文是边看代码边整理的,本人能力有限,前后花了三个星期的苦逼夜晚整理。博文是按着代码的执行流程来分析的。以mediaServer添加camera服务为例来分析数据打包传递过程,中间穿插一些我自己理解画出来的图,

armwind的专栏 9241

CVPR 2026 即插即用 | 注意力篇 | MSEF:超轻注意力,空间-通道双分支并行融合,既增强特征又抑制噪声!

Multinex提出了一种超轻量级微光图像增强框架,其核心创新是MSEF模块。MSEF采用双分支并行架构,结合空间局部特征(深度可分离卷积)和全局通道注意力(改进SE),通过Tanh激活实现特征增强与抑制。相比传统注意力模块,MSEF在几乎不增加计算量的情况下显著提升性能,特别适合轻量级网络和边缘设备部署。实验表明,该模块能有效提升PSNR约3dB,同时保持极低的参数量(0.7K-45K)。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 605

MPC比较算法深度解析:秘密共享与乱码电路实现及工程实践

在隐私计算与数据安全领域,安全比较是一项基础而核心的能力。多方安全计算(MPC)中的比较算法,让参与方在不暴露各自明文输入的前提下,安全地判断数值大小,仅输出一个布尔结果。其底层原理涉及秘密共享、乱码电路、不经意传输等密码学工具:秘密共享将秘密拆分为随机份额,乱码电路将逻辑门加密打包,二者各有通信和性能优势。该技术广泛适用于联合风控、隐私求交后的匹配筛选、跨机构统计等场景,也是联邦学习和安全聚合的重要组件。本文从工程实践视角出发,剖析两类主流技术路线的设计思想与落地选型要点,帮助研发者理解并快速实现可靠的安

weixin_34378969的博客 311

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

从零开始怎么写android native service?

从零开始怎么写android native service        Android service对于从事android开发的人都不是一个陌生的东西,很多人可能会觉得服务很简单。服务是简单,因为复杂的别人做了,所以才会觉得简单。我们先梳理一下服务的分类,首先有本地服务跟系统服务的区分,而在APP里写的服务大多就成为Java服务或者应用服务。/*************************

Edsam--活到老学到老,掌握核心技术,做好产品服务! 4663

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

native层的c++如何通过binder获取sm服务(四)

前几篇Binder相关文章讲了驱动的注册和提供的接口,以及ServiceManager的启动运行,很自然接下来我们需要思考客户端进程应该如何获取到sm提供的服务(注册服务和查询服务),本篇从native层c++角度继续分析。 我们需要时刻牢记,应用程序跨进程只能依靠某种介质(比如socket是靠网卡、binder是靠驱动、内存共享是靠物理内存),直接软件去架构是无法做到的,在分析ServiceManager时也说了,sm是一个标准的Binder Server,因之,客户端进程想要访问ServiceManag

dream_caoyun的博客 1451

VC中sqlite的使用

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

AOSP实战:5分钟搞定Native Service的AIDL接口开发(附完整代码)

本文提供了一套在AOSP中快速开发Native Service的实战指南。通过清晰的AIDL接口定义、Soong构建系统配置及C++服务实现,详细讲解了如何构建高性能系统服务,并整合了AOSP、AIDL、Native Service等核心热词,帮助开发者高效完成系统级组件开发。

weixin_28396629的博客 564

Android 11实战:手把手教你用AIDL打通Native Service与App(含自定义Parcelable数据)

本文详细解析了在Android 11环境下,如何通过AIDL实现Native Service与App之间的高效通信。从环境配置、AIDL接口设计到Native Service实现和App端集成,提供了完整的实战指南,特别针对Android 11的特殊要求和常见问题进行了深入剖析,帮助开发者掌握跨进程通信的核心技术。

weixin_27032989的博客 246

Binder在Native的实现

android中的跨进程通信(ipc)用的是C/S体系系统,Binder为这个体系系统提供IPC通信能力。 在android的C/S体系中增加了一个组件servicemanager,提供注册和检索Service的功能。Service在启动过程中将自身信息注册到servicemanager,servicemanager中维护了一个Service信息的列表,Client在使用服务时,可以通过名字像servermanager获取对应Service信息。servicemanager由init启动的进程,本身也是个

wjtzc1990的专栏 486

OpenHarmony播放音乐start请求从app到media_service的调用流程01

本文介绍了基于OpenHarmony 6.1和RK3576平台的MiniMusic音乐播放器Demo的实现与分析。文章首先描述了项目背景和技术栈,然后详细剖析了从ArkTS应用层调用play()方法到最终在media_service中启动音频播放的完整调用链路。通过分析一个最小化的音乐播放器实现,重点梳理了播放请求从应用进程传递到系统服务的流程,包括NAPI桥接、IPC通信等关键环节。该Demo采用fdSrc方式传递音频文件描述符,避免了路径权限问题,使分析过程更加清晰。文章还提供了相关代码片段和调用关系图

qq_61224974的博客 315

Android Java层和Native层通信实战大荟萃之JNI实现通信

        Android和C/C++通过Jni实现通信   在前面篇章Android和C/C++通过原生socket实现通信和Android和C/C++通过LocalSocket实现通信分别介绍了通过原生socket和LocalSocket实现Android和C/C++的通信方式,前面两种方式都可以实现跨进程通信,那么今天我们要介绍的就是在Android同一个进程里面通过Jni实现Java世...

IT先森 2754

Android Framework 之 Binder机制

Binder基于C/S(Client-Server )的结构下,从Server进程来看,Binder是存在的实体对象,client通过transact()函数,经过Binder驱动,最终回调到Binder实体的onTransact()函数中;从 Client进程的角度看,Binder 指的是对 Binder 代理对象,是 Binder 实体对象的一个远程代理,通过Binder驱动进行交互。

weixin_50358291的博客 370

Binder 专题13——添加 Native 系统服务回调

本文介绍了在Android Native层实现Binder跨进程回调功能的方法。通过AIDL定义了IHello服务接口和ICallback回调接口,使用aidl-cpp工具生成C++代码。服务端实现BnHello类并保存回调对象,在sum方法中触发回调;客户端实现BnCallback类接收回调通知。整个过程展示了从AIDL定义到C++实现的完整流程,包括服务注册、回调注册及跨进程调用的实现细节。文章还提供了生成脚本和项目结构说明,为开发者实现Native系统服务回调提供了实用参考。

似霰的博客 628
上一篇: android native service编写及两个服务进程通讯
下一篇: JNI多个线程中使用
andyhuabing
博客等级 码龄19年 704粉丝 165原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值