我的DIY Android之旅--Android应用层APP调用底层驱动实例(辛酸历程实记)

来源:互联网 发布:mac 自动隐藏菜单栏 编辑:程序博客网 时间:2024/06/05 09:04

   现在在这个智能手机的时代, 我相信一个具有自己个性的手机才可以吸引到自己的用户,而iphone在具有创新和个性的硬件基础上建立了自己的iOS手机操作系统,给了用户一个非常特别的用户体验,从而赢得了市场,Android的迅猛发展,各种各种的Android手机不断推出,市场占有率不断上升,而且Android手机出货量也是在极大的增长,已经形成了手机操作系统三分天下的局面,并且在不断的增加着Android市场的天下。nokia主导的windows phone 8以其特有的metro风格,苹果主打的iphone以其优秀的用户体验都赢得了市场,Android以其开放性,个性化,以及越来越好的用户体验将会赢得更多的用户亲睐,而在这个过程中,我们做Android驱动开发的工程师将可以让更多更好玩的的优秀硬件集成到Android系统中,做出更个性更好的Android手机。

     刚开始学习Android开发的程序猿,我建议大家一起来学习老罗的编写linux内核驱动的教程,积累一些Android驱动开发基本的知识。

       一.在学习Android驱动开发的程序猿,我建议先看基本Android驱动开发的参考书籍:Linux Device Drivers(强烈五星级推荐),另几本好的参考书籍:android驱动开发与移植实战详解。

       二. 参考老罗的驱动编写教程,编写驱动并且在框架层实现Service框架,在eclipse中创建一个Hello的Android工程,并且把eclipse生成的R.java拷贝放在out/target/common/R目录下,从Eclipse拷贝工程过来的时候,要把gen目录删掉,不然R类的定义就会重复了。从Eclipse拷贝工程到Android源代码目录时,只留下AndroidManifest.xml文件以及res和src文件夹就可以了,其它的文件都可以删掉,然后再往里面添加一个Android.mk文件。

具体教程参考老罗的博客:http://blog.csdn.net/luoshengyang/article/details/6567257

 编译进行的比较顺利,没发现什么错误!

接着就是运行模拟器,查看应用层APP是否调用底层成功,emulator -kernel ./prebuilt/android-arm/kernel/kernel-qemu -sysdir ./out/target/product/generic -system system.img -data userdata.img -ramdisk ramdisk.img

发现很长时间模拟器都无法进入系统,一直停留在Android字符界面上,还可以看出模拟器出现反复的重启现象,我以为是编写的驱动程序和框架层的代码出现错误,我又仔细的从头检查了一遍,怀疑是编译没有正常的运行,我决定重新编译整个Android源码,哎,华丽丽的几个小时编译过去了,一切正常,并没有解决这个一直停在Android开机界面的问题

纠结着在CSDN上到处请教,并各种查资料

过了几天还是没有解决,纠结!

