android native层进程通信

aidl 实现native service和App通信 之前一直写的是android应用之间的aidl开发,最近学习的是native service和App之间通过aidl进行通信,这里记录一下。主要介绍的是native service和App端aidl的实现,至于service的编译过程我这里没有详细的记录。我所用的android版本是11. 1、定义aidl文件 aidl文件中定义了我们想要实现的功能,是后续一切的开始,为了测试回调功能,我这里定义了一个回调接口和一个自定义数据类型FileInfo, 用来跨进程传递信息的自定义数据结构。 FileInfo.a 阅读详情

   我们需要在android native层实现两个进程间的通信,这两个进程一个是native c 进程,一个是apk,两者需要传递一张几百K的图片,natice c 程序写该图片,apk读该图片,而且,这个读写的过程是一直持续的


  首先,根据linux提供的几个进程通信的方法一个一个的来看:

1 信号,显然不合适,这个是系统进程和用户进程通信的方法,显然对我们来说不合适

2 管道  , 说实话,本身很不喜欢这个概念,因为不容易懂,管道有份同一个父进程和不同父进程的通信,经尝试,失败,原因记不清了,好像是android没有实现管道这个东东

3 共享内存, android没有实现该方法,它使用的是匿名共享内存,经google,发现,提供的接口非常复杂,不容易懂,放弃

4 socket, 实现了该方法后,可以通信,但是很郁闷的是socket通信对数据大小是有要求的,如果是64K以下,那用这个很easy,但是我们传递的是图片,将近一兆的大小,在用socket的时候,发现,传递的图片,有的时候是正确的,有的时候不正确,在图片的结尾或者头部有一些数据损失,经观察,每次传递的数据大小也不一致,这个显然是不能接受的。虽然,socket传递大数据是有很多方法的,比如说分批次传递,压缩传递,但是,就我们这样规模的一个工程,而且是在本机传递,用得着这样大动干戈吗?即使费劲九牛二虎之力做到了,一方面,花费的时间,由于复杂度过大引起bug的可能性,这两个原因让我选择放弃该方法。

5 经过这么多的失败,必须停下来思考下了,开始看书,无意中发现linux有一个对文件加锁的机制,这个很棒。我们最终就是要让两个不同的进程安全的访问一个文件,既然可以对文件加锁,那么数据安全的问题就解决了,而在android本地创建一个文件,也不需要太麻烦,ok,思路来了:

 a 创建一个公共文件,native c写该文件,apk程序读该文件,对文件的加锁解锁都用c做,apk程序通过jni的方式去加锁解锁

 b 关于数据安全性,native c程序在写该文件的时候,其他程序不能读或者写,apk层文件需要读该文件的时候,其他进程不能写

c 关于公共文件的存放位置,经过与大牛沟通后,决定放在android的tmpfs上,怎么查看android文件系统里,哪些目录是tmpfs呢,busybox mount 后,看看吧;关于什么是tmpfs,可以google下详细了解,简单的说,它其实就是物理内存的一块地方,既然这样,那么访问速度就会很快,原先担心的频繁读取IO会低效的顾虑也打消了


 有了思路开始实施,一切还算顺利,除了一个问题,关于公共文件在什么时候创建的问题。 首先,如果将我们的程序安装到一个android设备上的时候,不能指望人家文件系统就已经给你创建好了该文件吧,所以,需要在我们的程序里面去创建该文件。所以,有这样的一个程序步骤,如果该文件不存在,则创建。

   但是,事与愿违, 文件虽然创建了,但是使用文件的时候,总是提示有问题,好像是文件无法被访问的提示,于是乎,查看一下该公共文件的权限,的确跟其他文件不一样啊,原来是linux的权限机制在捣乱。所以改变文件权限是核心问题,因为在程序中创建文件时,需要指定权限,但是,当时给的权限是可读写,但是,创建出来却不是这样的,所以 ,放弃该方法。在折腾的过程中发现一个问题,我手动adb进去,切换到root权限,手动创建的文件,权限是ok的,但是,使用我们的程序创建就不行。

   好在我们有一个系统启动时执行的脚本文件,我们自己写的,该脚本文件的执行是加在init.rc文件里的,所以,在该脚本文件中加入两行:

 touch myfile

chmod 777 myfile

执行脚本,加载程序,一切ok


经过这几天的折腾,总结经验如下:

1 做产品,解决问题使用的方法必须考虑到时间因素,解决方案的复杂性,并不是难度大的解决方案就是最好的,因为难度大,采用的流程多,代码量高,造成隐藏的bug量就大

2 采用简单好理解,易维护的解决方案

