Android系统原理性问题分析 - Android Native程序的结构设计方式

news2024/11/27 21:03:17

Android核心原理 5.3

声明

  • 在Android系统中经常会遇到一些系统原理性的问题,在此专栏中集中来讨论下。
  • Android系统主要由Java和C/C++两个世界构成,此篇分析处于Java世界和C/C++世界的两个进程如何实现进程间通信的问题。
  • 此篇参考一些博客和书籍,代码基于Android 9.0.0,不方便逐一列出,仅供学习、知识分享。

1 Native程序的结构设计

  Android 的本地程序基于 Linux 中标准 C和C++的开发,这部分内容和其他系统的思路相同比较特殊的地方是Android 的本地程序使用 Android 中的通信机制,由此也产生了特殊的程序结构。实际上Android 很少有只需要在本地处理而不需要和 Java 层进行任何交互的程序。

2 设计思路

  Android 系统中很多功能的实现,通常需要增加一个部分的可执行程序作为守护进程。此守护进程不但有一个循环运行,又能与外部进行交互。Android 系统中需要有本地的守护进程,主要由于以下的原因

  • 在Android 系统实现某些功能的时候,需要一个本地的循环在后台运行,并统一管理一些全局的内容。
  • Android 中有某些部件是从其他系统移植过来的,本身守护进程(Daemon)的形式。

  Android 需要保持这种结构。这种守护进程本质是本地的可执行程序,因此它可以调用 Linux 的驱动程序,调用很多本地库来实现它的功能。在构建一个 Android 中的本地守护进程的时候,核心问题是它如何与Java层进程进行交互?本质上是通信的问题。不仅需要考虑与其他本地程序通信的手段,也需要考虑 Java 程序通信的手段。
  Android 的本地守护进程的结构设计主要具有两种典型的形式:

  • 使用 保留的 Socket 机制。
  • 使用 Binder 机制。

  它们都是使用守护进程实现具体的功能,并且具有不同形式的“交互者”。在权限问题上,本地的守护进程是一个权限,与它交互的程序又可以是另外的一个权限。

3 守护进程 + 保留 Socket 的设计结构

  Android 中的本地守护进程,需要统一在init.rc 文件中将可执行程序声明成服务,然后由 init 程序解析脚本运行它们。在声明服务的时候,可以赋予它一个 Socket 作为对外通信的手段。
  Android 中保留的套接字对应 /dev/socket 中的一个套接字文件。在本地层和 Java 层都具有操作这种套接字的接口。在这种典型的程序结构中,本地的守护进程,可以访问本地驱动,可以调用其他的本地库。这与程序的具体实现相关,而和程序通信结构无关。
  通过 init.rc 为守护进程建立了保留的 Socket。从守护进程的角度,得到这个套接字之后,可以再对其中内容进行解析。需要与这个守护进程进行交互的程序可以有不同的几种调用方式:

  • 本地的库可以通过本地 Socket 方法访问此 Socket,进一步还可以封装一层JNI提供给 Java 层调用;
  • Java 框架层中的类可以通过 Java 层的 Socket 方法访问此 Socket,进一步可以提供Java 类给 Java 应用层调用;
  • Java 应用程序层也可以通过 Java 层的 Socket 方法直接访问此 Socket,此种方法的使用比较少;

  以上的几种方式,都可以建立一条从本地的守护进程到 Java 层之间的通信通道。让 Java直接访问套接字,还可以避免使用JNI。
在这里插入图片描述
  保留的 Socket 被打开后,本质上就是一个文件描述符,对其进行读/写可以表示控制操作或者数据传输。具体的协议需要由程序自行定义。保留的 Socket 还可以在 init.rc 中定义权限,原则是守护进程和其调用者都可以访问,限制别的程序对其访问。守护进程+保留 Socket 的结构一般适合守护进程在后台做的事情多,与外部交互较少的情况。Socket 提供的是表示命令的字符串,守护进程得到命令之后,执行调用者的请求,并可以有响应字符串返回。套接字的特点是异步的操作,请求和响应将是两个分离的阶段。Android 系统默认的实现中,几个全局的守护进程:vold、netd、installd、keystored 以及用于电话的 rild 均以这种程序结构存在。守护进程直接和 Java 层通过 Socket 通信,因此不涉及JNI 。

4 守护进程 + 本地层 Binder 的设计结构

  此方式利用 Android主要的IPC 机制 Binder,可以进行更为灵活的跨进程的函数调用。在这种方式中,如果需要和 Java 层进行交互,必须使用利用JNI 对本地内容进行封装。
