8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
简要记录了Android5.1设备驱动的调试记录,以led为例,记录了HAL、Framework层的处理,并对调用关系进行了简要分析。
HAL Layer
1.g6818_lollipop_v51hardwarelibhardwareincludehardware创建led.h头文档
2.Z:arm6818E17160g6818_lollipop_v51hardwarelibhardwaremodules创建led文档夹
led.c
Android.mk
3.编译source build/envsetup.sh
lunch 选择 21. g6818-userdebug
mmm hardware/libhardware/modules/led/
ll out/target/product/g6818/system/lib/hw/
Frameworks Layer
1.创建JNI接口
1.1 创建frameworks/base/services/core/jni/com_android_server_LedService.cpp
1.2 修改frameworks/base/services/core/jni/onload.cpp添加注册native接口
1.3 修改frameworks/base/services/core/jni/Android.mk
添加”com_android_server_LedService.cpp”项注意:
LedService.java的java接口的入参、返回值类型一定要与com_android_server_LedService.cpp的native函数一致
否则,main.txt日志会报注册JNI接口失败”Failed to register native method”
导致zygote初始化失败,反复init
2.创建frameworks/base/services/core/java/com/android/server/LedService.java 实现服务类
修改frameworks/base/services/java/com/android/server/SystemServer.java
注册Led服务到Service Manager中
3.生成ILedService.java服务接口类
3.1 创建frameworks/base/core/java/android/os/ILedService.aidl
3.2 修改frameworks/base/Android.mk
添加编译项”core/java/android/os/ILedService.aidl”
3.3 编译
mmm frameworks/base/
4.编译mmm frameworks/base/services/
ll out/target/product/g6818/system/lib/libandroid_servers.so
框架分析
调用关系(自顶向下):1.应用Activity
private ILedService iLedService = ILedService.Stub.asInterface(ServiceManager.getService(“led”))
Client进程通过ServiceManager(Binder,Stub)向Server进程请求已注册的Led服务
2.iLedService.LedOpen()调用JNI接口,JNI转C++接口
3.C++接口通过int hw_get_module(const char *id, const struct hw_module_t **module)
加载HAL动态库led.default.so
dlsym()获取动态库led.default.so中HAL_MODULE_INFO_SYM符号表的入口地址
即struct led_module_t的地址
4.通过句柄直接调用驱动api接口->内核驱动
具体实现(自底向上):