Android和Linux的嵌入式开发差异

最近开始投入Android的怀抱。说来惭愧,08年就听说这东西,当时也有同事投入去看,因为恶心Java,始终对这玩意无感,没想到现在不会这个嵌入式都快要没法搞了。为了不中年失业,所以只能回过头又来学。

首先还是说Android是基于Linux内核的,所以说骨子里还是linux,但是针对移动端,进行了深度优化。在这里结合GPT还有网上的信息,这里主要针对相比嵌入式Linux的差异,简单总结一下:

 

1 首先当然是前后端的分离。

有点类似Openwrt的发展。在之前,linux要开发图形程序是比较复杂的,QT,还有几个库,要么要收费,要么难以学习,最关键是和硬件平台绑定,换到新硬件要做移植。所以谷歌在操盘的时候,直接用Java做了前端GUI。当然,Java以前也有用J2SE做应用的传统。这样搞的好处也显而易见,前端和硬件分离,不管什么硬件,都不用改app代码了,虚拟机做适配就行了。IOS因为平台封闭,所以选了类C语言(具体机制空了再看看)。

所以首先的差异就是前端App要用Java开发,所以这个基本上绕不开。框架还是必须要学一下。

在前端App的层面,谷歌提供了Framework,还有大量的原生应用,比如电话,计算器,日历,email等。简化了很多开发。

=====================================

按照现在主流的分工,不管是Java还是Kotlin,应该都有专门的工程师。这部分对于嵌入式开发工程师我的理解是不用太懂,但是基本框架要懂,app是怎么怎么调用底层的,这个必须要知道。

试手一下CameraX(TODO)-CSDN博客

 
2 内核的变化(部分内容来自GPT)

Wakelocks: Android引入了"Wakelocks"机制,用于管理设备的唤醒状态。这是为了优化移动设备的电源管理,确保在需要时设备保持唤醒状态。就是俗称的唤醒锁,貌似这玩意主要是app层在用。

Low Memory Killer: Android引入了Low Memory Killer机制,用于监测并终止占用过多内存的应用程序进程,以维护系统的内存稳定性。这有助于提高系统的性能和响应能力。

Binder IPC(Inter-Process Communication): Android使用了自己的进程间通信机制,称为Binder。Binder允许Android系统中的不同组件进行通信,例如Activity、Service和BroadcastReceiver。据说这玩意类似Windows上的COM机制。

Ashmem: Android引入了Anonymous Shared Memory(Ashmem)机制,用于进程间共享匿名内存区域。这在Android中的共享内存和图形子系统中使用。

Logger: Android在内核中添加了用于日志记录的Logger模块,以支持Android的日志系统。

Android File System(FUSE): Android引入了FUSE(Filesystem in Userspace)用于文件系统的实现,允许用户空间程序运行文件系统代码而不需要修改内核。

安全性增强: Android对Linux内核进行了一些安全性的增强,包括SELinux(Security-Enhanced Linux)的集成,以提高系统的安全性。

调度策略: Android可能会使用不同的调度策略,以适应移动设备的性能和电源管理需求。

库的替换:好像glibc这些也都换了。

=====================================

大部分都是应用层。Binder是一个重头,因为涉及到接口。其他了解就行,真用到了再去看也可以。

Tee学习(TODO)-CSDN博客

  

3 驱动层的变化。(部分内容来自GPT)

Linux以前是标准的ioctl接口,Android改成了HAL接口,重要实现都切到了user space,用JNI封装。这些都要很了解。此外电源管理机制,还有Binder机制要看一下。

内核版本: Linux驱动接口: Linux驱动接口通常是为通用Linux内核设计的,支持各种硬件架构和设备类型。Linux内核在不同的发行版和版本中可能会有一些变化,但整体上是相对一致的。 Android驱动接口: Android使用了经过修改的Linux内核,因此Android驱动接口可能在某些方面与标准的Linux内核驱动接口略有不同。Android还可能引入一些额外的特定于移动设备的驱动需求。