守护进程+本地层 Binder 实现方式的内容可以分成 3 部分:

    1. 具体 Binder IPC 的框架:它由IXXX、BnXXX和BpXXX 3个类构成,这是通用的基本结构。
    1. 实现者:主体的部分也就是 BnXXX 的继承者,它可以通过调用驱动程序或者本地的库来实现功能。守护进程就是 BnXXX 的继承者的运行载体,负责建立其实例并且增加到 servicemanager 当中。这个 BnXXX的承者的运行用户等上下文就是守护进程的上下文:类建立之后,可以在后台为自己运行线程;还可以等待客户端通过 Binder对其调用。
    1. 交互者,也就是 Binder 的不同层次的调用者:直接的调用关系是通过servicemanager 得到IXXX,并对其调用。为了调用的方便,通常将其封装成一个本地更适合调用的本地名称类似 XXX 形式的类,这个类就是这种框架本地调用的接口。将 XXX通过JNI封装成一个Java 中的XXX类作为Java 层调用的接口,可以为 Java 框架层或者 Java应用层调用。无论调用者调用的是本地或者 Java 的接口,它都运行于自己的进程中。
      在这里插入图片描述

  利用 Binder 的 IPC 机制调用本质上是同步调用,实现者返回后调用者才可以返回,因此与一个进程中的调用情况相似。一般适合与外部交互比较多的情况。这种远程函数调用(RPC)的交互方式显然更适合复杂的调用关系。Android 系统默认的实现中,media 守护进程中的MediaPlayerService、CameraService 和AudioFlinger 等类使用的是这种典型的结构,SurfaceFlinger 情况类似,但是默认情况下没有独立运行的守护进程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/533369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Go程序设计语言翻译问题(goroutine)

中文:Go程序设计语言 2017.1 英文:The Go Programming Language 2016 8.4.2. Pipelines 8.4.2管道章节 修正: 第一个管道应该改成通道,cannel是概念词汇 重要概念词汇不能混淆 来自chatGPT3.5: Go Pipelines和channel…

