现在在这个智能手机的时代, 我相信一个具有自己个性的手机才可以吸引到自己的用户,而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.<init>(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驱动开发的知识,继续搞起.。。。