电源管理: Linux驱动接口: Linux提供了通用的电源管理框架,驱动可以利用这些机制进行设备电源的管理。电源管理策略可能因硬件和内核配置而异。 Android驱动接口: Android对电源管理有其专有的需求,引入了Wakelocks等机制,以便更好地适应移动设备的电源管理和唤醒状态。

进程间通信(IPC): Linux驱动接口: 通常情况下,Linux驱动接口的设计并不直接涉及进程间通信,因为它主要关注设备与内核的交互。 Android驱动接口: Android引入了Binder机制,用于进程间通信。这对于Android中各种组件的通信非常重要,例如Activity、Service和BroadcastReceiver。

设备节点和HAL层: Linux驱动接口: 在标准Linux系统中,设备节点通常位于/dev目录下,用户空间可以通过这些设备节点与驱动进行通信。 Android驱动接口: Android引入了硬件抽象层(HAL),这是一个在用户空间和驱动之间的接口层,用于将Android系统与底层硬件驱动隔离开来。HAL层提供了标准接口,使得不同设备的驱动可以以相似的方式与Android系统进行交互。

调度策略: Linux驱动接口: Linux内核使用通用的进程调度策略,适用于各种设备和场景。 Android驱动接口: Android可能对调度策略进行定制,以适应移动设备的特殊需求,例如更好的响应性和电源管理。

驱动总览:

=====================================

这部分是重头,尤其是HAL层的差异,改的挺大的,必须要懂,而且要很懂。然后Android驱动层的一些实现,FrameBuffer(貌似现在换了),V4L2,ALSA,USB的gaeget框架,可能都要看看。当然,后面这部分也是Linux平台的玩法,区别不大。 

Android的硬件接口HAL-CSDN博客

  
4 安卓运行环境增加的命令

am activity管理器,启动activity等。直接管理activity的原因可能还是为了调试方便。(猜测)

pm package管理器。这个没啥好多说的。

svc 服务管理器。和linux标准的service有点接近,但是可以管理的是Android的特定服务,比如蓝牙,wifi等等。

input 模拟输入,主要应该还是用在调试方面。(搞外挂利器?)

getprop/setprop 以前在路由器上,这一套要单独实现,就是TR069,SNMP之类,现在谷歌整体给你实现了。轻松很多。在嵌入式开发中,这个是大头。

settings 这个说的主要是设置android。但是和上面的有什么区别呢?还是看了下GPT,setting主要修改和用户界面相关的东西,主要是app领域。getprop/setprop则更广,包含一些系统底层属性,需要的权限也更高,有些要root权限。貌似在嵌入式开发中,主要还是后者。

安卓平台在本地也集成了一个数据库,有点类似SQLite。当然,这个就是爱用不用了。

getevent 获取本地事件。nandread 读取nand数据。

最后有别于一般用的busybox,安卓用的toolbox,常用命令大同小异。

=================================================

要点有两个,一个是通过getprop/setprop给adb调试接口,另一个是用getevent,inputs去做定位分析,也都不是太难。其他的知道怎么用就行了。

  

5 用户层差异

主要就是运行的文件系统,一些重要的守护进程,然后一些工具的了解。

守护进程列表:

安卓启动流程:

文件结构

重要服务的位置:

文件系统差异(来自GPT)

应用和用户数据: Android: Android 将应用和用户数据存储在 /data 分区中。每个应用程序都有自己的私有数据目录,其中包含其数据和设置。例如,应用程序的数据库、缓存和共享首选项通常存储在 /data/data/<package_name> 目录下。 嵌入式 Linux: 在一般的嵌入式 Linux 系统中,应用程序的数据和设置通常存储在 /usr、/var 或其他指定目录中。

