通過之前的一篇文章,我們了解了 Android中的Binder機(jī)制和遠(yuǎn)程服務(wù)調(diào)用 在這篇文章中主要介紹了Android中的應(yīng)用在調(diào)用一些系統(tǒng)服務(wù)的時(shí)候的原理,那么接下來就繼續(xù)來介紹一下如何通過編譯Android源碼來手動(dòng)添加一個(gè)系統(tǒng)服務(wù),讓編譯之后的Android系統(tǒng)中存在我們的這個(gè)服務(wù),每個(gè)應(yīng)用都可以調(diào)用。但是本文得先介紹一下如何編寫一個(gè)簡單的驅(qū)動(dòng)程序,先介紹了驅(qū)動(dòng)程序,然后在通過JNI讓framework層訪問這個(gè)驅(qū)動(dòng)程序,在通過注冊(cè)服務(wù)來封裝這個(gè)功能,最后在把這個(gè)服務(wù)添加到系統(tǒng)中,實(shí)現(xiàn)上層應(yīng)用通過訪問這個(gè)服務(wù)來操作驅(qū)動(dòng),當(dāng)然你必須要掌握和了解 :
Android中如何編譯源碼(可以去http://www.wjdiankong.cn 中找到這篇文章)
如果沒有編譯過Android源碼的話,下面的內(nèi)容將會(huì)看的很吃力的。
聲明:本文內(nèi)容參考羅升陽的書籍:《Android系統(tǒng)源代碼情景分析》 如果想了解更詳細(xì)的內(nèi)容建議購買此書,大神的博客地址:http://blog.csdn.net/luoshengyang
一、編寫內(nèi)核驅(qū)動(dòng)程序
這里不會(huì)介紹內(nèi)核驅(qū)動(dòng)小程序內(nèi)容,因?yàn)闆]什么好說的,就是Linux系統(tǒng)api,然后在了解一下驅(qū)動(dòng)的概念即可。這里主要介紹操作步驟,關(guān)于代碼后面我會(huì)給出下載地址,感興趣的同學(xué)可以自己詳細(xì)看一下。
第一步:進(jìn)入源碼內(nèi)核目錄創(chuàng)建驅(qū)動(dòng)程序目錄
cd kernel/drivers
在這個(gè)目錄中,我們新建一個(gè)我們自己的驅(qū)動(dòng)目錄freg:
看到這個(gè)目錄中有很多系統(tǒng)的驅(qū)動(dòng)程序。然后就在這個(gè)freg目錄中編寫驅(qū)動(dòng)程序:
這里的freg.c就是驅(qū)動(dòng)程序,這里,我們不會(huì)為真實(shí)的硬件設(shè)備編寫內(nèi)核驅(qū)動(dòng)程序。為了方便描述為Android系統(tǒng)編寫內(nèi)核驅(qū)動(dòng)程序的過程,我們使用一個(gè)虛擬的硬件設(shè)備,這個(gè)設(shè)備只有一個(gè)4字節(jié)的寄存器,它可讀可寫。
第二步:配置驅(qū)動(dòng)程序編譯信息
在freg目錄中新增Kconfig和Makefile兩個(gè)文件,其中Kconfig是在編譯前執(zhí)行配置命令make menuconfig時(shí)用到的:
而Makefile是執(zhí)行編譯命令make是用到的:
第三步:將驅(qū)動(dòng)程序到系統(tǒng)配置中
上面配置完了驅(qū)動(dòng)程序自身的編譯信息,如果想把這個(gè)驅(qū)動(dòng)程序編譯到內(nèi)核中,還需要配置內(nèi)核信息,修改arch/arm/Kconfig和drivers/kconfig兩個(gè)文件,在menu "Device Drivers"和endmenu之間添加一行:
source "drivers/hello/Kconfig"
這樣,執(zhí)行make menuconfig時(shí),就可以配置hello模塊的編譯選項(xiàng)了。修改drivers/Makefile文件,添加一行:
第四步:編譯內(nèi)核驅(qū)動(dòng)
在內(nèi)核目錄下運(yùn)行命令:make menuconfig
"Device Drivers" => "First Android Drivers"選項(xiàng),設(shè)置為y:
這樣就編譯驅(qū)動(dòng)程序成功了,下面就開始編譯內(nèi)核源碼
第五步:啟動(dòng)模擬器檢查驅(qū)動(dòng)程序
到源碼的根目錄中,運(yùn)行命令:
emulator -kernel ./kernel/common/arch/arm/boot/zImage &
有的同學(xué)可能會(huì)遇到這個(gè)錯(cuò)誤,不過沒關(guān)系,咋們?cè)谶\(yùn)行一下腳本文件:
如果運(yùn)行成功的話,就可以看到模擬器了:
這時(shí)候,我們使用adb shell命令查看驅(qū)動(dòng)程序的功能:
首先驅(qū)動(dòng)程序肯定是存放在/dev目錄中的,如果要進(jìn)行操作驅(qū)動(dòng)程序,需要到/proc目錄中找到指定驅(qū)動(dòng)程序,然后可以使用echo命令寫入數(shù)據(jù),cat命令讀取數(shù)據(jù)。
到這里,我們就成功的編寫了虛擬驅(qū)動(dòng)程序,并且編譯到內(nèi)核中,通過命令訪問也是測試通過了。這里采用的是系統(tǒng)提供的方法和驅(qū)動(dòng)程序進(jìn)行交互,也就是通過proc文件系統(tǒng)和devfs文件系統(tǒng)的方法。
二、編寫內(nèi)核驅(qū)動(dòng)訪問程序
有了上面的驅(qū)動(dòng)程序內(nèi)容,下面為了更好的方便操作這個(gè)驅(qū)動(dòng),我們可以在編寫一個(gè)簡單的C語言來直接訪問這個(gè)驅(qū)動(dòng),而操作驅(qū)動(dòng)的方法也很簡單,使用open方法即可。
第一步:建立系統(tǒng)程序目錄
進(jìn)入/external/目錄,新建一個(gè)freg程序目錄:
第二步:編寫操作驅(qū)動(dòng)程序
這里的代碼比較簡單,在main函數(shù)中直接使用open打開驅(qū)動(dòng),然后就可以直接讀寫操作了
第三步:建立編譯腳本,然后編譯程序
在程序的同一目錄下,創(chuàng)建編譯腳本:Android.mk文件
參照如何單獨(dú)編譯Android源代碼中的模塊一文,使用mmm命令進(jìn)行編譯:
mmm ./external/freg
編譯成功后,就可以在out/target/product/gerneric/system/bin目錄下,看到可執(zhí)行文件hello了。
重新打包Android系統(tǒng)文件system.img:
make snod
這樣,重新打包后的system.img文件就包含剛才編譯好的hello可執(zhí)行文件了。
第四步:運(yùn)行模擬器
運(yùn)行模擬器的命令上面已經(jīng)介紹了,這里就不在演示了,運(yùn)行成功之后,就可以使用/system/bin/hello可執(zhí)行程序來訪問Linux內(nèi)核驅(qū)動(dòng)程序:
系統(tǒng)命令都是存放在/system/bin目錄下的,我們可以看到找到我們編譯的讀取驅(qū)動(dòng)的系統(tǒng)命令程序freg,然后可以運(yùn)行這個(gè)程序進(jìn)行驅(qū)動(dòng)的讀寫操作了。到此就完成了使用C程序來操作驅(qū)動(dòng)了。
項(xiàng)目案例代碼:
http://download.csdn.net/detail/jiangwei0910410003/9642364
三、總結(jié)
本文介紹了如何通過編譯Android內(nèi)核源碼,來手動(dòng)的編寫一個(gè)簡單的虛擬驅(qū)動(dòng)程序,然后在寫一個(gè)簡單的C程序訪問這個(gè)驅(qū)動(dòng),后續(xù)將會(huì)介紹如何在Framework層通過JNI來訪問這個(gè)驅(qū)動(dòng)。
手機(jī)看文章有點(diǎn)費(fèi)勁,可以進(jìn)入網(wǎng)頁版:http://www.wjdiankong.cn
關(guān)注微信公眾號(hào):編碼美麗 (微信號(hào):jiangwei0910410003)
本文為企業(yè)推廣,本網(wǎng)站不做任何建議,僅提供參考,作為信息展示!
推薦閱讀:益陽在線
網(wǎng)友評(píng)論
請(qǐng)登錄后進(jìn)行評(píng)論|
0條評(píng)論
請(qǐng)文明發(fā)言,還可以輸入140字
您的評(píng)論已經(jīng)發(fā)表成功,請(qǐng)等候?qū)徍?/p>
小提示:您要為您發(fā)表的言論后果負(fù)責(zé),請(qǐng)各位遵守法紀(jì)注意語言文明