Android-Binder(一)

学习自

《Android开发艺术探索》
https://www.jianshu.com/p/bdef9e3178c9
https://blog.csdn.net/u011240877/article/details/72765136

Binder漫谈

Binder是IBinder接口的一个实现类,inder是连接系统的各种Manager和其对应的Service的桥梁,Binder主要用于Service中。

Android系统的分层

对Android系统的分层了解了之后,我们会对IPC有一个更清晰的认知,所以我们来看一看系统的分层

我们来依次看一下各层的职责:

  • Linux Kernel(Linux内核层), 这一层中主要是各种硬件的驱动,Binder IPC的驱动也是在此层的
  • HAL(硬件抽象层),对内核层的封装,为系统服务层提提供可调用的接口,以JNI的方式。
  • Android System Service(Android 系统服务层), Android系统的核心服务,为应用层提供调用的接口
  • Binder IPC Proxys(Binder IPC的代理层),是应用层和系统服务层之间的桥梁,实现跨进程通信
  • Application Freamwork(应用程序框架层), 这一程就是我们的SDK,提供我们日常开发所用到的类库

其中Linux内核层好硬件抽象层,都是以C/C++来实现,硬件抽象层会编译为so文件,已JNI的方式提供给系统服务层调用,系统服务层通过Java实现,该层中的服务随着手机的开机而启动(不关机就会一直运行),这些服务负责Activity的管理,Window的管理等等。因为系统服务层是通过Java实现的所以,他们肯定是运行与一个独立的 Dalvik 中。

因为我们程序员自己开发的程序和系统的服务都分别运行在不同的虚拟机中,之间的通信就只能靠 IPC技术来完成了,为了方便Coder调用系统服务接口Google提供了一系统服务相对应的Manager。其调用关系如下:

从AIDL开始

AIDL(Android Interface Definition Language) Androd 接口定义语言,通过AIDL可以实现IPC,通过AIDL定义的接口我们可以完成客户端和服务的跨进程通信,使用了AIDL的话在编译的时候系统会自动帮我们生成 Binder .

AIDL支持的数据类型

  1. Java 的基本数据类型
  2. List 和 Map
    • 元素必须是 AIDL 支持的数据类型
    • Server 端具体的类里则必须是 ArrayList 或者 HashMap
  3. 其他 AIDL 生成的接口
  4. 实现 Parcelable 的实体

建立AIDL相关的文件

建立需要的实体类 Book 实现Parcelable接口

package top.littledavid.studyipc.beansimport android.os.Parcel
import android.os.Parcelable/*** Created by IT on 7/30/2018.*/
class Book(val bookId: Int, val bookName: String, val author: String) : Parcelable {constructor(parcel: Parcel) : this(parcel.readInt(),parcel.readString(),parcel.readString()) {}override fun writeToParcel(parcel: Parcel, flags: Int) {parcel.writeInt(bookId)parcel.writeString(bookName)parcel.writeString(author)}override fun describeContents(): Int {return 0}override fun toString(): String {return "Book(bookId=$bookId, bookName='$bookName', author='$author')"}companion object CREATOR : Parcelable.Creator<Book> {override fun createFromParcel(parcel: Parcel): Book {return Book(parcel)}override fun newArray(size: Int): Array<Book?> {return arrayOfNulls(size)}}
}

建立AIDL目录,随便输入一名称,建立起目录解构即可,然后把文件删掉,我们自家定义我们自己的文件

建立实体类映射文件 Book.aidl 要在aidl 下与Book 实体类相同的包下才行,否则会报错,无法通过编译,实体类的包接口是 top.littledavid.studyipc.beans->beans 所以aidl下的 Book.aidl包也要一样才行

//实体映射包名一定要和实体定义的包名相同
package top.littledavid.studyipc.beans;
//定义映射
parcelable Book;

定义 IBookManager.aidl 其中定义了IPC操作的方法

// IBookManager.aidl
package top.littledavid.studyipc;// Declare any non-default types here with import statements
import top.littledavid.studyipc.beans.Book;interface IBookManager {List<top.littledavid.studyipc.beans.Book> getBookList();//这是如果不是使用的基础数据类型,一定要使用方向类型标识 : in ,out ,inoutvoid addBook(in Book book);
}

整体目录解构如下

编译成功后会在 项目路径\app\build\generated\source\aidl\debug\top\littledavid\studyipc (包名可能不同)下生成一个 IBookManager.java ,其中实现了IPC相关的代码。

建立Service

class BookService : Service() {private lateinit var mBookList: MutableList<Book>override fun onBind(intent: Intent?): IBinder {mBookList = mutableListOf()Log.e("TAG", "OnBind")return mIBinder}//实现AIDL定义的接口private val mIBinder = object : IBookManager.Stub() {override fun getBookList(): List<Book> {return this@BookService.mBookList.toList()}override fun addBook(book: Book) {this@BookService.mBookList.add(book)}}
}

在Minefast文件中配置服务

<serviceandroid:name=".BookService"android:enabled="true"android:exported="true"android:process=":remote" />

进行IPC

在Activity中进行IPC

