Android硬件抽象層(HAL)深入剖析(二)

上一篇我們分析了android?HAL層的主要的兩個(gè)結(jié)構(gòu)體hw_module_t(硬件模塊)和hw_device_t(硬件設(shè)備)的成員枫虏,下面我們來具體看看上層app到底是怎么實(shí)現(xiàn)操作硬件的?

我們知道醉箕,一些硬件廠商不愿意將自己的一些核心代碼開放出去父叙,所以將這些代碼放到HAL層,但是怎么保證它不開放呢?HAL層代碼不是也讓大家知道下載嗎?其實(shí)硬件廠商的HAL核心代碼是以共享庫的形式出現(xiàn)的迅办,每次在需要的時(shí)候宅静,hal會(huì)自動(dòng)加載調(diào)用相關(guān)共享庫。那么是怎么加載找到某一硬件設(shè)備對(duì)應(yīng)的共享庫的呢?這也是我們這篇都要說的站欺。

上層app通過jni調(diào)用hal層的hw_get_module函數(shù)獲取硬件模塊坏为,這個(gè)函數(shù)是上層與hal打交道的入口。所以如果我們以程序調(diào)用執(zhí)行的流程去看源碼的話镊绪,這個(gè)函數(shù)就是hal層第一個(gè)被調(diào)用的函數(shù)匀伏,下面我們就

從這個(gè)函數(shù)開始,沿著程序執(zhí)行的流程走下去蝴韭。

hw_get_module函數(shù)定義在/hardware/libhardware/hardware.c中够颠,打開這個(gè)文件可以看到定義如下:

1 int hw_get_module(const char *id, const struct hw_module_t **module)

2 {

3 int status;

4 int i;

5 const struct hw_module_t *hmi = NULL;

6 char prop[PATH_MAX];

7 char path[PATH_MAX];

8

9 /*

10 * Here we rely on the fact that calling dlopen multiple times on

11 * the same .so will simply increment a refcount (and not load

12 * a new copy of the library).

13 * We also assume that dlopen() is thread-safe.

14 */

15

16 /* Loop through the configuration variants looking for a module */

17 for (i=0 ; i

18 if (i < HAL_VARIANT_KEYS_COUNT) {

19 if (property_get(variant_keys, prop, NULL) == 0) {//獲取屬性

20 continue;

21 }

22 snprintf(path, sizeof(path), "%s/%s.%s.so",

23 HAL_LIBRARY_PATH1, id, prop);

24 if (access(path, R_OK) == 0) break;//檢查system路徑是否有庫文件

25

26 snprintf(path, sizeof(path), "%s/%s.%s.so",

27 HAL_LIBRARY_PATH2, id, prop);

28 if (access(path, R_OK) == 0) break;//檢查vender路徑是否有庫文件

29 } else {

30 snprintf(path, sizeof(path), "%s/%s.default.so",//如果都沒有,則使用缺省的

31 HAL_LIBRARY_PATH1, id);

32 if (access(path, R_OK) == 0) break;

33 }

34 }

35

36 status = -ENOENT;

37 if (i < HAL_VARIANT_KEYS_COUNT+1) {

38 /* load the module, if this fails, we're doomed, and we should not try

39 * to load a different variant. */

40 status = load(id, path, module);//裝載庫榄鉴,得到module

41 }

42

43 return status;

44 }

看第一行我們知道有兩個(gè)參數(shù)履磨,第一參數(shù)id就是要獲取的硬件模塊的id蛉抓,第二個(gè)參數(shù)module就是我們想得到的硬件模塊結(jié)構(gòu)體的指針。

所以可以看出剃诅,上層首先給hal需要獲取的硬件模塊的id巷送,hw_get_module函數(shù)根據(jù)這個(gè)id去查找匹配和這個(gè)id對(duì)應(yīng)的硬件模塊結(jié)構(gòu)體的。

下面看看怎么找的矛辕。

17行有個(gè)for循環(huán)笑跛,上限是HAL_VARIANT_KEYS_COUNT+1,那么這個(gè)HAL_VARIANT_KEYS_COUNT是什么呢?查看同文件下找到有:

static const int HAL_VARIANT_KEYS_COUNT =

(sizeof(variant_keys)/sizeof(variant_keys[0]));

原來它是ariant_keys這個(gè)數(shù)組的元素個(gè)數(shù)聊品。那么這個(gè)數(shù)組又是什么呢?在本文件找飞蹂,有:

/**

* There are a set of variant filename for modules. The form of the

filename

* is ".variant.so" so for the led module the Dream variants

* of base "ro.product.board", "ro.board.platform" and "ro.arch" would be:

*

* led.trout.so

* led.msm7k.so

* led.ARMV6.so

* led.default.so

*/

static const char *variant_keys[] = {

"ro.hardware", /* This goes first so that it can pick up a different

file on the emulator. */

"ro.product.board",

"ro.board.platform",

"ro.arch"

};

可以看到它其實(shí)是個(gè)字符串?dāng)?shù)組。站且不知道干什么的翻屈。繼續(xù)看hw_get_module函數(shù)陈哑,進(jìn)入for循環(huán)里面,看22行伸眶,其實(shí)它是將HAL_LIBRARY_PATH1,

id, prop這三個(gè)串拼湊一個(gè)路徑出來惊窖,

HAL_LIBRARY_PATH1定義如下:

/** Base path of the hal modules */

#define HAL_LIBRARY_PATH1 "/system/lib/hw"

