安卓電池管理系統(tǒng)驅(qū)動分析與總結(jié)_第1頁
安卓電池管理系統(tǒng)驅(qū)動分析與總結(jié)_第2頁
安卓電池管理系統(tǒng)驅(qū)動分析與總結(jié)_第3頁
安卓電池管理系統(tǒng)驅(qū)動分析與總結(jié)_第4頁
安卓電池管理系統(tǒng)驅(qū)動分析與總結(jié)_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

題目安卓電池管理系統(tǒng)驅(qū)動分析與總結(jié)驅(qū)動架構(gòu)安卓電池管理系統(tǒng)主要作用為四點:檢測電池狀態(tài)監(jiān)測電池剩余電量電池高溫警報低電量關(guān)機基本上驅(qū)動整體結(jié)構(gòu)分為4層,應(yīng)用接口層,F(xiàn)ramework層,HAL和linux內(nèi)核層,其中應(yīng)用接口層為PowerManager.java其主要作用是調(diào)用PM接口申請wakelock以此使系統(tǒng)啟動和休眠,F(xiàn)ramework層中主要為調(diào)用應(yīng)用接口層開放的接口,在PowerManagerService.java中完成對于電源管理的相關(guān)內(nèi)容。HAL層為power.c文件通過Framework層傳的參數(shù)來與內(nèi)核層的Kernel/power進(jìn)行通信,申請和釋放鎖。Linux內(nèi)核層主要為kernel/power來實現(xiàn)電源管理的底層框架。層次分析安卓電池管理驅(qū)動層次主要為4層,現(xiàn)在我們來對此4層次進(jìn)行一個簡短的的分析:安卓電泳管理底層框架為power_supply架構(gòu),其Kernel內(nèi)核層及HAL主要用于與硬件交互,檢測電池的各個狀態(tài)參數(shù)的改變,如:電量,電壓,溫度,是否充電等,并且把監(jiān)測到的數(shù)據(jù)寫入power_supply節(jié)點,加載PMU驅(qū)動(PMU為電源管理單元的縮寫)。JNI層調(diào)用sys文件系統(tǒng)訪問驅(qū)動程序,并向上層BatteryService封裝本地方法以隔離平臺化的差異。Framework層的healthd,healthd用于監(jiān)聽kernel的電池事件,并且傳遞電池數(shù)據(jù)給BatteryService用于計算。Application層用于SystemUI的顯示。核心代碼閱讀HAL層:HAL代碼路徑hardware/libhardware_legacy/power.c通過分析代碼我們可以看見一開始有一個文件路徑的定義constchar*constNEW_PATHS[]={"/sys/power/wake_lock","/sys/power/wake_unlock",};該層主要作用就是通過獲得上層的信息,將信息寫入這兩個文件節(jié)點來與Kernel通信,其下有兩個函數(shù)用于打卡和初始化文件節(jié)點。此后又有兩個個函數(shù)acquire_wake_lock,release_wake_lock用于向文件節(jié)點寫入wakelock的信息。JNI層:jni層代碼路徑:frameworks/base/services/jni/com_android_server_BatteryService.cpp其中文件頭有一個宏定義#definePOWER_SUPPLY_PATH"/sys/class/power_supply"此處便是kenel層的power_supply框架中電池驅(qū)動的文件路徑getBatteryStatus,getBatteryHealth用于獲取電池的的狀態(tài)信息register_android_server_BatteryService函數(shù)用于注冊Framework層的BatteryService,再通過JNI中的本地方法android_server_BatteryService_update獲取SYS中更新的文件后向javaFrameworkceng傳遞信息。Framework層:Framework層為電池管理系統(tǒng)最為復(fù)雜的部分,分為healthd,BatteryService等文件Healthd主要用于監(jiān)聽Kernel的電池時間,上傳數(shù)據(jù)給BatteryService,其源碼目錄在system/core/healthd,在此主要分析healthd,BatteryMonitor和BatterPropertiesRegistrarHealthd文件這里主要是healthd_common文件,其中healthd_main中主要負(fù)責(zé)初始化和開啟healthd_mainloop,healthd_mainloop主要是epoll函數(shù)來監(jiān)聽三個fd,當(dāng)電池狀態(tài)更新時將其傳給BatteryMonitor的update其中init函數(shù)對于epoll進(jìn)行了IO復(fù)用并且在其中對于android_ops的healthd_mode_android_init函數(shù)進(jìn)行使用,主要是講binder通信機制的fd加入epoll,并且在之后new了一個batteryMonitor用于存儲電池信息并且向上傳遞消息。BatteryMonitor中初始化時DIR*dir=opendir(POWER_SUPPLY_SYSFS_PATH);語句通過打開/sys/class/power_supply來遍歷獲取電池初始化參數(shù)獲得healthd的config參數(shù),其中update方法中把電池信息封裝在BatterProperties中通過healthd_mode_ops->battery_update(&props);將數(shù)據(jù)傳給上層的BatteryService,而在BatterPropertiesRegistrar中設(shè)置了一些監(jiān)聽,上層會通過blinder注冊一個回調(diào)BatteryPropertiesRegistrar::registerListener到BatteryPropertiesRegistrar實現(xiàn)上層與healthd部分的通信此后介紹BatteryService主要用于將電池屬性通過廣播報給各個APP的使用,在onStart函數(shù)中調(diào)用batteryPropertiesRegistrar.registerListener(newBatteryListener());注冊電池的監(jiān)聽publishBinderService("battery",newBinderService());將POWER_SERVICE作為Binder的服務(wù)端,注冊到SystemService中,publishLocalService(BatteryManagerInternal.class,newLocalService());將BatteryManagerInternal注冊到本地服務(wù),德昂底層有消息時便調(diào)用update更新BatteryService中先關(guān)電池屬性的值。其中在processValuesLocked函數(shù)中通過以下代碼段實現(xiàn)對電池信息的廣播sendIntentLocked();if(mPlugType!=0&&mLastPlugType==0){mHandler.post(newRunnable(){@Overridepublicvoidrun(){IntentstatusIntent=newIntent(Intent.ACTION_POWER_CONNECTED);statusIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);mContext.sendBroadcastAsUser(statusIntent,UserHandle.ALL);}});}elseif(mPlugType==0&&mLastPlugType!=0){mHandler.post(newRunnable(){@Overridepublicvoidrun(){IntentstatusIntent=newIntent(Intent.ACTION_POWER_DISCONNECTED);statusIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);mContext.sendBroadcastAsUser(statusIntent,UserHandle.ALL);}});}if(shouldSendBatteryLowLocked()){mSentLowBatteryBroadcast=true;mHandler.post(newRunnable(){@Overridepublicvoidrun(){IntentstatusIntent=newIntent(Intent.ACTION_BATTERY_LOW);statusIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);mContext.sendBroadcastAsUser(statusIntent,UserHandle.ALL);}});}elseif(mSentLowBatteryBroadcast&&mLastBatteryLevel>=mLowBatteryCloseWarningLevel){mSentLowBatteryBroadcast=false;mHandler.post(newRunnable(){@Overridepublicvoidrun(){IntentstatusIntent=newIntent(Intent.ACTION_BATTERY_OKAY);statusIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);mContext.sendBroadcastAsUser(statusIntent,UserHandle.ALL);}});}上述是對于電源連接/斷開進(jìn)行的單獨廣播??蚣芙涌诜治隹蚣芙涌谥饕€是上述幾層法分析,通過KERNEL內(nèi)核層以及HAL層將電池信息更新到power_supply的文件節(jié)點,并將ueventfd事件上傳給Framework層的Healthd,Healthd通過注冊Binderfd,ueventfd,wakealarmfd上的監(jiān)聽調(diào)用mainloop的循環(huán),調(diào)用epoll_wait收集監(jiān)聽的事件,通過healthd_battery_update()方法將信息傳遞給BatteryMonitor中的update()方法,并且在Healthdinit()的時候,將其參數(shù)也用于BatteryMonitor的初始化,然后在數(shù)據(jù)更新時再由BatteryPropertiesRegistrar中定義的notifyListeners通知BatteryProperties的監(jiān)聽者去進(jìn)行update操作,然后由BatterySevice監(jiān)聽到了數(shù)據(jù)變化調(diào)用update()更新信息,最后通過processValuesLocked函數(shù)進(jìn)行廣播傳遞給各個APP驅(qū)動移植驅(qū)動移植時所需要做的工作是Battery的驅(qū)動程序,其驅(qū)動程序需要使用SYS文件系統(tǒng)向用戶空間提供的接口,路徑如下: /sys/class/power_supply/其中主要應(yīng)該實現(xiàn)結(jié)構(gòu)體power_supply的內(nèi)容,而在其上層實現(xiàn)com_android_server_BatteryService.cpp是Battery部分的本地JINI代碼需要實現(xiàn)其中的android_server_BatteryService_update(),并且定義函數(shù)用于得到各個電池屬性的處理。學(xué)習(xí)總結(jié)在本學(xué)期中,主要學(xué)習(xí)了再Android底層開發(fā)驅(qū)動的相關(guān)知識,對于java層,JIN層,HAL層以及內(nèi)核核心層都有了更為深入的認(rèn)識,而在不同系統(tǒng)不同需求上對于驅(qū)動的要求也不同,因此在驅(qū)動移植上也有更深的見解。對于安卓源碼的細(xì)節(jié)認(rèn)識,可能因為自己水平有限,還有許多不能夠完全理解的方面,因而需要此后的進(jìn)一步學(xué)習(xí)。安卓源碼本身的結(jié)構(gòu)十分復(fù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論