现在在这个智能手机的时代, 我相信一个具有自己个性的手机才可以吸引到自己的用户,而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 connection
W/PackageManager(67): Unknown permission com.google.android.googleapps.permission.GOOGLE_AUTH in package com.android.providers.contacts
W/PackageManager(67): Unknown permission com.google.android.googleapps.permission.GOOGLE_AUTH.cp in package com.android.providers.contacts
W/PackageManager(67): Unknown permission com.google.android.gm.permission.WRITE_GMAIL in package com.android.settings
W/PackageManager(67): Not granting permission android.permission.DEVICE_POWER to package com.android.deskclock (
I/SystemServer(67): System Content Providers
I/ActivityThread(67): Pub settings: com.android.providers.settings.SettingsProvider
I/SystemServer(67): Battery Service
W/dalvikvm(67): No implementation found for native Lcom/android/server/BatteryService;
.native_update ()V
W/dalvikvm(67): threadid=9: thread exiting with uncaught exception (group=0x40015560)
E/AndroidRuntime(67): *** FATAL EXCEPTION IN SYSTEM PROCESS: android.server.ServerThread
E/AndroidRuntime(67): java.lang.UnsatisfiedLinkError: native_update
E/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.(BatteryService.java:135)
E/AndroidRuntime(67):at com.android.server.ServerThread.run(SystemServer.java:172)
E/AndroidRuntime(67): Error reporting crash
E/AndroidRuntime(67): java.lang.NullPointerException
E/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: 9
I/Zygote(37): Exit zygote because system server (67) has terminated
E/installd(40): eof
E/installd(40): failed to read size
I/installd(40): closing connection
I/ServiceManager(32): service 'usagestats' died
I/ServiceManager(32): service 'sensorservice' died
I/Netd(96): Netd 1.0 starting
D/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 Hz
D/libEGL(105): egl.cfg not found, using default config
D/libEGL(105): loaded /system/lib/egl/libGLES_android.so
I/SurfaceFlinger(105): EGL informations:
I/SurfacI/SystemServer(105): Telephony Registry
I/SystemServer(105): Package Manager
I/Installer(105): connecting...
I/installd(40): new connection
D/dalvikvm(105): GC_CONCURRENT freed 181K, 51% free 2783K/5639K, external 716K/1038K, paused 6ms+10ms
W/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驱动开发的知识,继续搞起.。。。
【我的|我的DIY Android之旅--Android应用层APP调用底层驱动实例(辛酸历程实记)】