#define HAL_LIBRARY_PATH2 "/vendor/lib/hw"

id是上層提供的,prop這個(gè)變量的值是前面19行property_get(variant_keys, prop,

NULL)函數(shù)獲取到的厘贼,其實(shí)這個(gè)函數(shù)是通過ariant_keys數(shù)組的的屬性查找到系統(tǒng)中對(duì)應(yīng)的變種名稱界酒。不同的平臺(tái)獲取到prop值是不一樣的。

假如在獲取到的prop值是tout涂臣,需要獲取的硬件模塊的id是leds,那么最后path組成的串是/system/lib/hw/leds.tout.so售担。

后面24行access是檢查這個(gè)路徑下是否存在赁遗,如果有就break,跳出循環(huán)族铆。如果沒有岩四,繼續(xù)走下面,

可以看到下面幾行和剛才形式差不多哥攘,

snprintf(path, sizeof(path), "%s/%s.%s.so", HAL_LIBRARY_PATH2, id, prop);

if (access(path, R_OK) == 0) break;//檢查vender路徑是否有庫文件

結(jié)合 HAL_LIBRARY_PATH2

為"/vendor/lib/hw"剖煌,假設(shè)同樣獲取到的prop值是tout,需要獲取的硬件模塊的id是leds逝淹,這種情況下path拼出來的值是/vender/lib/hw/leds.tout.so,然后在判斷文件是否存在耕姊。如果存在跳出循環(huán)。

從以上分析栅葡,其實(shí)這就是hal層搜索動(dòng)態(tài)共享庫的方式茉兰,從中我們可以得到兩點(diǎn):

1.動(dòng)態(tài)共享庫一般放在 "/system/lib/hw"和"/vendor/lib/hw"這兩個(gè)路徑下。

2.動(dòng)態(tài)庫的名稱是以"id.variant.so"的形式命名的欣簇,其中id為上層提供规脸,中間variant為變種名稱坯约,是隨系統(tǒng)平臺(tái)變化的。

接著莫鸭,從29到32行我們可以看到闹丐,當(dāng)所有變種名稱形式的包都不存在時(shí),就以"id.default.so"形式包名查找是否存在被因。

37行卿拴, if (i <

HAL_VARIANT_KEYS_COUNT+1),如果i小于變種名稱數(shù)組的話氏身,表示找到了對(duì)應(yīng)的庫巍棱,那么38行l(wèi)oad(id, path,

module);//裝載庫,得到module蛋欣。

以上就對(duì)hal層搜索庫的規(guī)則搞清楚了航徙。

下一篇我們將進(jìn)入load函數(shù),看看共享庫是如何被加載的陷虎。

更多專業(yè)內(nèi)容可訪問http://www.embedu.org/Column

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末到踏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子尚猿,更是在濱河造成了極大的恐慌窝稿,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凿掂,死亡現(xiàn)場離奇詭異伴榔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)庄萎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門踪少,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人糠涛,你說我怎么就攤上這事援奢。” “怎么了忍捡?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵集漾,是天一觀的道長。 經(jīng)常有香客問我砸脊,道長具篇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任凌埂,我火速辦了婚禮栽连,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己秒紧,他們只是感情好绢陌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著熔恢,像睡著了一般脐湾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叙淌,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天秤掌,我揣著相機(jī)與錄音,去河邊找鬼鹰霍。 笑死闻鉴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的茂洒。 我是一名探鬼主播孟岛,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼督勺!你這毒婦竟也來了渠羞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤智哀,失蹤者是張志新(化名)和其女友劉穎次询,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓷叫,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屯吊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了摹菠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盒卸。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖辨嗽,靈堂內(nèi)的尸體忽然破棺而出世落,到底是詐尸還是另有隱情淮腾,我是刑警寧澤糟需,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站谷朝,受9級(jí)特大地震影響洲押,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜圆凰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一杈帐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦挑童、人聲如沸累铅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娃兽。三九已至,卻和暖如春尽楔,著一層夾襖步出監(jiān)牢的瞬間投储,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工阔馋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留玛荞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓呕寝,卻偏偏與公主長得像勋眯,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子壁涎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 上一篇我們分析了android HAL層的主要的兩個(gè)結(jié)構(gòu)體hw_module_t(硬件模塊)和hw_device_...
    donnahn閱讀 616評(píng)論 0 2
  • Android HAL概述 Android HAL(Hardware Abstract Layer)硬件抽象層凡恍,從...
    諾遠(yuǎn)閱讀 30,082評(píng)論 2 27
  • 硬件廠商處于保護(hù)核心代碼,會(huì)將核心實(shí)現(xiàn)以so庫的形式出現(xiàn)在HAL層怔球,當(dāng)需要時(shí)HAL會(huì)自動(dòng)調(diào)用相關(guān)的共享庫嚼酝。 共享庫...
    Galileo_404閱讀 1,996評(píng)論 0 3
  • 眾所周知,現(xiàn)代的計(jì)算機(jī)系統(tǒng)由硬件系統(tǒng)以及軟件系統(tǒng)兩個(gè)部分組成竟坛,再好的硬件闽巩,如果沒有軟件的支持,就不能發(fā)揮其應(yīng)有的作...
    哲影閱讀 2,926評(píng)論 0 5
  • 假如有人問我的煩憂 我不敢說出你的名字 假如有人問我的煩憂 說是遼遠(yuǎn)的海的相思 說是寂寞的秋的清愁 ——戴望舒
    芃_芃閱讀 183評(píng)論 0 1