? ? 我們在調試輸入設備時,有些時候需要修改到*.idc、*.kcm、*.kl這些擴展名的文件,即會修改到輸入設備配置文件、按鍵布局文件、按鍵字符映射文件和虛擬按鍵定義文件。而有些時候我們并不想在修改完相應文件后等到編譯代碼或者push到真機驗證時才發(fā)現相應文件語法上有問題,還好Android源碼里有validatekeymaps這個工具,可以在我們修改完時進行相應文件的驗證,下面是關于該工具的說明(以Android7.1源碼進行分析):
? ? 1.源碼
? ? ? ? 該工具源碼位于frameworks/base/tools/validatekeymaps目錄。
? ? 2.編譯
? ? ? ?進入到Android源碼目錄(前提是編譯過源代碼樹),使用如下命令編譯(注意先執(zhí)行過lunch設置過環(huán)境變量):
? ? ? ?mmm frameworks/base/tools/validatekeymaps
? ? ? ?編譯好的工具會生成為out/host/linux-x86/bin/validatekeymaps。
? ? 3.使用
? ? ? ?執(zhí)行validatekeymaps命令會有如下內容輸出(設置過環(huán)境變量可在源碼根目錄下執(zhí)行):
? ? ? ?Keymap Validation Tool
? ? ? ?Usage:
? ? ? ? validatekeymaps [*.kl] [*.kcm] [*.idc] [virtualkeys.*] [...]
? ? ? ? ? Validates the specified key layouts, key character maps,?
? ? ? ? ? input device configurations, or virtual key definitions.
? ? ? ?從上面幫助信息可以知道在validatekeymaps命令后帶上相應要驗證的文件的路徑就可以驗證了,如有異常則根據提示處理,如果文件正確,則會有如下輸出:
? ? ? ?Validating file 'frameworks/base/data/keyboards/Generic.kcm'...
? ? ? ?No errors.
? ? ? ?Success.
? ? ? ?從提示可以看到驗證的文件及結果。
? ? 4.自動化
? ? ? ?上述的驗證只是手動處理,但有些時候可能修改完后忘了驗證,如果在編譯的時候編譯腳本也沒去驗證的話,如果存在問題,可要等到運行Android系統(tǒng)時才能發(fā)現,還好Android系統(tǒng)在編譯時已做了相應的處理,可以查閱frameworks/base/data/keyboards/Android.mk文件,內容如下:
? ? ? ? LOCAL_PATH := $(call my-dir)
? ? ? ? include $(LOCAL_PATH)/common.mk
? ? ? ? # Validate all key maps.
? ? ? ? include $(CLEAR_VARS)
? ? ? ? LOCAL_MODULE := validate_framework_keymaps
? ? ? ? intermediates := $(call intermediates-dir-for,ETC,$(LOCAL_MODULE),,COMMON)
? ? ? ? LOCAL_BUILT_MODULE := $(intermediates)/stamp
? ? ? ? validatekeymaps :=?? ? ? ??$(HOST_OUT_EXECUTABLES)/validatekeymaps$(HOST_EXECUTABLE_SUFFIX)
? ? ? ? $(LOCAL_BUILT_MODULE): PRIVATE_VALIDATEKEYMAPS := $(validatekeymaps)
? ? ? ? $(LOCAL_BUILT_MODULE) : $(framework_keylayouts)?? ? ? ??$(framework_keycharmaps) $(framework_keyconfigs) | $(validatekeymaps)
? ? ? ??? ? ? ??$(hide) $(PRIVATE_VALIDATEKEYMAPS) $^
? ? ? ??? ? ? ??$(hide) mkdir -p $(dir $@) && touch $@
? ? ? ? # Run validatekeymaps uncondionally for platform build.
? ? ? ? droidcore : $(LOCAL_BUILT_MODULE)
? ? ? ? # Reset temp vars.
? ? ? ? validatekeymaps :=
? ? ? ? framework_keylayouts :=
? ? ? ? framework_keycharmaps :=
? ? ? ? framework_keyconfigs :=
? ? ? ? 從上面的內容可以看到droidcore : $(LOCAL_BUILT_MODULE)這一句,表示LOCAL_BUILT_MODULE這個目標是會被編譯到的,因為droidcore依賴到,而從build/core/main.mk文件看到droid_targets: droidcore dist_files可知droid_targets依賴到droidcore,而從該文件開頭可以看到如下語句:
? ? ? ? .PHONY: droid
? ? ? ? DEFAULT_GOAL := droid
? ? ? ? $(DEFAULT_GOAL): droid_targets
? ? ? ? 可知我們在進行Android系統(tǒng)編譯時默認目錄是droid(編譯Android時make命令后不帶對象時默認是droid,因為在該Makefile文件時第一個目標就是droid,根據Makefile的語法規(guī)則可知),而其依賴droid_targets,故而知道編譯Android系統(tǒng)時會編譯到該目錄下的對象validate_framework_keymaps,從上面的Android.mk文件中可知編譯該對象會執(zhí)行到如下語句:
? ? ? ? $(hide) $(PRIVATE_VALIDATEKEYMAPS) $^
? ? ? ? 而PRIVATE_VALIDATEKEYMAPS有PRIVATE_VALIDATEKEYMAPS := $(validatekeymaps)語句進行賦值,而validatekeymaps由validatekeymaps :=?? ? ? ??$(HOST_OUT_EXECUTABLES)/validatekeymaps$(HOST_EXECUTABLE_SUFFIX)賦值,即可知道PRIVATE_VALIDATEKEYMAPS為上面提到的validatekeymaps工具對應的路徑,那么$^則表示$(framework_keylayouts)?? ? ? ??$(framework_keycharmaps) $(framework_keyconfigs)這串內容,其在include $(LOCAL_PATH)/common.mk包含的common.mk文件中賦值了,即對當前目錄下的所有文件進行列表并將文件名保存到相應的變量中,即$^表示當前目錄下的所有kl、kcm、idc文件,即使用validatekeymaps工具對當前目錄下的所有需要驗證的文件進行驗證,由此可知Android系統(tǒng)編譯時已做了相應的自動化處理,如果我們在其他目錄下添加了相應的配置文件,也可以參照上面的Android.mk文件進行修改。
? ? 5.參考網址
? ? ? ?https://source.android.com/devices/input/validate-keymaps