好不容易得到了网友 lovebeyond1014(csdn博客专栏:http://blog.csdn.net/lovebeyond1014)的帮助,在此表示感谢!在网上查资料发现,可能是编译命令的错误.

 根据网友的提示,尝试使用make droidcore编译...

我改用make droidcore来编译整个工程,代码完整编译过去了!

PS:发现一开始是执行systemimage,于是我又尝试用make systemimage来编译:
修改framework中源码,在framework/base 中mm,退至源码根目录,make systemimage后,启动模拟器,修改效果成功显示。
1.貌似执行make snod(systemimage no dependence)不行,看来要编上dependence才行。
2.在make systemimage 之后一定要关闭模拟器重开才行,执行adb shell stop,adb shell start也不行。

发现还是不行,模拟器还是会停在Android开机界面上,我查资料时突然意识到了,模拟器本身就可以获取日志来分析运行信息!晕倒,我前些天居然忘掉了这个,还到处想办法获取日志,甚至想到了在eclipse中安装自己编译好的SDK,想通过eclipse获取模拟器运行的日志,哎,真的是脑子瓦特了!!!

运行adb shell

#logcat 

D/SensorService(   67): nuSensorService starting...E/SensorService(   67): couldn't open device for module sensors (Invalid argument)I/sysproc (   67): System server: starting Android runtime.I/sI/Installer(   67): connecting...I/installd(   40): new connectionW/PackageManager(   67): Unknown permission com.google.android.googleapps.permission.GOOGLE_AUTH in package com.android.providers.contactsW/PackageManager(   67): Unknown permission com.google.android.googleapps.permission.GOOGLE_AUTH.cp in package com.android.providers.contactsW/PackageManager(   67): Unknown permission com.google.android.gm.permission.WRITE_GMAIL in package com.android.settingsW/PackageManager(   67): Not granting permission android.permission.DEVICE_POWER to package com.android.deskclock (
I/SystemServer(   67): System Content ProvidersI/ActivityThread(   67): Pub settings: com.android.providers.settings.SettingsProviderI/SystemServer(   67): Battery ServiceW/dalvikvm(   67): No implementation found for native Lcom/android/server/BatteryService;.native_update ()VW/dalvikvm(   67): threadid=9: thread exiting with uncaught exception (group=0x40015560)E/AndroidRuntime(   67): *** FATAL EXCEPTION IN SYSTEM PROCESS: android.server.ServerThreadE/AndroidRuntime(   67): java.lang.UnsatisfiedLinkError: native_updateE/AndroidRuntime(   67): at com.android.server.BatteryService.native_update(Native Method)E/AndroidRuntime(   67): at com.android.server.BatteryService.update(BatteryService.java:209)E/AndroidRuntime(   67): at com.android.server.BatteryService.<init>(BatteryService.java:135)E/AndroidRuntime(   67): at com.android.server.ServerThread.run(SystemServer.java:172)E/AndroidRuntime(   67): Error reporting crashE/AndroidRuntime(   67): java.lang.NullPointerExceptionE/AndroidRuntime(   67): at android.os.DropBoxManager.isTagEnabled(DropBoxManager.java:288)E/AndroidRuntime(   67): at com.android.server.am.ActivityManagerService.addErrorToDropBox(ActivityManagerService.java:6775)E/AndroidRuntime(   67): at com.android.server.am.ActivityManagerService.handleApplicationCrash(ActivityManagerService.java:6492)E/AndroidRuntime(   67): at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:76)E/AndroidRuntime(   67): at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:854)E/AndroidRuntime(   67): at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:851)I/Process (   67): Sending signal. PID: 67 SIG: 9I/Zygote  (   37): Exit zygote because system server (67) has terminatedE/installd(   40): eofE/installd(   40): failed to read sizeI/installd(   40): closing connectionI/ServiceManager(   32): service 'usagestats' diedI/ServiceManager(   32): service 'sensorservice' diedI/Netd    (   96): Netd 1.0 startingD/AndroidRuntime(   97): D/AndroidRuntime(   97): >>>>>> AndroidRuntime START com.android.internal.os.ZygoteInit <<<<<<D/AndroidRuntime(   97): CheckJNI is ON
I/gralloc (  105): refresh rate = 651.04 HzD/libEGL  (  105): egl.cfg not found, using default configD/libEGL  (  105): loaded /system/lib/egl/libGLES_android.soI/SurfaceFlinger(  105): EGL informations:I/SurfacI/SystemServer(  105): Telephony RegistryI/SystemServer(  105): Package ManagerI/Installer(  105): connecting...I/installd(   40): new connectionD/dalvikvm(  105): GC_CONCURRENT freed 181K, 51% free 2783K/5639K, external 716K/1038K, paused 6ms+10msW/PackageManager(  105): Running ENG build: no pre-dexopt!

仔细查资料分析,反复重启是因为初始化出现问题,系统出于保护机制,反复重启连接... 开始怀疑是权限问题,然后各种上网查资料。最后仔细分析logcat发现可能原因是出在框架层的Battery Service注册出现问题,找到框架层代码,Android2.3/frameworks/base/services/jni/onload.cpp,仔细检查,发现真的是Battery Service注册函数出现问题,我可能在修改框架层代码的时候把Battery Service的注册函数删掉了,悲剧啊....

 修改一下,接着编译整个工程代码,注意是用make droidcore 代替make snod !

重新启动模拟器,emulator -kernel ./prebuilt/android-arm/kernel/kernel-qemu -sysdir ./out/target/product/generic -system system.img -data userdata.img -ramdisk ramdisk.img,

发现驱动I/SystemServer(   69): AppWidget Service
I/SystemServer(   69): Recognition Service
I/SystemServer(   69): DiskStats Service
I/SystemServer(   69): Hello Service
I/HelloService(   69): Hello JNI: initializing......
E/HelloService(   69): Hello JNI: failed to get hello stub module.
I/WindowManager(   69): SAFE MODE not enabled

估计是make clean清掉了驱动生成的“组件”,重新编译一下驱动层代码

三:再次运行模拟器,发现一切启动正常,日志也显示正常,但是Hello.apk并没有安装到系统内置的镜像中,上网查资料,发现模拟器可以安装自定义的Android应用,我便直接执行#adb install -r Hello.apk,发现Hello.apk正常安装,哎,感叹豌豆荚也不过如此嘛,只是多了华丽的界面和一些新的功能

具体参考文档:http://www.miui.com/thread-656871-1-1.html

运行Hello应用,发现可以正常调用底层的驱动,大功告成,哎,辛酸的历程啊!!!

下一步,仔细看看Android驱动开发的知识,继续搞起.。。。