Android idc文件配置

1.idc是什么鳞仙?
idc 是Input Device Configuration的縮寫(xiě)霹娄,輸入設(shè)備配置文件(.idc 文件)包含特定設(shè)備的配置屬性,這些屬性會(huì)影響輸入設(shè)備的行為驰吓。
輸入設(shè)備配置文件通常并非標(biāo)準(zhǔn)外圍設(shè)備(例如 HID 鍵盤(pán)和鼠標(biāo))所必需的杈绸,因?yàn)槟J(rèn)的系統(tǒng)行為通常可確保它們即插即用企软。另一方面,內(nèi)置的嵌入式設(shè)備(尤其是觸摸屏)幾乎總是需要輸入設(shè)備配置文件來(lái)指定其行為饭望。

2.idc位置按順序查閱以下路徑仗哨。
/odm/usr/idc/Vendor_XXXX_Product_XXXX_Version_XXXX.idc
/vendor/usr/idc/Vendor_XXXX_Product_XXXX_Version_XXXX.idc
/system/usr/idc/Vendor_XXXX_Product_XXXX_Version_XXXX.idc
/data/system/devices/idc/Vendor_XXXX_Product_XXXX_Version_XXXX.idc
/odm/usr/idc/Vendor_XXXX_Product_XXXX.idc
/vendor/usr/idc/Vendor_XXXX_Product_XXXX.idc
/system/usr/idc/Vendor_XXXX_Product_XXXX.idc
/data/system/devices/idc/Vendor_XXXX_Product_XXXX.idc
/odm/usr/idc/device-name.idc
/vendor/usr/idc/device-name.idc
/system/usr/idc/device-name.idc
/data/system/devices/idc/device-name.idc
當(dāng)構(gòu)建包含設(shè)備名稱(chēng)的文件路徑時(shí),設(shè)備名稱(chēng)中除“0-9”铅辞、“a-z”厌漂、“A-Z”、“-”或“_”之外的所有字符將替換為“_”斟珊。

3.idc文件常用配置屬性
#=0 外部設(shè)備 =1內(nèi)部設(shè)備
device.internal = 0
#定義:keyboard.layout = <name>
#指定與輸入設(shè)備關(guān)聯(lián)的鍵布局文件的名稱(chēng)苇倡,不包括.kl擴(kuò)展名。 如果找不到此文件囤踩,輸入系統(tǒng)將使用默認(rèn)鍵布局旨椒。
keyboard.layout = qwerty
#定義:keyboard.characterMap = <name>
#指定與輸入設(shè)備關(guān)聯(lián)的鍵字符映射文件的名稱(chēng),不包括.kcm擴(kuò)展名堵漱。 如果找不到此文件综慎,輸入系統(tǒng)將使用默認(rèn)的鍵字符映射。
#在查找期間示惊,名稱(chēng)中的空格將轉(zhuǎn)換為下劃線。
keyboard.characterMap = qwerty
#定義:keyboard.orientationAware = 0 |1
#指定鍵盤(pán)是否應(yīng)對(duì)顯示方向更改做出反應(yīng)愉镰。
#如果值為1米罚,則在關(guān)聯(lián)的顯示方向改變時(shí)旋轉(zhuǎn)方向鍵盤(pán)鍵。
#如果值為0丈探,則鍵盤(pán)不受顯示方向更改的影響录择。
#默認(rèn)值為0。
#方向感知用于支持方向鍵盤(pán)鍵的旋轉(zhuǎn),例如Motorola Droid上的旋轉(zhuǎn)糊肠。 例如辨宠,當(dāng)設(shè)備從其自然方向順時(shí)針旋轉(zhuǎn)90度時(shí),
#KEYCODE_DPAD_UP被重新映射以產(chǎn)生KEYCODE_DPAD_RIGHT货裹,因?yàn)楫?dāng)設(shè)備保持在該方向時(shí)嗤形,“向上”鍵最終指向“右”。
keyboard.orientationAware = 1
#定義:keyboard.builtIn = 0 |1
#指定鍵盤(pán)是否為內(nèi)置(物理連接)鍵盤(pán)弧圆。
#如果設(shè)備名稱(chēng)以-keypad結(jié)尾赋兵,則默認(rèn)值為1,否則為0搔预。
#內(nèi)置鍵盤(pán)的設(shè)備ID始終為0.其他非內(nèi)置鍵盤(pán)將分配唯一的非零設(shè)備ID霹期。
#對(duì)于內(nèi)置鍵盤(pán)使用id為0對(duì)于保持與KeyCharacterMap.BUILT_IN_KEYBOARD字段的兼容性非常重要,該字段指定內(nèi)置鍵盤(pán)的id并且值為0.
#此字段已在API中棄用但較舊 應(yīng)用程序可能仍在使用它拯田。
#無(wú)論此屬性的設(shè)置如何历造,特殊功能鍵盤(pán)(其鍵字符映射指定SPECIAL_FUNCTION的類(lèi)型)將永遠(yuǎn)不會(huì)注冊(cè)為內(nèi)置鍵盤(pán)。
#這是因?yàn)楦鶕?jù)定義船庇,特殊功能鍵盤(pán)不打算用于通用鍵入吭产。
keyboard.builtIn = 1

4.idc代碼流程
Eventhub在打開(kāi)設(shè)備時(shí)會(huì)讀取設(shè)備的idc文件
->Eventhub.openDeviceLocked->loadConfigurationLocked

