在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序

来源:互联网 发布:网络对传统文化的影响 编辑:程序博客网 时间:2024/06/18 04:57
 

在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序

标签: androidlinux内核modulestructubuntu
 102059人阅读 评论(136) 收藏 举报
 分类:

      在Android硬件抽象层(HAL)概要介绍和学习计划一文中,我们简要介绍了在Android系统为为硬件编写驱动程序的方法。简单来说,硬件驱动程序一方面分布在Linux内核中,另一方面分布在用户空间的硬件抽象层中。接着,在Ubuntu上为Android系统编写Linux内核驱动程序一文中举例子说明了如何在Linux内核编写驱动程序。在这一篇文章中,我们将继续介绍Android系统硬件驱动程序的另一方面实现,即如何在硬件抽象层中增加硬件模块来和内核驱动程序交互。在这篇文章中,我们还将学习到如何在Android系统创建设备文件时用类似Linux的udev规则修改设备文件模式的方法。

      一. 参照在Ubuntu上为Android系统编写Linux内核驱动程序一文所示,准备好示例内核驱动序。完成这个内核驱动程序后,便可以在Android系统中得到三个文件,分别是/dev/hello、/sys/class/hello/hello/val和/proc/hello。在本文中,我们将通过设备文件/dev/hello来连接硬件抽象层模块和Linux内核驱动程序模块。

      二. 进入到在hardware/libhardware/include/hardware目录,新建hello.h文件:

      USER-NAME@MACHINE-NAME:~/Android$ cd hardware/libhardware/include/hardware

      USER-NAME@MACHINE-NAME:~/Android/hardware/libhardware/include/hardware$ vi hello.h

      hello.h文件的内容如下:

      

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #ifndef ANDROID_HELLO_INTERFACE_H  
  2. #define ANDROID_HELLO_INTERFACE_H  
  3. #include <hardware/hardware.h>  
  4.   
  5. __BEGIN_DECLS  
  6.   
  7. /*定义模块ID*/  
  8. #define HELLO_HARDWARE_MODULE_ID "hello"  
  9.   
  10. /*硬件模块结构体*/  
  11. struct hello_module_t {  
  12.     struct hw_module_t common;  
  13. };  
  14.   
  15. /*硬件接口结构体*/  
  16. struct hello_device_t {  
  17.     struct hw_device_t common;  
  18.     int fd;  
  19.     int (*set_val)(struct hello_device_t* dev, int val);  
  20.     int (*get_val)(struct hello_device_t* dev, int* val);  
  21. };  
  22.   
  23. __END_DECLS  
  24.   
  25. #endif  

      这里按照Android硬件抽象层规范的要求,分别定义模块ID、模块结构体以及硬件接口结构体。在硬件接口结构体中,fd表示设备文件描述符,对应我们将要处理的设备文件"/dev/hello",set_val和get_val为该HAL对上提供的函数接口。

      三. 进入到hardware/libhardware/modules目录,新建hello目录,并添加hello.c文件。 hello.c的内容较多,我们分段来看。

      首先是包含相关头文件和定义相关结构:

      

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #define LOG_TAG "HelloStub"  
  2.   
  3. #include <hardware/hardware.h>  
  4. #include <hardware/hello.h>  
  5. #include <fcntl.h>  
  6. #include <errno.h>  
  7. #include <cutils/log.h>  
  8. #include <cutils/atomic.h>  
  9.   
  10. #define DEVICE_NAME "/dev/hello"  
  11. #define MODULE_NAME "Hello"  
  12. #define MODULE_AUTHOR "shyluo@gmail.com"  
  13.   
  14. /*设备打开和关闭接口*/  
  15. static int hello_device_open(const struct hw_module_t* module, const char* name, struct hw_device_t** device);  
  16. static int hello_device_close(struct hw_device_t* device);  
  17.   
  18. /*设备访问接口*/  
  19. static int hello_set_val(struct hello_device_t* dev, int val);  
  20. static int hello_get_val(struct hello_device_t* dev, int* val);  
  21.   
  22. /*模块方法表*/  
  23. static struct hw_module_methods_t hello_module_methods = {  
  24.     open: hello_device_open  
  25. };  
  26.   
  27. /*模块实例变量*/  
  28. struct hello_module_t HAL_MODULE_INFO_SYM = {  
  29.     common: {  
  30.         tag: HARDWARE_MODULE_TAG,  
  31.         version_major: 1,  
  32.         version_minor: 0,  
  33.         id: HELLO_HARDWARE_MODULE_ID,  
  34.         name: MODULE_NAME,  
  35.         author: MODULE_AUTHOR,  
  36.         methods: &hello_module_methods,  
  37.     }  
  38. };  

      这里,实例变量名必须为HAL_MODULE_INFO_SYM,tag也必须为HARDWARE_MODULE_TAG,这是Android硬件抽象层规范规定的。

      定义hello_device_open函数:

      

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. static int hello_device_open(const struct hw_module_t* module, const char* name, struct hw_device_t** device) {  
  2.     struct hello_device_t* dev;dev = (struct hello_device_t*)malloc(sizeof(struct hello_device_t));  
  3.       
  4.     if(!dev) {  
  5.         LOGE("Hello Stub: failed to alloc space");  
  6.         return -EFAULT;  
  7.     }  
  8.   
  9.     memset(dev, 0, sizeof(struct hello_device_t));  
  10.     dev->common.tag = HARDWARE_DEVICE_TAG;  
  11.     dev->common.version = 0;  
  12.     dev->common.module = (hw_module_t*)module;  
  13.     dev->common.close = hello_device_close;  
  14.     dev->set_val = hello_set_val;dev->get_val = hello_get_val;  
  15.   
  16.     if((dev->fd = open(DEVICE_NAME, O_RDWR)) == -1) {  
  17.         LOGE("Hello Stub: failed to open /dev/hello -- %s.", strerror(errno));free(dev);  
  18.         return -EFAULT;  
  19.     }  
  20.   
  21.     *device = &(dev->common);  
  22.     LOGI("Hello Stub: open /dev/hello successfully.");  
  23.   
  24.     return 0;  
  25. }  

      DEVICE_NAME定义为"/dev/hello"。由于设备文件是在内核驱动里面通过device_create创建的,而device_create创建的设备文件默认只有root用户可读写,而hello_device_open一般是由上层APP来调用的,这些APP一般不具有root权限,这时候就导致打开设备文件失败:

      Hello Stub: failed to open /dev/hello -- Permission denied.
      解决办法是类似于Linux的udev规则,打开Android源代码工程目录下,进入到system/core/rootdir目录,里面有一个名为ueventd.rc文件,往里面添加一行:
      /dev/hello 0666 root root
      定义hello_device_close、hello_set_val和hello_get_val这三个函数:
      
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. static int hello_device_close(struct hw_device_t* device) {  
  2.     struct hello_device_t* hello_device = (struct hello_device_t*)device;  
  3.   
  4.     if(hello_device) {  
  5.         close(hello_device->fd);  
  6.         free(hello_device);  
  7.     }  
  8.       
  9.     return 0;  
  10. }  
  11.   
  12. static int hello_set_val(struct hello_device_t* dev, int val) {  
  13.     LOGI("Hello Stub: set value %d to device.", val);  
  14.   
  15.     write(dev->fd, &val, sizeof(val));  
  16.   
  17.     return 0;  
  18. }  
  19.   
  20. static int hello_get_val(struct hello_device_t* dev, int* val) {  
  21.     if(!val) {  
  22.         LOGE("Hello Stub: error val pointer");  
  23.         return -EFAULT;  
  24.     }  
  25.   
  26.     read(dev->fd, val, sizeof(*val));  
  27.   
  28.     LOGI("Hello Stub: get value %d from device", *val);  
  29.   
  30.     return 0;  
  31. }  

      四. 继续在hello目录下新建Android.mk文件:
      LOCAL_PATH := $(call my-dir)
      include $(CLEAR_VARS)
      LOCAL_MODULE_TAGS := optional
      LOCAL_PRELINK_MODULE := false
      LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
      LOCAL_SHARED_LIBRARIES := liblog
      LOCAL_SRC_FILES := hello.c
      LOCAL_MODULE := hello.default
      include $(BUILD_SHARED_LIBRARY)
      注意,LOCAL_MODULE的定义规则,hello后面跟有default,hello.default能够保证我们的模块总能被硬象抽象层加载到。
      五. 编译:
      USER-NAME@MACHINE-NAME:~/Android$ mmm hardware/libhardware/modules/hello
      编译成功后,就可以在out/target/product/generic/system/lib/hw目录下看到hello.default.so文件了。
      六. 重新打包Android系统镜像system.img:
      USER-NAME@MACHINE-NAME:~/Android$ make snod
      重新打包后,system.img就包含我们定义的硬件抽象层模块hello.default了。
      虽然我们在Android系统为我们自己的硬件增加了一个硬件抽象层模块,但是现在Java应用程序还不能访问到我们的硬件。我们还必须编写JNI方法和在Android的Application Frameworks层增加API接口,才能让上层Application访问我们的硬件。在接下来的文章中,我们还将完成这一系统过程,使得我们能够在Java应用程序中访问我们自己定制的硬件。