3 在android底层写程序,遇见问题的时候,考虑下权限问题

4 不拘泥于传统的方法,白猫黑猫能抓到老鼠的就是好猫


欢迎大家提出意见和建议



APK 与 Android Native Service 通信 apk(java binder client) 与 Native Service 通信 Android 4.4 无需JNI Client Native service (具有root权限) 通过Parcel在java与c++传输数据 IBinder.onTransact 通信原理 仅适用于系统开发人员(能够拿到源码编译后的android库) native service 的编写 ... 阅读详情

相关推荐

android native层 binder通信机制演示源码

该压缩包的内容主要是基于android系统演示native层进行binder通信的源码,里面分为bp和bn直接如何设计,可以给那些需要再native层进行binder通信的开发提供一个参考

QGIS效率提升神器:qgis_mcp插件+VSCode联合工作流配置全解析

本文详细解析了如何通过配置qgis_mcp插件与VSCode的联合工作流,实现语音控制和代码自动化来大幅提升QGIS操作效率。该方案将自然语言交互与现代编辑器生态结合,为地理信息专业人士构建了智能、高效的全新工作模式,彻底改变传统GIS操作方式。

weixin_29228203的博客 192

android native service编写及两个服务进程通讯

题外话:由于同事咨询,口头讲解的话1对1,但不方便多方传播及继承性,因此特意写此文章讲解一番。 1、android service简要说明: Android Service :又称为 Java Service ,是实现在框架层里的 Service ,使用Java语言编写。 Native Service :又称为 System Service ,是实现在 Runtime 层里的 Ser

andyhuabing的专栏 1万+

旅行青蛙破解汉化教程——蹭个热度

汉化破解版资源(无尽三叶草与点券): https://github.com/wisdombyzf/lxqw/blob/master/lxqw_zf.apk 截图: 破解方法: 工具: 1,APKIDE https://www.pd521.com/thread-818-1-2.html 2,dnspy https://down.52pojie.

github_38838414的博客 3785

[Linux]双网卡 CentOS 系统中指定网络请求走特定网卡的配置方法

本文详细介绍了在双网卡CentOS系统中指定特定域名/IP通过指定网卡传输流量的方法。核心步骤包括:1)确认网卡信息(ip addr)和域名IP解析(nslookup);2)添加临时路由(ip route add);3)持久化配置(创建route-eth1文件);4)验证配置(ip route show和curl测试)。文章还提供了网关查询、路由删除等常见问题的解决方法,并区分了不同CentOS版本重启网络服务的命令差异。通过合理配置路由规则,可实现流量的定向传输需求。

wingaso的博客 1573

Android AIDL的使用,进程间的通讯;

AIDL Android使用AIDL来实现进程间的通讯; 最简单的进程,两个APP(APP1(app_server) , APP2(app_client)),这里app_server可以看作一个进程 , app_client也可以看作一个进程; 所以AIDL可以来实现两个APP之间的通讯; 先来写一个最简单的AIDL进程间的通讯; app_client要调用app_server中的数据,首先app_server先把数据暴露出去; app_server端: 1、新建AIDL文件; 输入名..

Choi晨的博客 1303

STK12与Python联合仿真(一):环境搭建

STK仿真python接口,安装与测试

qq_42635142的博客 1万+

Android开发之漫漫长途 Ⅷ——Android Binder(也许是最容易理解的)

该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》中的相关知识,另外也借鉴了其他的优质博客,在此向各位大神表示感谢,膜拜!!!另外,本系列文章知识可能需要有一定Android开发基础和项目经验的同学才能更好理解,也就是说该系列文章面向...

weixin_30521649的博客 89

Python之afdx包语法、参数和实际应用案例

Python 的 afdx 包是针对 AFDX 协议的轻量级开发工具,专注于 AFDX 数据帧的解析、构造、发送/接收、协议合规性校验等核心能力,广泛应用于航空电子设备测试、仿真、数据监控等场景。

王国平的博客 984

AUTOSAR进阶图解==>AUTOSAR_EXP_CDDDesignAndIntegrationGuideline

本文档提供了AUTOSAR架构中复杂驱动(CDD)的设计与集成指南。CDD作为非标准化的软件实体,位于复杂驱动层,实现传感器评估、执行器控制、微控制器访问等特殊功能。文档详细阐述了CDD的架构特点、设计建议(包括文档要求、文件结构、接口描述等)以及与其他模块(RTE、库、标准BSW等)的集成方式。特别强调了CDD在多核系统和MCAL层中的实现考量,为开发人员提供了从文档规范到代码实现的全方位指导,确保CDD在保持AUTOSAR兼容性的同时满足特殊功能需求。

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 1890