系统文件和可执行文件: Android: Android 的系统文件和可执行文件通常存储在 /system 分区中。这包括 Android 操作系统的核心文件、系统应用和一些系统级别的设置。 嵌入式 Linux: 一般的嵌入式 Linux 系统的系统文件和可执行文件可能分散在不同的目录中,通常包括 /bin、/sbin、/lib 等。

可变数据和缓存: Android: 可变数据和缓存通常存储在 /cache 分区中。这包括一些临时文件和缓存,可能会在系统启动时被清理。 嵌入式 Linux: 一般的嵌入式 Linux 系统可能将临时文件和缓存存储在 /tmp 目录下。

外部存储: Android: 外部存储通常映射到 /sdcard,用于存储用户的媒体文件、下载内容等。 嵌入式 Linux: 嵌入式 Linux 系统也可以使用外部存储,但其挂载点和目录结构可能不同,具体取决于设备和系统定制。

硬件相关文件: Android: Android 中可能包含一些硬件相关的文件和节点,如 /dev 目录下的设备节点,用于与硬件交互。 嵌入式 Linux: 嵌入式 Linux 系统也有 /dev 目录,但硬件节点的命名和数量可能根据系统的硬件配置而变化。

=======================================

和第4点差不多,没什么难度,用两次熟悉就可以了,细节要用的时候知道怎么查就行了。

Android系统目录介绍_android 目录-CSDN博客

  

6 源码结构

看起来好像使用envsetup.sh,lunch还有make就够了。但是还是要深入了解一下。

这部分核心要点一个是如何新增设备,另一个是如何新增一个app。最后就是怎么在启动脚本里面加东西。

安卓的编译加速使用了CCache,我在之前公司曾经建议使用这玩意 ,不过后面被否了。。。

还有一个要了解的就是Android.bp。其实本质就是cmake那种东西。。。

============================================

这个也算次重点吧。主要是要懂编译环境,各个部分怎么生成的。要懂怎么增加一个设备,或者怎么增加一个App到编译环境。

CMake小结-CSDN博客

Android SDK学习(TODO)-CSDN博客

AOSP系列—阅读源码并熟悉AOSP目录结构_aospxref-CSDN博客

  

7 Fastboot

也就是俗称的刷机模式。是一个Android特有的工具,在Linux上没有。Android通过特定手段进入该模型,上位机配合一个exe文件。实现操作固件的一些功能。

在我看来本质上就是对bootloader的一个封装,好像官方名也叫bootloader interface, 提供的功能也是uboot命令行的那些,分区,升级,刷固件,主备分区管理,系统变量的设置。常规嵌入式开发中,规划分区也是很重要的工作,貌似Android不能修改分区。

里面有Recovery模式和Fastboot模式,一个主要专注系统恢复,一个功能更全面。

=====================================================

如果用过uboot的话,看一下用法即可。

 
8 调试方法的学习

主要是ADB,这个比较简单,之前有写过。可能有一些细节,以后用到再说吧。

=====================================================

虽然用的很多,但是没什么难的。

ADB的使用-CSDN博客

 

9 平台特性的学习

主要是硬件平台的特性。

======================================================

这个也是重点,毕竟到什么山头唱什么歌,高通的,瑞芯微的,还是谁的,都要仔细学习。

 

 

就写这么多吧,还有的看到再写写。虽然说换汤不换药,本质核心还是编程能力。懂不懂这个汤可能就是会不会失业,运气好工资一个月差几十K也都有可能。所以还是学学吧。

 

 

 

参考资料:

Embedded Android

ChatGPT

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

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

相关文章

【C语言】linux内核generic_xdp_tx

