標籤:
通過之前的一篇文章,我們瞭解了 Android中的Binder機制和遠程服務調用 在這篇文章中主要介紹了Android中的應用在調用一些系統服務的時候的原理,那麼接下來就繼續來介紹一下如何通過編譯Android源碼來手動添加一個系統服務,讓編譯之後的Android系統中存在我們的這個服務,每個應用都可以調用。但是本文得先介紹一下如何編寫一個簡單的驅動程式,先介紹了驅動程式,然後在通過JNI讓framework層訪問這個驅動程式,在通過註冊服務來封裝這個功能,最後在把這個服務添加到系統中,實現上層應用通過訪問這個服務來操作驅動,當然你必須要掌握和瞭解 Android中如何編譯源碼 如果沒有編譯過Android源碼的話,下面的內容將會看的很吃力的。
聲明:本文內容參考羅昇陽的書籍:《Android系統原始碼情景分析》 如果想瞭解更詳細的內容非常建議購買此書
非常感謝羅神的這本書,給我帶來很多未知的知識,大神的部落格地址:http://blog.csdn.net/luoshengyang
一、編寫核心驅動小程式
這裡不會介紹核心驅動小程式內容,因為沒什麼好說的,就是Linux系統api,然後在瞭解一下驅動的概念即可。這裡主要介紹操作步驟,關於代碼後面我會給出,感興趣的同學可以自己詳細看一下。
第一步:進入源碼核心目錄建立驅動程式目錄
cd kernel/drivers
在這個目錄中,我們建立一個我們自己的驅動目錄freg:
看到這個目錄中有很多系統的驅動程式。然後就在這個freg目錄中編寫驅動程式:
這裡的freg.c就是驅動程式,這裡,我們不會為真實的硬體裝置編寫核心驅動程式。為了方便描述為Android系統編寫核心驅動程式的過程,我們使用一個虛擬硬體裝置,這個裝置只有一個4位元組的寄存器,它可讀可寫。
第二步:配置驅動程式編譯資訊
在freg目錄中新增Kconfig和Makefile兩個檔案,其中Kconfig是在編譯前執行配置命令make menuconfig時用到的:
而Makefile是執行編譯命令make是用到的:
第三步:將驅動程式到系統配置中
上面配置完了驅動程式自身的編譯資訊,如果想把這個驅動程式編譯到核心中,還需要配置核心資訊,修改arch/arm/Kconfig和drivers/kconfig兩個檔案,在menu "Device Drivers"和endmenu之間添加一行:
source "drivers/hello/Kconfig"
這樣,執行make menuconfig時,就可以配置hello模組的編譯選項了。修改drivers/Makefile檔案,添加一行:
第四步:編譯核心驅動
在核心目錄下運行命令:make menuconfig
"Device Drivers" => "First Android Drivers"選項,設定為y:
這樣就編譯驅動程式成功了,下面就開始編譯核心源碼
第五步:啟動模擬器檢查驅動程式
到源碼的根目錄中,運行命令:emulator -kernel ./kernel/common/arch/arm/boot/zImage &
有的同學可能會遇到這個錯誤,不過沒關係,咋們在運行一下指令檔:
如果運行成功的話,就可以看到模擬器了:
這時候,我們使用adb shell命令查看驅動程式的功能:
首先驅動程式肯定是存放在/dev目錄中的,如果要進行操作驅動程式,需要到/proc目錄中找到指定驅動程式,然後可以使用echo命令寫入資料,cat命令讀取資料。
到這裡,我們就成功的編寫了虛擬驅動程式,並且編譯到核心中,通過命令訪問也是測試通過了。這裡採用的是系統提供的方法和驅動程式進行互動,也就是通過proc檔案系統和devfs檔案系統的方法。
二、編寫核心驅動訪問程式
有了上面的驅動程式內容,下面為了更好的方便操作這個驅動,我們可以在編寫一個簡單的C語言來直接存取這個驅動,而操作驅動的方法也很簡單,使用open方法即可。
第一步:建立系統程式目錄
進入/external/目錄,建立一個freg程式目錄:
第二步:編寫操作驅動程式
這裡的代碼比較簡單,在main函數中直接使用open開啟驅動,然後就可以直接讀寫操作了
第三步:建立編譯指令碼,然後編譯器
在程式的同一目錄下,建立編譯指令碼:Android.mk檔案
參照如何單獨編譯Android原始碼中的模組一文,使用mmm命令進行編譯:
mmm ./external/freg
編譯成功後,就可以在out/target/product/gerneric/system/bin目錄下,看到可執行檔hello了。
重新打包Android系統檔案system.img:
make snod
這樣,重新打包後的system.img檔案就包含剛才編譯好的hello可執行檔了。
第四步:運行模擬器
運行模擬器的命令上面已經介紹了,這裡就不在示範了,運行成功之後,就可以使用/system/bin/hello可執行程式來訪問Linux核心驅動程式:
系統命令都是存放在/system/bin目錄下的,我們可以看到找到我們編譯的讀取驅動的系統命令程式freg,然後可以運行這個程式進行驅動的讀寫操作了。到此就完成了使用C程式來操作驅動了。
項目案例代碼:http://download.csdn.net/detail/jiangwei0910410003/9642364
三、總結
本文介紹了如何通過編譯Android核心源碼,來手動的編寫一個簡單的虛擬驅動程式,然後在寫一個簡單的C程式訪問這個驅動,後續將會介紹如何在Framework層通過JNI來訪問這個驅動。
更多內容:點擊這裡
關注公眾號,最新技術乾貨即時推送
Android系統篇之----編寫簡單的驅動程式並且將其編譯到核心源碼中