class MainActivity : AppCompatActivity() {private var mIBookManager: IBookManager? = nullprivate val mConn = object : ServiceConnection {override fun onServiceDisconnected(name: ComponentName?) {mIBookManager = null}override fun onServiceConnected(name: ComponentName?, service: IBinder?) {//将IBinder转换为AIDL接口mIBookManager = IBookManager.Stub.asInterface(service)}}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)//开启服务val serviceBindIntent = android.content.Intent(this, BookService::class.java)this.bindService(serviceBindIntent, mConn, Context.BIND_AUTO_CREATE)}//添加书籍信息fun addBook(view: View) {val book = Book(1, "Android开发艺术探索", "任玉刚老师")this.mIBookManager!!.addBook(book)loadBookInfo()}private fun loadBookInfo() {val bookList = mIBookManager!!.bookListval stringBuilder = StringBuilder()bookList.forEach {stringBuilder.append(it.toString() + "\r\n")}this.bookInfoTV.text = stringBuilder.toString()}override fun onDestroy() {super.onDestroy()this.unbindService(mConn)}
}

总结

磕磕绊绊的总算完成了AIDL的IPC,非常感谢参考文档中国的博主的无私奉献。下一章我们来看一看Binder的原理。

转载于:https://www.cnblogs.com/slyfox/p/9392443.html

Android-Binder(一)相关推荐

  1. Android Binder IPC机制

    之前有很多人问过我TaintDroid的内容,所以一点点吧涉及的思路整理一下. 今天又看了一遍,确实需要很多的技术支持以及扎实的功底,不管是Java的还是Android,从系统底层一直到顶层,涉及的知 ...

  2. Android Binder 学习笔记

    前言: Binder是Android给我们提供的一种跨进程通信方式.理解Binder能帮助我们更好的理解Android的系统设计,比如说四大组件,AMS,WMS等系统服务的底层通信机制就都是基于Bin ...

  3. aidl使用_借助 AIDL 理解 Android Binder 机制——Binder 来龙去脉

    AIDL 是 Android Interface Definition Language(Android 接口定义语言)的缩写,它是 Android 进程间通信的接口语言.由于 Android 系统的 ...

  4. Android Binder Driver缺陷导致定屏问题分析

    本文讲解异步Android binder call是如何阻塞整个系统的,通过ramdump信息以及binder通信协议来演绎并还原定屏现场. 一.背景知识点 解决此问题所涉及到的基础知识点有:Trac ...

  5. 理解Android Binder机制(3/3):Java层

    本文是Android Binder机制解析的第三篇,也是最后一篇文章.本文会讲解Binder Framework Java部分的逻辑. Binder机制分析的前面两篇文章,请移步这里: 理解Andro ...

  6. 理解Android Binder机制(1/3):驱动篇

    Binder的实现是比较复杂的,想要完全弄明白是怎么一回事,并不是一件容易的事情. 这里面牵涉到好几个层次,每一层都有一些模块和机制需要理解.这部分内容预计会分为三篇文章来讲解.本文是第一篇,首先会对 ...

  7. Android Binder机制(1501210451 张志康)

    本文主要分析native层和Java层的Android binder通信机制. binder是Android最为常见的进程通信机制之一,其驱动和通信库是binder的核心,分别由C和C++编写,应用程 ...

  8. Android Binder设计与实现 - 实现篇(1)

    本文属于原创作品,转载请注明出处并放于明显位置,原文地址:http://www.cnblogs.com/albert1017/p/3849585.html 前言 在学习Android的Binder机制 ...

  9. Android Binder 分析——匿名共享内存(Ashmem)

    前面分析了 binder 中用来打包.传递数据的 Parcel,一般用来传递 IPC 中的小型参数和返回值.binder 目前每个进程 mmap 接收数据的内存是 1M,所以就算你不考虑效率问题用 P ...

  10. Android Binder 分析——数据传递者(Parcel)

    前面 binder 原理和通信模型中在接口实现部分(Bp 和 Bn)中应该看到很多地方都有使用 parcel.这个 android 专门设计用来跨进程传递数据的,实现在 native,java 层有接 ...

最新文章

  1. 自适应高度Textarea
  2. 查看win10剩余激活时间
  3. 效能改进之项目例会导入实践 1
  4. 32汇编语言程序说明_Linux 汇编语言学习--编译和链接
  5. 黑马h5学习代码_如何零基础制作酷炫实用的H5页面
  6. 异常在哪一层处理_WiFi速度慢,信号不稳定,除了重启路由器外,自己能怎么处理?...
  7. 深度学习-为什么用激活函数
  8. eclipse3.1.1汉化版安装
  9. JAVA 【引用类型】和【对象类型】在【继承】中的异同
  10. Vivaldi解决flash插件问题
  11. PCB 电测试--测试点数自动输出到流程指示中(读取TGZ Stephdr文件)
  12. 9.2NOIP模拟题
  13. 国外企业级区块链 联盟链
  14. M1 mac 安装打印机驱动程序
  15. G002-186-17
  16. 圣诞节flash卡通短片
  17. Activiti6在Springboot下的使用 6 并行网关的处理
  18. 设置好DNS如何检测是是否正确正常通
  19. 芯片程序烧录的熔断机制与安全
  20. itunes无法安装到win7系统更新服务器,win7系统无法安装itunes应用程序的解决方案...

热门文章

  1. SAP SD基础知识之组织结构
  2. AI 渗透应用程序开发的七种趋势及方法
  3. AI安防落地靠什么?大规模生产是关键
  4. 人工智能基础-向量的基本几何意义
  5. 汇总python三种数据结构list,set,dict的常见操作
  6. (深入理解)强化学习中on policy和off policy的区别
  7. 谷歌发布史上最强人类大脑「地图」,1.3亿个突触,在线可视3D神经元「森林」!...
  8. 2018年中国人工智能100强研究报告
  9. 【赠书】21世纪科技竞争的核心是超级智能的控制权
  10. 十八岁华裔天才携手「量子计算先驱」再次颠覆量子计算