void EventHub::loadConfigurationLocked(Device* device) {
??? device->configurationFile = getInputDeviceConfigurationFilePathByDeviceIdentifier(
??????????? device->identifier, INPUT_DEVICE_CONFIGURATION_FILE_TYPE_CONFIGURATION);
??? if (device->configurationFile.isEmpty()) {
??????? ALOGD("No input device configuration file found for device '%s'.",
??????????????? device->identifier.name.string());
??? } else {
??????? status_t status = PropertyMap::load(device->configurationFile,
??????????????? &device->configuration);
??????? if (status) {
??????????? ALOGE("Error loading input device configuration file for device '%s'.? "
??????????????????? "Using default configuration.",
??????????????????? device->identifier.name.string());
??????? }
??? }
}

idc文件的加載順序如下,如果找到了idc文件則直接返回不會(huì)再加載后面的idc文件
Vendor_XXXX_Product_XXXX_Version_XXXX.idc
Vendor_XXXX_Product_XXXX.idc
device-name.idc


String8 getInputDeviceConfigurationFilePathByDeviceIdentifier(
??????? const InputDeviceIdentifier& deviceIdentifier,
??????? InputDeviceConfigurationFileType type) {
??? if (deviceIdentifier.vendor !=0 && deviceIdentifier.product != 0) {
??????? if (deviceIdentifier.version != 0) {
??????????? // Try vendor product version.
??????????? String8 versionPath(getInputDeviceConfigurationFilePathByName(
??????????????????? String8::format("Vendor_%04x_Product_%04x_Version_%04x",
??????????????????????????? deviceIdentifier.vendor, deviceIdentifier.product,
??????????????????????????? deviceIdentifier.version),
??????????????????? type));
??????????? if (!versionPath.isEmpty()) {
??????????????? return versionPath;
??????????? }
??????? }


??????? // Try vendor product.
??????? String8 productPath(getInputDeviceConfigurationFilePathByName(
??????????????? String8::format("Vendor_%04x_Product_%04x",
??????????????????????? deviceIdentifier.vendor, deviceIdentifier.product),
??????????????? type));
??????? if (!productPath.isEmpty()) {
??????????? return productPath;
??????? }
??? }


??? // Try device name.
??? return getInputDeviceConfigurationFilePathByName(deviceIdentifier.name, type);
}


String8 getInputDeviceConfigurationFilePathByName(
??????? const String8& name, InputDeviceConfigurationFileType type) {
??? // Search system repository.
??? String8 path;
??? path.setTo(getenv("ANDROID_ROOT"));
??? path.append("/usr/");
??? appendInputDeviceConfigurationFileRelativePath(path, name, type);
#if DEBUG_PROBE
??? ALOGD("Probing for system provided input device configuration file: path='%s'", path.string());
#endif
??? if (!access(path.string(), R_OK)) {
#if DEBUG_PROBE
??????? ALOGD("Found");
#endif
??????? return path;
??? }
??? // Search user repository.
??? // TODO Should only look here if not in safe mode.
??? path.setTo(getenv("ANDROID_DATA"));
??? path.append("/system/devices/");
??? appendInputDeviceConfigurationFileRelativePath(path, name, type);
#if DEBUG_PROBE
??? ALOGD("Probing for system user input device configuration file: path='%s'", path.string());
#endif
??? if (!access(path.string(), R_OK)) {
#if DEBUG_PROBE
??????? ALOGD("Found");
#endif
??????? return path;
??? }


??? // Not found.
#if DEBUG_PROBE
??? ALOGD("Probe failed to find input device configuration file: name='%s', type=%d",
??????????? name.string(), type);
#endif
??? return String8();
}


參考博客:
https://source.android.com/devices/input/validate-keymaps.html
https://www.cnblogs.com/guolinjie/p/10791991.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鸭轮,一起剝皮案震驚了整個(gè)濱河市臣淤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窃爷,老刑警劉巖邑蒋,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異按厘,居然都是意外死亡医吊,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)刻剥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)遮咖,“玉大人,你說(shuō)我怎么就攤上這事造虏∮蹋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵漓藕,是天一觀的道長(zhǎng)陶珠。 經(jīng)常有香客問(wèn)我,道長(zhǎng)享钞,這世上最難降的妖魔是什么揍诽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任诀蓉,我火速辦了婚禮,結(jié)果婚禮上暑脆,老公的妹妹穿的比我還像新娘渠啤。我一直安慰自己,他們只是感情好添吗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布沥曹。 她就那樣靜靜地躺著,像睡著了一般碟联。 火紅的嫁衣襯著肌膚如雪妓美。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天鲤孵,我揣著相機(jī)與錄音壶栋,去河邊找鬼。 笑死普监,一個(gè)胖子當(dāng)著我的面吹牛贵试,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鹰椒,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼锡移,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了漆际?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤夺饲,失蹤者是張志新(化名)和其女友劉穎奸汇,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體往声,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡擂找,尸身上長(zhǎng)有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
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望讳嘱。 院中可真熱鬧幔嗦,春花似錦、人聲如沸沥潭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)叛氨。三九已至呼渣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寞埠,已是汗流浹背屁置。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仁连,地道東北人蓝角。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像饭冬,于是被迫代替她去往敵國(guó)和親使鹅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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