網上有很多人講Android的HAL,都是基於jollen的實驗代碼的, 講的都很好,但是缺少在板子上的實際操作。雖然這些實踐步驟做過一次就很熟悉了,但是第一次還是挺麻煩的,要到處找資料,故特地在此將我在友善之臂板子上的實驗步驟記錄在這裡,以供大家參考,少走彎路。在此不是為友善的板子打廣告,他們也沒給我錢,其實這板子的Android只有基本功能,不是很爽,不知後續固件是否有更新。廢話說多了,下面開始吧:
1)首先mokoid下載後解壓到友善的Android-2.0目錄下面。可以在以下地址下載我使用的mokoid:
免費下載地址在 http://linux.linuxidc.com/
用戶名與密碼都是www.linuxidc.com
具體下載目錄在 /2012年資料/3月/10日/Android HAL實踐:Mini6410開發板上的mokoid/
Android的編譯一般都是通過搜索Android.mk來進行的,如果單獨編譯一部分代碼,比如我們這裡的mokoid。可以采取兩種方式,第一種當然是直接運行Android的編譯命令,比如友善文檔裡面的build-android命令編譯整個項目,這種編譯要搜索整個目錄樹,當然是很慢的了。第二種就是只編譯這個模塊,比如我們的mokoid. 使用以下命令:
mmm mokoid/
運行這條命令的時候可能出錯:
-bash: mmm: command not found
其實mmm是一組函數,需要通過以下命令來讓其生效:
. build/envsetup 注意:點和build之間記住有空格
2)現在就可以開始編譯了,由於mokoid裡面的led.h不在搜索路徑中,需要進行一下修改,我這種全局改法應該不是很好,不過就將就看吧,
Android 編譯會首先使用build/core/config.mk文件,所以可以在此修改全局的頭文件搜索路徑:
SRC_HEADERS := /
$(TOPDIR)system/core/include /
............................................
$(TOPDIR)vendor/generic/hardware/led_stub/include
3)要運行mokoid的測試程序,需要增加permission,不然測試程序不會出現在菜單中,即將相應的xml拷貝到/system/etc/permissions下面。
cp ../mokoid/frameworks/base/service/com.mokoid.server.xml system/etc/permissions/
4)使用genrootfs.sh更新新編譯出來的mokoid到rootfs_dir目錄中,使用mkyaffs2image-128M將rootfs_dir生成單個的Image文件,燒入開發板。
5)在開發板運行測試程序時會加載.so文件,編譯生成的so文件是led.goldfish.so.這樣就會出現一個錯誤:
LedService JNI: Get Stub operations failed.
從而導致在LedOn的時候出現新的錯誤:
LedService JNI: sLedDevice was not fetched correctly.
解決的辦法就是在做文件系統的時候把led.goldfish.so直接改成led.default.so, 或者直接到開發板system/lib/hw下面去改。這樣就OK了。這也是個湊合的方法,呵呵。
6)如果不確定系統load的到底是什麼so文件可以在hardware/libhardware的hw_get_module函數裡面利用LOGE打印path的值來確定
LOGE("++Path:%s",path);
status = -ENOENT;
if (i < HAL_VARIANT_KEYS_COUNT+1) {
/* load the module, if this fails, we're doomed, and we should not try
* to load a different variant. */
status = load(id, path, module);
}
關於path的產生還需要分析。
7)在界面上點擊按鈕,在adb shell上通過logcat查看HAL打印出來的log,如果出現下面的Log就證明你的mokoid已經ok了,上面一部分log是啟動程序打印的,下面一部分是點擊的時候打印的