一、中文注释 /* 在执行通用XDP时&#xff0c;我们必须绕过qdisc层和网络挖掘点&#xff0c;* 以匹配驱动内XDP的行为。*/ void generic_xdp_tx(struct sk_buff *skb, struct bpf_prog *xdp_prog) {struct net_device *dev skb->dev; // 获取skb对应的网络设备struct netd…

面试高频率问答题目

索引&#xff1a; 主键索引&#xff1a;表的id &#xff08;唯一 且 不能为空&#xff09; 唯一索引&#xff1a;表User 假设有account 字段 &#xff0c;用户名不重复 &#xff08;唯一 可以为空&#xff09; 复合索引&#xff1a;where() 的条件 用户名&#xff0c;密码 …

MySQL:函数

提醒&#xff1a; 设定下面的语句是在数据库名为 db_book里执行的。 创建user_info表 注意&#xff1a;pwd为密码字段&#xff0c;这里使用了VARCHAR(128)类型&#xff0c;为了后面方便对比&#xff0c;开发项目里一般使用char(32)&#xff0c;SQL语句里使用MD5加密函数 USE db…

【博图TIA-Api】通过Excel自动新建文件夹和导入FB块

【博图TIA-Api】通过Excel自动新建文件夹和导入FB块 说明思路准备获取Excel表格内文件名和FB块名等信息新建文件夹部分筛分获取的文件夹数据&#xff0c;去掉重复内容创建文件夹 导入FB块导出FB块的xml文件查找需要放置的文件夹导入块 说明 续上一篇文章&#xff0c;这次是根据…

多线程 --- [ 线程池、线程安全、其他常见的锁 ]

目录 1. 线程池 模块一&#xff1a;线程的封装 模块二&#xff1a;线程池的封装 模块三&#xff1a;互斥量的封装 (RAII风格) 模块四&#xff1a;任务的封装 模块五&#xff1a;日志的封装 模块六&#xff1a;时间的封装 模块六&#xff1a;主函数 模块七&#xff1a…

备战蓝桥杯---状态压缩DP进阶题1

我们来看一看一道比较难的问题&#xff08;十分十分的巧妙&#xff09;&#xff1a; 显然我们应该一行一行放&#xff0c;又竖的会对下一行产生影响&#xff0c;我们令横着放为0&#xff0c;竖着放的上方为1. 对于下一行&#xff0c;前一行放1的下面为0&#xff0c;但是会出现…

前端【技术类】资源学习网站整理(那些年的小网站)

学习网站整理 值得分享的视频博主&#xff1a;学习网站链接 百度首页的资源收藏里的截图&#xff08;排列顺序没有任何意义&#xff0c;随性而已~&#xff09;&#xff0c;可根据我标注的关键词百度搜索到这些网站呀&#xff0c;本篇末尾会一一列出来&#xff0c;供大家学习呀 …

彻底搞懂回溯算法(例题详解)

目录 什么是回溯算法&#xff1a; 子集问题&#xff1a; 子集问题II(元素可重复但不可复选): 组合问题&#xff1a; 组合问题II(元素可重复但不可复选): 排列问题&#xff1a; 排列问题II(元素可重复但不可复选): 什么是回溯算法&#xff1a; 「回溯是递归的副产品&…

leetcode hot100 每日温度

在本题中&#xff0c;我们是通过单调栈来解决的&#xff0c;因为我们采用了栈的数据结构&#xff0c;并且&#xff0c;栈内存储的元素是单调的。 本题我们考虑&#xff0c;将气温数组元素的下标存入栈中&#xff0c;首先初始化要把0放入&#xff0c;0是下标的意思。然后我们拿…

华为HCIP Datacom H12-821 卷4

1.单选题 下面哪些策略或工具不能够应用于 OSPF: A、access-list B、prefix-list C、route- Policy D、as-path filter 正确答案&#xff1a; D 解析&#xff1a; as-path-filter命令用来创建AS路径过滤器&#xff0c;OSPF属于IGP协议&#xff0c;不涉及到AS号。 2.单选题…

【python基础学习05课_for循环以及双重for循环】

FOR循环 一、认识循环-while 1、循环条件不能超出列表长度 当i 1&#xff0c;while i < len(lst1) 时&#xff0c;i 3后, 打印print&#xff08;lst[3]&#xff09;小宋老师&#xff0c; 继续1, i 4, 4不小于 len(lst1)&#xff0c;打破循环。 2、循环条件超出列表长度报错…

latex报错I was expecting a `,‘ or a `}‘的解决办法