老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注!
69
0
 
 

我的同类文章

  • Android WebView启动Chromium渲染引擎的过程分析2016-12-05
  • Android WebView简要介绍和学习计划2016-11-21
  • Chromium插件(Plugin)实例(Instance)创建过程分析2016-11-07
  • Chromium插件(Plugin)机制简要介绍和学习计划2016-10-24
  • Chromium扩展(Extension)的Content Script加载过程分析2016-11-25
  • Chromium扩展(Extension)加载过程分析2016-09-12
  • Android WebView加载Chromium动态库的过程分析2016-11-28
  • Chromium插件(Plugin)执行3D渲染的过程分析2016-11-14
  • Chromium插件(Plugin)模块(Module)加载过程分析2016-10-31
  • Chromium扩展(Extension)通信机制分析2016-10-10
  • Chromium扩展(Extension)的页面(Page)加载过程分析2016-09-19
更多文章

参考知识库

img

Android知识库

img

Java EE知识库

img

Java SE知识库

img

Java Web知识库

猜你在找
话说linux内核-uboot和系统移植第14部分
从零写Bootloader及移植uboot、linux内核、文件系统和驱动
I2C总线和触摸屏驱动移植实战-linux驱动开发第9部分
“攒课”课题3:安卓编译与开发、Linux内核及驱动
嵌入式Linux系统移植入门
在Ubuntu上为Android增加硬件抽象层HAL模块访问Linux内核驱动程序
在Ubuntu上为Android增加硬件抽象层HAL模块访问Linux内核驱动程序
在Ubuntu上为Android增加硬件抽象层HAL模块访问Linux内核驱动程序
在Ubuntu上为Android增加硬件抽象层HAL模块访问Linux内核驱动程序
在Ubuntu上为Android增加硬件抽象层HAL模块访问Linux内核驱动程序
查看评论
53楼 xugang4876 2015-12-14 15:56发表 [回复]
你好 最近在tiny4412 上跑您的代码 在这步的时候出现问题一直未解决 做过的朋友能帮忙看看嘛 谢谢

