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.pswp.cn/news/715319.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715319.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715319.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

虛擬內存與mmap,brk

虛擬內存與mmap,brk 基本概念及相關術語 1.1 基本概念 虛擬內存使得應用程序認為它擁有連續的可用的內存&#xff08;一個連續完整的地址空間&#xff09;&#xff0c;而實際上&#xff0c;它通常是被分隔成多個物理內存碎片&#xff0c;還有部分暫時存儲在外部磁盤存儲器上&…

【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;但是會出現…

【Redis | 第九篇】一篇文章看懂Redis持久化機制

文章目錄 9.一篇文章看懂Redis持久化機制9.1Redis的兩種持久化機制9.1.1為什么有持久化&#xff1f; 9.2RDB機制9.2.1介紹9.2.2觸發機制&#xff08;1&#xff09;save命令觸發&#xff08;2&#xff09;bgsave命令觸發&#xff08;3&#xff09;自動觸發 9.2.3執行流程9.2.4優…

C++知識點總結(22):模擬算法真題 ★★★★☆《卡牌游戲》《移動距離》

一、卡牌游戲 1. 審題 題目描述 A , B , C A,B,C A,B,C 三人在玩一個卡牌游戲&#xff0c;規則如下&#xff1a; 游戲開始時&#xff0c; 3 3 3 人分別會得到若干張手牌, 每張牌上寫著 a&#xff0c;b&#xff0c;c 中某一個字母。手牌的順序嚴格按照輸入順序排列&#xff0c…

前端【技術類】資源學習網站整理(那些年的小網站)

學習網站整理 值得分享的視頻博主&#xff1a;學習網站鏈接 百度首頁的資源收藏里的截圖&#xff08;排列順序沒有任何意義&#xff0c;隨性而已~&#xff09;&#xff0c;可根據我標注的關鍵詞百度搜索到這些網站呀&#xff0c;本篇末尾會一一列出來&#xff0c;供大家學習呀 …

徹底搞懂回溯算法(例題詳解)

目錄 什么是回溯算法&#xff1a; 子集問題&#xff1a; 子集問題II(元素可重復但不可復選): 組合問題&#xff1a; 組合問題II(元素可重復但不可復選): 排列問題&#xff1a; 排列問題II(元素可重復但不可復選): 什么是回溯算法&#xff1a; 「回溯是遞歸的副產品&…

最小生成樹---Kruskal算法

最小生成樹定義&#xff1a; 給定一張邊帶權的無向圖 G(V,E)&#xff0c;其中 V 表示圖中點的集合&#xff0c;E 表示圖中邊的集合。 由 V 中的全部 n 個頂點和 E 中 n?1 條邊構成的無向連通子圖被稱為 G 的一棵生成樹&#xff0c;其中邊的權值之和最小的生成樹被稱為無向圖 G…

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、循環條件超出列表長度報錯…

JMeter元件和采樣器一覽

Apache JMeter是一個強大的開源負載測試工具&#xff0c;用于性能和功能測試。JMeter提供了豐富的元件和采樣器&#xff0c;使得它能夠模擬復雜的測試場景和高并發的用戶請求。以下是JMeter中常用的一些元件和采樣器的介紹和講解&#xff1a; 測試計劃元件 測試計劃&#xff0…

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; 子數…

PTA 1010 一元多項式求導

1010 一元多項式求導 (25分) C/C - 知乎 (zhihu.com) #include<stdio.h> int main(){ int x,n; scanf("%d %d",&x,&n); if(n0)printf("%d %d",0,0); //n0 說明是常數&#xff0c;不需要求導 else printf("%d %…

STM32 串口通信

串口發原理 在stm32每個串口內部有發送寄存器和發送移位寄存器。 當調用HAL_UART_Transmit 時&#xff0c;cpu會將發送的數據放入發送寄存器中。發送移位寄存器會將數據轉換成電平的高低&#xff0c;從TX發出。 1、輪詢模式配置、發送與接收 輪詢模式時cpu會不斷檢測發送數…