1. 程式人生 > >定製Android系統開發之一——提供介面的方式

定製Android系統開發之一——提供介面的方式

何為定製Android系統?就是在特定的硬體上,移植上Android作業系統,並修改原生Android系統以提供給定製的APP操作定製硬體的方法。

所以,定製Android的主要工作有以下三部分:

  1. 適配硬體;
  2. 製作介面;
  3. 定製APP;

一般而言,定製的硬體會採用方案商提供的穩定方案,例如全至的a20方案、a31s方案、r16方案、飛思卡爾的i.MX6方案等等。這些方案拿過來,是一個類似於平板的開發板,在其上Android系統是能夠跑起來的。然後就要根據自身的需求,把一些外圍硬體適配上去,例如你要做一個音箱類的產品,你可能需要適配上牛掰的DSP,PA等等,如果你要做一個車機類的產品,你可能要適配上一個MCU,適配上倒車攝像頭,如果是要做一個電視盒子,紅外或者2.4g是必須的。這就是適配硬體所要做的工作。

定製的硬體產品一般都會應用於一些特殊的場景下,那麼肯定會需要定製一個APP來和使用者進行互動,完成使用者所需要的功能。因為硬體是定製的,很多功能原生的Android系統並沒有提供介面來操作,這就需要開發人員對Android進行修改,把操作硬體的方法暴露給APP。這就是我所做的工作。這部分的工作處於應用開發和驅動開發之間,我姑且稱之為Android中介軟體的開發。

開發驅動的同事一般會提供給我一些裝置節點,通過讀寫這些裝置節點就可以操作外設。一般來說,操作裝置節點的操作會用C/C++來實現。但是對於製作APP的同事,他們會習慣於使用Java這類高階語言,所以對於Android中介軟體的開發者,就要藉助於JNI這一工具,構建連線C/C++和Java的橋樑。

在我的開發過程中,我使用過以下幾種方法來提供操作硬體的介面:

  1. 提供JNI原始碼;

提供JNI原始碼是最裸的一種方式。一般在除錯一個硬體功能的時候,我會編寫一個簡單的Demo APP。除錯成功之後,我曾直接把Demo APP的原始碼提供給APP開發者。這樣,我的工作是最少的,只要除錯完,就算是大功告成了。但是對於開發APP的同事來說,這種提供介面的方式需要他們具備一定的JNI開發知識,這就無形中增加了他們的工作量。在我看來,APP開發應該講經歷集中於與使用者的互動上,而不是具體的功能的實現細節上。所以這種方法並不好。

另外一方面,因為介面的原始碼檔案肯定不止一個,那麼原始碼的版本控制也是一個問題。

  1. 提供JNI編譯的庫檔案;

具體來說,提供庫檔案有兩種方式。一種是給APP提供JNI編譯之後的庫檔案,由他們整合到APP中。這種方式只是簡化了版本控制的問題(因為只有一個庫檔案),對APP開發者的要求沒有減少。另一種是把JNI在原始碼的環境中編譯,編譯完之後庫檔案就在/system/lib/下面了。APP只需執行在特定韌體中就行了。這種方式的版本控制問題更嚴重。因為採用這種方式,在庫函式載入的時候會檢查APP中宣告的介面函式是否和當前庫中的函式一一對應,不對應會直接崩掉。所以,如果在某個版本之後,APP新增了一個介面,那麼這個新的APP就不能執行在老的韌體中了。

  1. 編寫後臺執行的服務;

為了解決上面的問題,可以編寫一個Service。由這個Service來和APP進行互動。因為Service是內建在韌體內部的,所以這個Service和JNI不會有版本匹配的問題。而且互動的過程全部都是通過Java實現的(APP開發者最開心了)。APP和Service是執行與不同程序中的,Android的IPC一般有兩種方式,一種是通過系統廣播,一種是通過AIDL。前者的優點是使用簡單,呼叫不同的介面只需傳送不同的廣播就行了,返回值則通過接收廣播來獲取。它的缺點通過廣播調介面的實時性不能保證。後者則編寫難度較大。各位可以找一下遠端服務的程式碼看看,為了調一個介面,需要編寫很多行的程式碼,這個也是APP的開發人員不想看到的。

其實IPC還有另外一種方式,就是通過socket。這種方式我沒有用過,因為其程式碼編寫的量也不少。

  1. 增加系統服務;

這種方式在我目前看來,是最好的方法。為什麼好呢?下次再說。已經快一點了,明天還要上班。

相關推薦

定製Android系統開發之一——提供介面方式

何為定製Android系統?就是在特定的硬體上,移植上Android作業系統,並修改原生Android系統以提供給定製的APP操作定製硬體的方法。 所以,定製Android的主要工作有以下三部分: 適配硬體; 製作介面; 定製APP; 一般而言,定製的

定製Android系統開發之四——系統服務實現的分析

在上一篇博文中,我給出了實現系統服務的步驟,這篇博文則將分析一下,為什麼這樣的實現方式能夠實現客戶端/伺服器模式。 RadioManagerService 首先來看一下RadioManagerService是如何建立的。 如果我沒有記錯的話,Syste

定製Android系統開發之三——跟著我實現系統服務

在這篇博文中,我將一步一步建立一個SystemService。 這個系統服務是用於控制收音機的,名字就叫做RadioManagerService。 新建IRadioManager.aidl; 在framework/base/core/java/amdr

定製Android系統開發之八——實現從JNI到Java的回撥