root@hsae-Lenovo:/opt/FriendlyARM/tiny4412/android/android-5.0.2# mmm hardware/libhardware/modules/hello/
、省略
make: Entering directory `/opt/FriendlyARM/tiny4412/android/android-5.0.2'
make: *** No rule to make target `out/target/product/tiny4412/obj/SHARED_LIBRARIES/liblog_intermediates/export_includes', needed by `out/target/product/tiny4412/obj/SHARED_LIBRARIES/hello.default_intermediates/import_includes'. Stop.
make: Leaving directory `/opt/FriendlyARM/tiny4412/android/android-5.0.2'
Re: xugang4876 2015-12-14 16:17发表 [回复]
回复xugang4876:在目录下 这个文件 还是能找到的 不过大小为0.

drwxr-xr-x 3 root root 4096 Dec 14 14:09 ./
drwxr-xr-x 7 root root 4096 Dec 14 14:09 ../
-rw-r--r-- 1 root root 12348 Dec 14 14:09 hello.o
-rw-r--r-- 1 root root 5956 Dec 14 14:09 hello.P
-rw-r--r-- 1 root root 0 Dec 14 14:09 import_includes
drwxr-xr-x 2 root root 4096 Dec 14 14:09 LINKED/
Re: xugang4876 2015-12-14 16:35发表 [回复]
回复xugang4876:还是自己粗心大意, 关注Android.mk 文件 。此类问题都是这个文件有错误。
Re: qq_32845403 2015-12-23 18:59发表 [回复]
回复xugang4876:这个问题怎么解决,我搞了一天,都不知道哪里出错了
52楼 zad190103588 2015-10-30 16:09发表 [回复]
camera系统 video0 权限是crw-rw---- 用户空间也能打开相机,这是怎么实现的 ? hello设备能否不修改权限也能访问?
Re: 罗升阳 2015-10-30 17:36发表 [回复]
回复zad190103588:应用有两种方式可以打开camera文件,应用申请了camera权限之后,PMS会将应用加入到camera用户组去,因此可以直接访问camera文件,这是第一种方式,第二种方式是是通过API请求系统帮忙打开camera文件
51楼 tian_usw 2015-08-18 13:46发表 [回复]
看了hardware提供的open接口,感觉设计的奇怪,给个二级指针参数竟然是让用的人强转来用的,还不如这么写:open(const struct hw_module_t* module, const char* name, struct hw_device_t** device, void** priv_interface)
50楼 攀登的蜗牛 2015-07-22 16:22发表 [回复]
老罗,你好,关于这篇文章有个问题没想清楚:这里的HAL模块访问内核驱动,但是是在什么地方涉及到与内核驱动的交互呢?
比如在hello_set_val 方法的实现中,有write(dev->fd, &val, sizeof(val));这样一句代码,这里的write是不是就是对应着HAL系列关于内核驱动编写那篇文章中的 .write = hello_write,也就是这里的write就是调用了内核驱动中hello_write这个方法从而达到HAL模块访问内核驱动模块??
49楼 QYanLong 2015-07-14 11:33发表 [回复]
罗老师好: 
我是在Android5.0上做的,
我这个加过了:/dev/hello 0666 root root
我抓得log:server没有成功:
I/SystemServer( 700): Freg_Service
I/FregServiceJNI( 700): Initializing HAL stub freg......
E/FregServiceJNI( 700): Failed to get HAL stub freg.
E/FregService( 700): Failed to initialize freg service.
E/SELinux ( 141): avc: denied { add } for service=freg scontext=u:r:system_server:s0 tcontext=u:object_r:default_android_service:s0 tclass=service_manager
E/ServiceManager( 141): add_service('freg',2c) uid=1000 - PERMISSION DENIED
Re: QYanLong 2015-07-14 18:03发表 [回复]
回复qinyanlonglidandan:我好想找到了解决方法:http://blog.csdn.net/wh_19910525/article/details/45170755
48楼 CPJ_Phone 2015-03-05 17:54发表 [回复]
虚心请教,,
47楼 CPJ_Phone 2015-03-05 17:54发表 [回复]
make:进入目录'/opt/FriendlyARM/tiny4412/android/android-4.1.2'
make: *** 没有规则可以创建“out/target/product/generic/obj/SHARED_LIBRARIES/audio.usb.default_intermediates/import_includes”需要的目标“out/target/product/generic/obj/SHARED_LIBRARIES/libc_intermediates/export_includes”。 停止。
make:离开目录“/opt/FriendlyARM/tiny4412/android/android-4.1.2”


???????
46楼 confidence321 2014-05-29 16:42发表 [回复]
正在学习中,争取将这六篇一块看完。
伟人的高度,真是高得恐怖啊
45楼 xshaoq 2014-05-14 15:36发表 [回复]
FATAL EXCEPTION: main
java.lang.NullPointerException
at shy.luo.freg.Freg.onClick(Freg.java:49)
at android.view.View.performClick(View.java:4204)
at android.view.View$PerformClick.run(View.java:17355)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5041)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)
照书上做出现 APK 强制退出了,怎么办
Re: 罗升阳 2014-05-16 13:24发表 [回复]
回复xshaoq:空指针,看看是不是已经成功拿到FregService服务的代理对象了
44楼 guoleimail 2014-04-05 15:43发表 [回复]
关于这段中,你的书这样写:
修改了uevent.rc文件后需要重新编译Android源码,书上你介绍使用copy 方式然后 make snod 

还有个方法:
在代码根目录make ramdisk -j8, 跟你这差不多,只是这条命令是make 自己COPY 然后生成ramdisk.img.
Re: 罗升阳 2014-04-08 14:46发表 [回复]
回复guoleimail:后面分析Android编译系统的文章有讲到用这个命令来制作ramdisk
43楼 wangqianglong1126 2013-12-17 20:11发表 [回复]
你好,老罗,我在Android4.04的源代码中添加了您的这个HAL成的代码,用mmm hardware/libhardware/modules/hello编译时出现: 
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.0.4
TARGET_PRODUCT=full
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=IMM76
============================================
make: Entering directory `/home/wql/WORKING_DIRECTORY/Android-4.04'
target thumb C: hello.default <= hardware/libhardware/modules/hello/hello.c
In file included from bionic/libc/include/sys/types.h:37,
from bionic/libc/include/fcntl.h:32,
from hardware/libhardware/modules/hello/hello.c:5:
bionic/libc/kernel/common/linux/posix_types.h:32: error: two or more data types in declaration specifiers
bionic/libc/kernel/common/linux/posix_types.h:32: error: two or more data types in declaration specifiers
不能编译成功,请问这是什么原因
Re: chenzujie 2014-10-31 20:50发表 [回复]
回复wangqianglong1126:同样遇到类似问题,请问最后如何解决的?
Re: zlp1992 2015-06-17 13:39发表 [回复]
回复chenzujie:我也碰到过这个问题,不过我的是头文件里的结构体定义后面忘了加分号,加上分号就解决了
42楼 xiahuangsong 2013-11-05 16:41发表 [回复]
罗哥,请教下,就是这里的hello_device_close是什么时候被调用呢?好像没看到地方调用了,难道系统自己最后会被调用?如果系统不自动调用岂不是会产生内存泄漏?
41楼 周群1988 2013-10-28 14:00发表 [回复]
提供android源码和开发小板,老罗写的东西直接在源码上编译生成固件,测试,有需要的朋友可以联系我
40楼 bysun2013 2013-10-17 21:18发表 [回复]
3Q,罗老师,挺你!
39楼 Skypine_Lee 2013-10-09 13:52发表 [回复]
学习中 谢谢老罗
38楼 Danny_姜 2013-08-28 17:12发表 [回复]
老罗,今天看android系统源码情景分析,有几页有错误。。比方第30页 结构体freg_device_t的第一个成员变量类型应该为hw_device_t吧
Re: 罗升阳 2013-08-29 23:39发表 [回复]
回复zxm317122667:现在不就是hw_device_t么?
Re: Danny_姜 2013-08-30 14:44发表 [回复]
回复Luoshengyang:额。。我说的是书。。。不会是印刷错误吧 哈哈
Re: 罗升阳 2013-08-31 23:21发表 [回复]
回复zxm317122667:书也没印错啊,刚检查了,第一次和第二次印刷的都没有问题。。
37楼 oldmtn 2013-07-01 14:36发表 [回复]
罗哥,我转了。。。
36楼 only0903030111 2013-05-24 15:19发表 [回复]
*device = &(dev->common); 这个不对吧,应该是这样吧*device = dev
Re: 罗升阳 2013-05-25 01:12发表 [回复]
回复only0903030111:一样的,common是dev是第一个成员变量,它们的地址是一样的。
35楼 all8023 2013-04-06 15:43发表 [回复]
楼主你好,我编译的友善之臂提供的android源码,在out/target/product/smdk210/system/lib/hw下没有生成led.default.so。我找了一下在out/target/product/smdk210/obj路径下生成了led.default.so。请问这个库算是编译成功了吗?我在写android应用程序时把这个库导入了工程里,APK程序运行的时候提示找不到这个库,能帮忙啊分析一下吗?
34楼 binglansong 2013-03-13 17:56发表 [回复]
罗老师你好,我在编译的时候,出现过这两种情况,第一次是提示:没有什么可以做的为“all_modules”。我查看了xbin那个目录,发现里面已经有一个我想要生成ledapp(可能是开发板中源码自带了一个),所以想是不是因为已经生成了app所以没有可以做的,我剪切出来,再mmm,进入目录后的提示只有一行:Istall:out/target/product/tq210/system/xbin/ledapp 。这个没有其他的生成过程的提示。又一次编译的时候提示:进入目录“/。/。/。/device/embedsky/tq210/device.mk:41:”*** commands commence before first target. 停止。因为这个生成的.so文件要复制到另一个文件夹下,我去查看那个文件夹,发现本来就有将要生成的.so文件,但是这次剪掉后还是出现同样的提示。请问是什么问题呢。谢谢罗老师
33楼 longyi0107 2013-01-10 23:43发表 [回复]
老罗,你好,看到这里我有一个疑问:
android HAL层设计是用来让厂商不用公布驱动程序的源码的?
但目前看到好像驱动程序的源码还是在添加在内核里,所以还是要公布出来,是吗?
Re: 罗升阳 2013-01-11 09:28发表 [回复]
回复longyi0107:前面有介绍:http://blog.csdn.net/luoshengyang/article/details/6567257
Re: longyi0107 2013-01-11 21:02发表 [回复]
回复Luoshengyang:仔细体会了下,有点感觉了。呵呵~
内核驱动层只提供简单的访问硬件逻辑,例如读写硬件寄存器的通道,至于从硬件中读到了什么值或者写了什么值到硬件中的逻辑,都放在硬件抽象层中去了,这样就可以把商业秘密隐藏起来了。也正是由于这个分层的原因,Android被踢出了Linux内核主线代码树中。大家想想,Android放在内核空间的驱动程序对硬件的支持是不完整的,把Linux内核移植到别的机器上去时,由于缺乏硬件抽象层的支持,硬件就完全不能用了
32楼 longkg 2012-11-21 17:34发表 [回复]
罗老师你好,我现在想将framebuffer里面的数据直接拷贝出来,那么本地层如何通过jni接口直接往java层传递一连串的字符串呢?
Re: 罗升阳 2012-11-21 21:12发表 [回复]
回复longkg:传它符串和传其它值是一样的嘛,你可以看一下JNI的数据类型有哪些,怎么用。
31楼 孙培雨 2012-11-02 16:01发表 [回复]
我下的4.1的,log.h里面已经没有LOGI、LOGE函数了,变成ALOGI、ALOGE了。
Re: qq529112036 2015-01-09 14:59发表 [回复]
回复sudev:谢谢你的说明,赞一下!
Re: 罗升阳 2012-11-02 21:13发表 [回复]
回复sudev:那就要改一下这里的代码了,不过即使这些变了,基本原理也还是一样的~
Re: 孙培雨 2012-11-07 20:58发表 [回复]
回复Luoshengyang:恩,是的!
30楼 百無一用是書生 2012-10-23 21:52发表 [回复]
这几天把这一系列的实做给练习了一便,感觉不错,遇到的问题就是/dev/hello权限的问题。下边主要是对/dev/hello权限的修改提供一下自己的笨方法。仅供参考。
方法1。devices.h这个文件修改还是不能解决的可以去改/system/core/rootdir/init.rc ,加上chmod 777 /dev 和chmod 777 /dev/hello.注意有的时候你可能要改提供商的init.rc,一股可能在/device/厂商/板子平台/ 实在不行全局搜索。
方法2。直接再系统启动后,在主机用命令adb shell mount -o remount rw /dev, 然后adb shell进入板子,再chmod 777 /dev 和chmod 777 /dev/hello. 接下来再stop命令和start命令重启android.记住不是重启板子!!!
另外adb shell mount -o remount rw 目标 非常好用,有的时候要push一些东西但又没有权限时可以用这条指令。。
29楼 Chris-Yu 2012-10-18 10:50发表 [回复]
为什么我按照你的做了,编译通过了还是没有看见hello.default.so 文件
Re: 罗升阳 2012-10-18 11:04发表 [回复]
回复chdyuxin:那编译出来的是什么文件?
28楼 suifeng 2012-08-09 14:47发表 [回复]
我把自己奇怪的错误,贴在这里,希望其他人不要再犯类似的错误:
build/core/base_rules.mk:73: unusual tags optinal on hello.default at hardware/libhardware/modules/hello
target C: hello.default <= hardware/libhardware/modules/hello/hello.c
target SharedLib: hello.default (out/target/product/adv_x86/obj/SHARED_LIBRARIES/hello.default_intermediates/LINKED/hello.default.so)
out/target/product/adv_x86/obj/lib/crtbegin_so.o: In function `__do_global_dtors_aux':
(.text+0x25): undefined reference to `__cxa_finalize'
out/target/product/adv_x86/obj/lib/crtbegin_so.o: In function `atexit':
(.text+0xcb): undefined reference to `__cxa_atexit'
out/target/product/adv_x86/obj/lib/crtbegin_so.o: In function `__stack_chk_fail_local':
。。。
make: *** [out/target/product/adv_x86/obj/SHARED_LIBRARIES/hello.default_intermediates/LINKED/hello.default.so] Error 1
make: Leaving directory `/home/txf/ANDROID'
解决方法:
从modules下的其他目录里面,拷贝一个Android.mk 文件放在hello 目录中间,然后将需要的项修改即可!
27楼 qinyun188 2012-04-11 15:28发表 [回复]
你好,我想问一下,我按你的步骤编译下来,但是我的out/target/product/这个目录下没有生成generic文件,只有ideal6410这个目录,在这个目录下就有/system/lib/hw,但是里面没有生成hello.default.so 呢?
Re: 简单并快乐着 2012-08-02 11:52发表 [回复]
回复qinyun188:也许不在这个路径
/system/lib/hw 这个是有的。
O(∩_∩)O哈哈~,搜索一下,总会有的。
我照着博主的做,搞完整个流程了。
蛮好玩的。
Re: qinyun188 2012-08-03 10:42发表 [回复]
回复lqxandroid2012:嗯,那时候我是按着流程来移植一个从顶层到底层的应用,已经做好了。还是谢谢。。。
26楼 manshq163com 2012-04-09 17:26发表 [回复]
正在做android 的产品,搜索到了楼主的博客,太好了写的,必须要顶一下.另外楼主能否写一下关于android 内核驱动调试的方法可以吗 ,对我们这种初学者来说,很有帮助
25楼 kongji123 2012-04-08 10:41发表 [回复] [引用] [举报]
LZ,怎么我编译
mmm hardware/libhardware/moudles/hello报错,
make:进入目录'/home/yzh/android2.3_lau'
make: *** 没有规则可以创建“out/target/product/generic/obj/SHARED_LIBRARIES/hello.default_intermediates/hello.o”需要的目标“/hello.c”。 停止。
make:离开目录“/home/yzh/android2.3_lau”
我在hello目录下有hello.c 和Android.mk,怎么报需要目标“/hello.c”
这个问題到底怎么解决啊,这个哥们只是说知道了,但并没有说怎么解决的
Re: kongji123 2012-04-08 14:34发表 [回复] [引用] [举报]
回复kongji123:问题已找到,是Android.mk中字符格式问题,在把老罗的内容复制粘贴到新建的Android.mk文件的时候字符格式可能发生了变化,后来自己把modules目录下overlay项目下的Android.mk复制过来修改成hello的则编译通过
0 0
原创粉丝点击