千里马android binder深入分析-承上启下的native层(客户端部分)

csdn在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论 android跨进程通信实战视频课程(加群获取优惠) 相信大家对上面这一副binder跨进程通信的图都应该比较熟悉,图中的主要有4个角色: 1、客户端(A进程) 2、SerivceManager 3、服务端(B进程) 4、binder驱动 平时一问到binder是怎么跨进程通信的?那么同学们肯定大部分回答:binder最后调到底层还是通过binder驱动来实现跨进程通信的。那么这里就要问一下:请问android中ap

liaosongmao1的专栏 596

【AUTOSAR-CanNM】-3.1-如何让ECU发出的首帧是NM帧(Tx Nm报文先于Tx App应用报文发出)

如何让ECU发出的首帧是NM帧(Tx Nm报文先于Tx App应用报文发出)

「汽车电子助手」的博客 4724

android系统_Binder系列教程

目录一,Binder驱动二,Binder通信协议三,Framework层Native侧Binder四,Framework层Java侧Binder五,Framework层JNI侧Binder六,Binder整体架构图

博客 295

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Android Binder -1

Binder -1 IPC Android基于Linux内核,Linux内核继承和兼容了Unix的进程间通信机制,故进程间通信机制(IPC,Inter-Process Communication)代代相传。 下面简单介绍IPC的定义,总结主要的IPC方法、系统环境及其特点: 进程间通信(IPC,Inter-Process Communication),指至少两个进程或线程...

qq_30092495的博客 286

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Binder机制详解(三)

前两节学习了Binder机制需要储备的底层知识,接下来会分四层详细讲解Binder机制

java521666的博客 625

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android系统-进程-Binder2-Java层

对于Android系统,一般是从java层到native层,再到kernel驱动层,形成一个完整的软件架构。Android系统中的Binder IPC通信机制的整体架构,从java层到底层驱动层是怎么样的一个架构和原理的呢?

haigand的专栏 315

Android Binder实战开发指南之Java层直接调用Native Binder Service

Android Binder实战开发指南之Framework层直接调用Native BinderService 前言 承接上一篇文章Android Binder实战开发指南之创建Framework层Binder系统服务,本篇来介绍一下怎么通过Java直接使用Native Binder Service。这里使用的是前面创建的Native Service。 ...

IT先森 2634

Android native进程间通信实例-binder篇之——HAL层访问JAVA层的服务

有一天在群里聊天的时候,有人提出一个问题,怎样才能做到HAL层访问JAVA层的接口?刚好我不会,所以做了一点研究。 之前的文章末尾部分说过了service call 可以用来调试系统的binder服务。 传送门:Android native进程间通信实例-binder篇之——简单的单工通信 这次可以用到这个命令了! 1. 随机选取一个java层的服务。 adb shell 中...

weixin_30508241的博客 806

Binder源码分析

一. Binder架构解析

fdsafwagdagadg6576的专栏 1805

Android Binder框架实现之Java层Binder整体框架设计

 Android Binder框架实现之Framework层Binder整体框架设计 前言   本文是Android Binder框架实现之Framework层Binder整体框架设计的起始篇,本文会重点讲述Android Binder框架Framework层整体设计思路,本系列的文章列表如下: Android Binder框架实现之Binder的设计和框架 Android Binder框架实现之Binder中的数据结构 Android Binder框架实现之Binder相关的接口和类 Android

IT先森 2897

Android Index

Android架构 静态架构 Archecture设计 (Binder,Android的根基) Archecture设计 (消息处理和4大组件&回调) Archecture设计 (事件循环和IPC 线程的综合运用)  Archecture设计   (基于Binder, 全局概貌)  动态架构(启动过程)    13 Android Boot sequence 1    13 A

CCJHDOPC的专栏: 5081

Android Binder 原理换个姿势就顿悟了(图文版)

Android Binder 原理换个姿势就顿悟了(图文版)

似霰的博客 401

如何使用Binder

如何使用Binder。

L_2162的博客 290

Android实战技术:理解Binder机制

http://blog.youkuaiyun.com/hitlion2008/article/details/9842289 Android中的RPC(IPC)是由Binder组件来实现的,虽然我们使用更多的还是AIDL,并不会直接使用Binder,但是了解了它能更有效帮助理解AIDL以及理解Android本身的一些原理和机制。 Binder的架构 与其他的Android系统的组件的架构

thinkinwm的专栏 762
上一篇: 关于向某盒子移植我们的native c程序
下一篇: 几个常用的linux命令
yaotinging
博客等级 码龄18年 7粉丝 15原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值