UNIX域套接字与Android 9.0
IPC进程间通信
在Android中用于进程间通信的方法有很多,比如 Binder、ContentProvider、Messenger、AIDL(基于Binder)、广播、socket等等。其实对于原理还是理解不够深入。哈哈,尴尬。
项目背景
在两个应用之间需要进行数据的传输,在这里以应用A、应用B来说明。
应用A调用so库,并在so库中与 应用B进行通信。
应用B在Java层进行数据处理。
解决思路
第一时间想到是通过UNIX域套接字的方式来进行。
虽然因特网域套接字可用于同一目的,但UNIX域套接字的效率更高。UNIX域套接字仅仅复制数据;它们并不执行协议处理,不需要添加或删除网络爆头,无需计算检验和,不要产生顺序号,无需发送确认报文。
应用A使用linux中的unix socket,应用B使用LocalServerSocket。
实验一 两个C 程序
为了验证可行性,我找了一台root过的手机(非Android 9.0),使用两个C可执行文件进行尝试,没问题。心想着这个问题应该很快能解决。
实验二 C程序与Android程序
刚开始进行这个实验的时候老是失败。查看网上资料大部分都是能够解决的,在stack overflow(https://stackoverflow.com/questions/7516018/android-localserversocket) 中,介绍Linux Abstract方式。虽然这个例子是在同一个应用中的,但对于我来说还是帮助很大的。
后面按照连接中使用的方法,成功了。下一步就是应用了。
应用
于是应用到应用A、B上,在Mate20上尝试。可万万没想到,使用Mate20做实验的时候,一直connect 失败。
看书、网上找资料,加班使劲折腾,搞了一天半愣是没有解决。尼玛,真个人都崩溃了。
后面手机被同事借走了,用自己的手机(Android8.0)调试应用A、应用B,发现居然可以工作。
天哪,Android 9.0对这方面做了什么限制么?有没有人能告诉我啊
天哪,Android 9.0对这方面做了什么限制么?有没有人能告诉我啊
天哪,Android 9.0对这方面做了什么限制么?有没有人能告诉我啊
天哪,Android 9.0对这方面做了什么限制么?有没有人能告诉我啊
天哪,Android 9.0对这方面做了什么限制么?有没有人能告诉我啊
天哪,Android 9.0对这方面做了什么限制么?有没有人能告诉我啊
天哪,Android 9.0对这方面做了什么限制么?有没有人能告诉我啊
天哪,Android 9.0对这方面做了什么限制么?有没有人能告诉我啊
天哪,Android 9.0对这方面做了什么限制么?有没有人能告诉我啊
无法自拔了
退而求其次,尝试localhost方式
无奈只得用因特网域套接字的方式。尝试成功。