(kubernetes yaml文件|--dry-run导出yaml文件

kubernetes yaml文件|--dry-run导出yaml文件 YAML 语法格式:二 查看 api 资源版本标签三 写一个nignx.yaml文件demo四、编写service服务的资源清单详解k8s中的port五 用–dry-run命令生成yaml资源清单六 将现有的资源生成模板导出写yaml太累怎么办? YAML…

【Linux】1. Linux常见指令

专栏导读 🍁作者简介:余悸,在读本科生一枚,致力于 C方向学习。 🍁收录于 C 专栏,本专栏主要内容为 C 初阶、 C 进阶、 STL 详解等,持续更新中! 🍁相关专栏推荐&#xff1…

社会关系抽取赛题提交指南

社会关系抽取赛题提交指南 一、赛题背景 本次主要为大家介绍社会科学计算大赛的赛题之一---社会关系抽取。 1.技术发展 关系抽取(Relationship Extraction, RE)是信息抽取的一个重要任务,其目标是从文本中抽取实体之间的关系。RE技术发展历程主要有以下几个阶段:1. 规则与模…

初窥机器视觉与卷积神经网络

文章目录 1. 什么是卷积神经网络2. 卷积运算3. 池化层4. 卷积神经网络的整体架构 1. 什么是卷积神经网络 卷积神经网络(convolutional neural network,CNN)主要用于计算机视觉相关任务,但处理对象并不局限于图像,CNN在序列和语音等上的应用也…

2023年陕西省《网络建设与运维》技能大赛试题

项目简介: 某集团公司原在北京建立了总公司,后在成都建立了分公司,广东设立了办事处。集团设有产品、营销、法务、财务、人力5个部门,全网采用OSPF、RIP、ISIS、BGP路由协议进行互联互通。集团在北京建立两个数据中心,贵州建立异地灾备数据中心。 公司网络拓扑如图1所示,…

功能要进阶自动化测试,你必须要了解的十大自动化测试框架

什么是自动化测试框架? 自动化测试框架,即是应用于自动化测试所用的框架。按照框架的定义,自动化测试框架要么是提供可重用的基础自动化测试模块,如:selenium 、watir等,它们主要提供最基础的自动化测试…

【Python入门篇】——Python中循环语句(while循环的嵌套应用,嵌套案例)

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: Python入门,本专栏主要内容为Python的基础语法,Python中的选择循环语句…

监控系统经典架构详解

要了解一个监控系统那么我们就先要了解他的架构,看看监控系统是由哪些模块组成,各个模块是如何相互协调。我们将众多主流监控系统架构进行逻辑抽象和概括。 典型架构 从上图(监控系统经典架构图)来看,从左往右&#x…

Android RecyclerView实现吸顶动态效果

文章目录 一、ItemDecoration二、实现RecyclerView吸顶效果1、实现一个简单的RecyclerView2、通过ItemDecoration画分割线3、画出每个分组的组名4、实现吸顶效果 完整demo 链接:https://download.csdn.net/download/JasonXu94/87786702 一、ItemDecoration ItemDecoration 允…

python实现学生成绩管理程序,包含各科成绩的录入,计算各个学生的总分和平均分,统计各个科目的最高分、最低分和平均分。

一、编程题目 编程题目:使用python实现学生各科成绩的录入,计算各个学生的总分和平均分,统计各个科目的最高分、最低分和平均分。其中学生人数通过输入来决定,科目包括语文、数学和英语这三门课程。(保留一位小数&…

JavaEE 5 (4/28)

1.wait() 和notify() 调用wait后做的三件事 1.释放锁 2.等待其他线程通知 3.收到通知后重新上锁,继续执行 要想实用wait和notify就得搭配synchronized 获取锁 wait哪个对象就要针对哪个对象加锁 Java中线程是随机抢占式执行的,实际上线程的执行我们一定要有一个顺序. join可以…

阿里云服务器可以做什么?十大使用场景举例说明

使用阿里云服务器可以做什么?阿里云百科分享使用阿里云服务器常用的十大使用场景,说是十大场景实际上用途有很多,阿里云百科分享常见的云服务器使用场景,如本地搭建ChatGPT、个人网站或博客、运维测试、学习Linux、跑Python、小程…

【2023秋招】2023华为od-4.20三道题

2023大厂笔试模拟练习网站(含题解) www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据,挂载到我们的OJ上,供大家学习交流,体会笔试难度。现已录入200道互联网大厂模拟练习题&…

【刷题之路Ⅱ】LeetCode 622. 设计循环队列

LeetCode 622. 设计循环队列 一、题目描述二、解题1、方案1——数组实现,预留一个空判满1.1、成环思路1.2、初始化接口1.3、入队接口1.4、出队接口1.5、取队头接口1.6、取队尾接口1.7、判空接口1.8、判满接口1.9、释放接口 2、方案2——单向循环链表实现&#xff0c…

SpringBoot集成Oracle实战和坑

这里写目录标题 前言1.导包2. 配置文件:数据库信息辟谣 3.代码 问题更新 前言 前段时间搞了一个oracle的项目,耗费了很多时间,现在项目整体上线了,在此记录下实战过程以及遇到的坑,有需要的网友也可以直接拿去使用。 …

文本三剑客正则表达式1

文章目录 文本三剑客&正则表达式11 sort1.1 sort -f1.2 sort -b1.3 sort -n1.4 sort -r1.5 sort -u1.6 sort -t1.7 sort -k1.8 sort -o 2 uniq2.1 uniq -c2.2 uniq -u2.3 uniq -d 3 tr3.1tr -c3.2 tr -d3.3 tr -s :3.4 tr -t 4 cut4.1 cut -d4.2 cut -f4.3 cut -b4.4 cut -…

基于 SpringBoot+Vue 的家政服务管理平台

1. 背景 本系统主要是设计出家政服务管理平台,基于B/S构架,后台数据库采用了Mysql,可以使数据的查询和存储变得更加有效,可以确保家政服务管理的工作能够正常、高效的进行,从而提高工作的效率。总体的研究内容如下&am…

模组uart调试总结

配置驱动选项 1.1 首先通过原理图确定其串口号,比如UART1、UART3_HS,同时查看该串口引脚是否有复用功能,比如用作SIM卡引脚。如果有复用,需要在设备树配置中取消复用功能的选项,然后选中串口功能,高通平台设…

【嵌入式环境下linux内核及驱动学习笔记-(12-设备树操作函数)】

目录 1、设备树对应的数据结构1.1 struct device_node1.2 struct property 2、设备树操作函数2.1 查找字点的函数2.1.1 of_find_node_by_path2.1.2 of_find_node_by_name2.1.3 of_find_node_by_type2.1.4 of_find_compatible_node2.1.5 of_find_node_by_phandle2.1.6 of_get_ch…