通過之前的一篇文章,我們了解了 Android中的Binder機制和遠程服務調用 在這篇文章中主要介紹了Android中的應用在調用一些系統服務的時候的原理,那么接下來就繼續來介紹一下如何通過編譯Android源碼來手動添加一個系統服務,讓編譯之后的Android系統中存在我們的這個服務,每個應用都可以調用。但是本文得先介紹一下如何編寫一個簡單的驅動程序,先介紹了驅動程序,然后在通過JNI讓framework層訪問這個驅動程序,在通過注冊服務來封裝這個功能,最后在把這個服務添加到系統中,實現上層應用通過訪問這個服務來操作驅動,當然你必須要掌握和了解 :
Android中如何編譯源碼(可以去http://www.wjdiankong.cn 中找到這篇文章)
如果沒有編譯過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來訪問這個驅動。
手機看文章有點費勁,可以進入網頁版:http://www.wjdiankong.cn
關注微信公眾號:編碼美麗 (微信號:jiangwei0910410003)
本文為企業推廣,本網站不做任何建議,僅提供參考,作為信息展示!
推薦閱讀:益陽在線
網友評論
請登錄后進行評論|
0條評論
請文明發言,還可以輸入140字
您的評論已經發表成功,請等候審核
小提示:您要為您發表的言論后果負責,請各位遵守法紀注意語言文明