网上有很多人讲Android的HAL,都是基于jollen的实验代码的, 讲的都很好,但是缺少在板子上的实际操作。虽然这些实践步骤做过一次就很熟悉了,但是第一次还是挺麻烦的,要到处找资料,故特地在此将我在友善之臂板子上的实验步骤记录在这里,以供大家参考,少走弯路。在此不是为友善的板子打广告,他们也没给我钱,其实这板子的Android只有基本功能,不是很爽,不知后续固件是否有更新。废话说多了,下面开始吧:
1)首先mokoid下载后解压到友善的Android-2.0目录下面。可以在以下地址下载我使用的mokoid:
http://download.csdn.net/source/2974854
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是启动程序打印的,下面一部分是点击的时候打印的