解决办法——经过检查在ref22后面缺少一个逗号 总结 当你在使用LaTeX时遇到“I was expecting a , or a }”这样的错误&#xff0c;这通常意味着LaTeX在解析你的代码时&#xff0c;预期在某个位置看到一个逗号&#xff08;,&#xff09;或一个大括号&#xff08;}&#xff09;…

每日一题 2369

2369. 检查数组是否存在有效划分 题目描述&#xff1a; 给你一个下标从 0 开始的整数数组 nums &#xff0c;你必须将数组划分为一个或多个 连续 子数组。 如果获得的这些子数组中每个都能满足下述条件 之一 &#xff0c;则可以称其为数组的一种 有效 划分&#xff1a; 子数…

STM32 串口通信

串口发原理 在stm32每个串口内部有发送寄存器和发送移位寄存器。 当调用HAL_UART_Transmit 时&#xff0c;cpu会将发送的数据放入发送寄存器中。发送移位寄存器会将数据转换成电平的高低&#xff0c;从TX发出。 1、轮询模式配置、发送与接收 轮询模式时cpu会不断检测发送数…

嵌入式中汇编语言的基本实现

大家好&#xff0c;今天给大家分享&#xff0c;GNU汇编的语法。 第一&#xff1a;汇编简介 GNU 汇编语法适用于所有的架构&#xff0c;并不是 ARM 独享的&#xff0c;GNU 汇编由一系列的语句组成&#xff0c; 每行一条语句&#xff0c;每条语句有三个可选部分&#xff0c;如下…

小白学视觉 | 详解遗传算法 GA(Python实现代码)

本文来源公众号“小白学视觉”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;详解遗传算法 GA&#xff08;Python实现代码&#xff09; 转自&#xff1a;机器之心 英文&#xff1a;www.analyticsvidhya.com/blog/2017/07/introduc…

在线上传解压PHP文件代码,压缩/压缩(网站一键打包)支持密码登录

在线上传解压PHP文件代码&#xff0c;压缩/压缩(网站一键打包)支持密码登录 资源宝分享&#xff1a;www.httple.net 如果你没有主机控制面板这个是最好选择&#xff0c;不需要数据库&#xff0c;上传当控制面板使用&#xff0c;无需安装任何扩展&#xff0c;安全高&#xff0c;…

重拾前端基础知识:CSS

重拾前端基础知识&#xff1a;CSS 前言选择器简单选择器属性选择器组合选择器 插入CSS内嵌样式&#xff08;Inline Style&#xff09;内部样式&#xff08;Internal Style&#xff09;外部样式&#xff08;External Style&#xff09; 层叠颜色背景颜色文本颜色RGB 颜色HEX 颜色…

ESD管 uClamp3331ZA、AZ5A83-01B 、AZ8523-01B国产替代ESD0321CW

上海雷卯ESD二极管 ESD0321CW替代国外品牌型号uClamp3331ZA、AZ5A83-01B 、AZ8523-01B&#xff0c;参数对比如下&#xff1a; 判断ESD二极管是否可以替代需注意的几点&#xff1a; 1. VRWM 是否接近 2. 抗静电能力是否接近&#xff1b; 3. VBR 是否接近&#xff1b; 4. IPP…

Julia语言中的位运算符、赋值运算符、算术运算符

算术运算符 # 使用基本的赋值运算符 a 10 println("a 的初始值是: $a") # 使用加法赋值运算符 a 5 println("a 加上 5 后的值是: $a") # 使用减法赋值运算符 - a - 3 println("a 减去 3 后的值是: $a") # 使用乘法赋值运算符…