前面已經實現了APP->xxxManager->xxxManagerService->jni的函式呼叫,這篇博文就來實現jni->xxxManagerService的回撥。 使用環境 我先說一下我的應用環境吧。我在有一個對裝置節點

(轉)android系統開發 AP 和 BP 簡要說明

java 純c hal window 用戶界面 部分 上下 arm 配置 手機的AP和BP根據上下文可以指代硬件和軟件兩種意思. 1) 大多數的手機都含有兩個處理器。操作系統、用戶界面和應用程序都在Application Processor(AP)上執行,AP一般采用AR

Linux/Android系統開發 串列埠驅動原始碼,FIFO模式

該驅動適用於採用linux和android系統平臺的C/C++串列埠開發。 FIFO傳送模式:建立資料傳送FIFO佇列,在多工資料傳送情境下,既能保證資料傳送任務能夠得到執行,又可解決資料傳送衝突問題。 select接收資料:有效監聽串列埠接收資料,提高執行效率,減少出錯

使用Remix OS作為X86 Android系統開發OS

源起 在開發過程中,有需要X86上面的方案,因為Nexus Player還沒有到,身邊又沒有其他Intel Android裝置,想到PC就是X86(以及X86_64),為了趕時間,因此決定使用筆記本(

Android系統開發必備知識

本人最近協助客戶在做android系統中,發現一般的odm或oem廠商都會對android的系統一些預設值做修改。例如,修改預設setting的顯示方式,修改預設輸入法等,本人最近幫客戶修改輸入法時,根據程式碼查了半天,最後在google上搜一下啊,發現各位大神已經有

Android系統開發—對View的clipChildren,clipToPadding,importantForAccessibility屬性的理解

今天在查閱android 8.1的Launcher3時,看到了launcher.xml下設定了android:clipChildren=”false”,android:importantForAccessibility=”no”,android:clipToPa

Android系統開發之燒錄開發

一.環境配置: 開發板接上USB線和串列埠線,開啟DNW並配置好串列埠,給開發板上電後按reset鍵,緊接著按鍵盤的空格鍵,此時可輸入如下命令. 1. fdisk -c 0 2. ext3format mmc 0:3 3. fastboot 如果PC機提示發現新硬體

工作感悟之Android系統開發入門

    從離開學校到工作快兩年了,這期間感悟良多,喜悅、悲傷、希望、失望、、、總的說來在曲折中不斷前進,相信乘風破浪會有時,直掛雲帆濟滄海。     從事Android有些偶然因素,原始打算做WPF相

【 專欄 】- Android系統開發和架構研究

Android系統開發和架構研究 在這個專欄,我會分享Android系統開發實踐中的心得體會,對系統架構實現演變的理解, 特別是Android framework,native 和 kernel的相關研究。我也會收集我看到他人的優

Linux/Android系統開發 串列埠引數配置原始碼 serial.c/serial.cpp

該驅動適用於採用linux和android系統平臺的C/C++開發。 用於配置串列埠相關引數:埠選擇、阻塞非阻塞、波特率、停止位、資料位、校驗位等。 注:需要系統開啟串列埠操作許可權,否則配置失敗。 本驅動在MTK8735平臺上驗證測試,其它平臺修改串列埠埠名稱即可。

Android系統篇(一)——建立Android系統開發環境

《深入解析Android5.0系統》 一書筆記 在開始研究Android系統之前,我們要準備好一些開發的資料,比如Ubuntu,原始碼,開發資料等,Android系統本身來說,非常的龐大,應用使用的是JAVA語言,底層使用C/C++,所以,如果條件允許

Android 系統開發】 編譯 Android檔案系統 u-boot 核心 並燒寫到 OK-6410A 開發板上

本篇文章中用到的工具原始碼下載 : -- 光碟所含內容 : Android 引導 u-boot 原始碼, Android 核心 原始碼, Android 系統原始碼, 交叉編譯工具鏈;各項操作說明 : -- 編譯環境 : 編譯原始碼 (u-boot, 核心, Android

定製Android系統Android O 預設允許應用彈窗申請許可權

需求:Android 應用在 6.0 以後?就需要動態申請許可權了,那些寫在 AndroidManifest.xml 中的許可權在應用執行時會彈窗申請。如果應用跑在不方便與終端使用者做互動的場景,例如攝像頭等,或者單純地不希望應用再彈窗申請許可權,而是預設授予應

Android移動開發的幾種方式

目錄 1.Android App開發方式 1.1 Native App (原生開發) 使用Java、C、C++進行開發App稱之為Native App; 1.2 Web App Web App就是使用前端技術(Ht

android 系統相簿呼叫,各方式返回的URI總結

請求系統相簿有三個Action: 下面會詳細介紹他們在不同版本系統中的測試結果區別: 測試系統:左圖->Android 7.0官方模擬器 ;   右圖-> Android 5.1的fl

Android系統開發之七:新增Android Native Service方法

一、 Android Service 介紹 Android 的 Service 分為兩種: Android Service 和 Native Service 。 Android Service :又稱為 Java Service ,是實現在框架層( framework )裡

定製Android系統Android 7.1 預設的 USB 配置模式,預設的 usb debug 配置

需求:在 user 版中,插入 usb 連線電腦時,預設只有 mtp (傳檔案)功能,關閉 adb 功能。在 eng 版中,插入 usb 連線電腦時,預設開啟 adb 功能,且兼具 mtp (傳檔案)功能。 提示: Android 4.4 之後貌似修改了整