• 八方資訊網(wǎng)歡迎您!
    八方資訊網(wǎng)>商訊>正文

    Android編寫簡單的驅(qū)動(dòng)程序并且將其編譯到內(nèi)核中!

    2021-01-25 07:57:46 來源: 閱讀:-

    通過之前的一篇文章,我們了解了 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:

    Android編寫簡單的驅(qū)動(dòng)程序并且將其編譯到內(nèi)核中

    看到這個(gè)目錄中有很多系統(tǒng)的驅(qū)動(dòng)程序。然后就在這個(gè)freg目錄中編寫驅(qū)動(dòng)程序:

    Android編寫簡單的驅(qū)動(dòng)程序并且將其編譯到內(nèi)核中

    這里的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í)用到的:

    Android編寫簡單的驅(qū)動(dòng)程序并且將其編譯到內(nèi)核中

    而Makefile是執(zhí)行編譯命令make是用到的:

    Android編寫簡單的驅(qū)動(dòng)程序并且將其編譯到內(nèi)核中

    第三步:將驅(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"

    Android編寫簡單的驅(qū)動(dòng)程序并且將其編譯到內(nèi)核中

    Android編寫簡單的驅(qū)動(dòng)程序并且將其編譯到內(nèi)核中

    這樣,執(zhí)行make menuconfig時(shí),就可以配置hello模塊的編譯選項(xiàng)了。修改drivers/Makefile文件,添加一行:

    Android編寫簡單的驅(qū)動(dòng)程序并且將其編譯到內(nèi)核中

    第四步:編譯內(nèi)核驅(qū)動(dòng)

    在內(nèi)核目錄下運(yùn)行命令:make menuconfig

    Android編寫簡單的驅(qū)動(dòng)程序并且將其編譯到內(nèi)核中

    "Device Drivers" => "First Android Drivers"選項(xiàng),設(shè)置為y:

    Android編寫簡單的驅(qū)動(dòng)程序并且將其編譯到內(nèi)核中

    這樣就編譯驅(qū)動(dòng)程序成功了,下面就開始編譯內(nèi)核源碼

    第五步:啟動(dòng)模擬器檢查驅(qū)動(dòng)程序

    到源碼的根目錄中,運(yùn)行命令:

    emulator -kernel ./kernel/common/arch/arm/boot/zImage &

    Android編寫簡單的驅(qū)動(dòng)程序并且將其編譯到內(nèi)核中

    有的同學(xué)可能會(huì)遇到這個(gè)錯(cuò)誤,不過沒關(guān)系,咋們?cè)谶\(yùn)行一下腳本文件:

    Android編寫簡單的驅(qū)動(dòng)程序并且將其編譯到內(nèi)核中

    如果運(yùn)行成功的話,就可以看到模擬器了:

    Android編寫簡單的驅(qū)動(dòng)程序并且將其編譯到內(nèi)核中

    這時(shí)候,我們使用adb shell命令查看驅(qū)動(dòng)程序的功能:

    Android編寫簡單的驅(qū)動(dòng)程序并且將其編譯到內(nèi)核中

    首先驅(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程序目錄:

    Android編寫簡單的驅(qū)動(dòng)程序并且將其編譯到內(nèi)核中

    第二步:編寫操作驅(qū)動(dòng)程序

    這里的代碼比較簡單,在main函數(shù)中直接使用open打開驅(qū)動(dòng),然后就可以直接讀寫操作了

    Android編寫簡單的驅(qū)動(dòng)程序并且將其編譯到內(nèi)核中

    第三步:建立編譯腳本,然后編譯程序

    在程序的同一目錄下,創(chuàng)建編譯腳本:Android.mk文件

    Android編寫簡單的驅(qū)動(dòng)程序并且將其編譯到內(nèi)核中

    參照如何單獨(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)程序:

    Android編寫簡單的驅(qū)動(dòng)程序并且將其編譯到內(nèi)核中

    系統(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)

    Android編寫簡單的驅(qū)動(dòng)程序并且將其編譯到內(nèi)核中

    本文為企業(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ì)注意語言文明

    回到首頁 回到頂部
    八方資訊網(wǎng) 關(guān)于我們| 聯(lián)系我們| 招聘信息| XML地圖| 網(wǎng)站地圖TXT
    免責(zé)聲明:八方資訊網(wǎng)所有文字、圖片、視頻、音頻等資料均來自互聯(lián)網(wǎng),不代表本站贊同其觀點(diǎn),本站亦不為其版權(quán)負(fù)責(zé)。相關(guān)作品的原創(chuàng)性、文中陳述文字以及內(nèi)容數(shù)據(jù)龐雜本站無法一一核實(shí),如果您發(fā)現(xiàn)本網(wǎng)站上有侵犯您的合法權(quán)益的內(nèi)容,請(qǐng)聯(lián)系我們,本網(wǎng)站將立即予以刪除!
    Copyright © 2012-2019 http://www.quan28.cn, All rights reserved.
    主站蜘蛛池模板: 亚洲精品成人片在线播放| 成人精品视频99在线观看免费| 欧美日韩精品| 动漫精品专区一区二区三区不卡| 亚洲精品视频免费| 好湿好大硬得深一点动态图91精品福利一区二区| 国产成人精品一区二区三区免费| 亚洲一日韩欧美中文字幕欧美日韩在线精品一区二 | 国产精品一香蕉国产线看观看 | 精品性影院一区二区三区内射| 亚洲欧洲久久久精品| 精品久久久久国产免费 | 中文字幕久精品免费视频| 久久99精品久久久久久不卡| 中文字幕亚洲精品资源网| 99久久免费国产精品热| 国产精品福利自产拍在线观看 | 国产精品偷伦视频观看免费| 亚洲Av无码精品色午夜| 午夜精品久久久久久| 久久99亚洲综合精品首页| 国产精品无码午夜福利| 全球AV集中精品导航福利| 无码国产精品一区二区免费模式 | 亚洲视频精品在线| 青青草国产精品| avtt天堂网久久精品| 国内精品久久久久久99| 久久精品a亚洲国产v高清不卡| 少妇伦子伦精品无码STYLES| 亚洲国产精品一区二区第一页| 亚洲日韩国产精品乱| 亚洲午夜福利精品无码| 亚洲线精品一区二区三区| 亚洲综合精品香蕉久久网| 亚洲AV永久精品爱情岛论坛| 亚洲AV永久无码精品网站在线观看| 亚洲精品夜夜夜妓女网| 亚洲国产一二三精品无码| 老司机性色福利精品视频| 精品无码久久久久久尤物|