自己沙发。。。。。。。。。。。。。。。。。。。。
二楼是移植过程碰到的问题友善的ROM和一般的安卓设备不一样的是,先启动linuxrc这个程序,再启动init。而linuxrc貌似也没有开源吧。所以有些init步骤就直接没有了,比如文件系统的挂载和触摸屏校准,感觉是由linuxrc完成的。因为相关的文档或说明都没有,所以移植起来有点迷茫。
最早着手开始移植的时候,直接拿了cm的源代码,放入了友善的device和vendor就开始编译,结果发现编译有很多error,都是源码system下的文件发生的,于是替换了很多system下的代码,当然相关的framework和bootloader代码也替换了一些,终于编译可以过啦,真的很高兴,但是和真正的cm编译对比了一下,缺少了很多cm特有的包,鞋特,后来才发现,原来如果不配置cm相关的编译脚本,编译出来的其实是官方版本的android,也就是android2.3.7,根本不是CM。
接下来,重头开始,试着模仿其它的配置文件,新建了vendor/cyanogenmod下的配置文件,其它什么都没改,开始编译,结果又碰到了许多错误,还是system相关的,只好又改回来,看来cm的代码和官方的代码差异还是挺大。折腾了很久,过程就不提了,十分纠结,而且是白折腾了,因为编译出来的虽然有了cm的包,但仍然缺胳膊少腿,比如少了dexopt这个文件,直接启动不了,拿了其它编译的dexop放进去,发现还有更多错误,还是启动不了,囧,看来此路不通。郁闷啊。
看来只剩下自己写device和vendor这条路了,不过总不能凭空开始写吧,得参考一下其它已经现成的范例。但是cm自带的都是需要从手机里提取prebuilt,手头上也没有手机可以试验提取,而且不做这个步骤,都不能开始编译,最关键的是,手机的平台和mini210差异太大了。上百度谷歌大神找了一下,求证了一下s5pv210和s5pc110其实是同样的芯片,只是封装不同而已。好吧,采用s5pc110的三星机子还是挺多的,比如i9000,可惜的是,手头没有i9000,所以也没办法提取文件尝试编译。
转折点是找到了这个
https://github.com/cm7sgt,samsung的galaxytab使用的正好是s5pc110平台,而且更好的是这位提供全了prebuilt,不用再自己提取了,good。下载下来,啥都不用改,编译,顺畅,一个错误都没有。
OK,开始修改,过程中碰到了许多问题,初次做移植对代码又不熟悉,十分纠结。
有一些问题总结如下:
1. Kernel panic - not syncing: Attempted to kill init!
Backtrace:
[<c0172efc>] (dump_backtrace+0x0/0x110) from [<c057a1b0>] (dump)
r6:cfc24000 r5:c07805c0 r4:c077ee1c r3:00000000
[<c057a198>] (dump_stack+0x0/0x1c) from [<c057a228>] (panic+0x7)
[<c057a1b4>] (panic+0x0/0xf0) from [<c0195a18>] (do_exit+0x74/0)
r3:c07805c0 r2:00000000 r1:00000024 r0:c06e3525
[<c01959a4>] (do_exit+0x0/0x5f4) from [<c019627c>] (do_group_ex)
r7:cfc02200
[<c01961e4>] (do_group_exit+0x0/0xc8) from [<c01a0d7c>] (get_si)
r7:cfc02200 r6:cfc27ec8 r5:00106001 r4:cfc26000
[<c01a0a24>] (get_signal_to_deliver+0x0/0x394) from [<c0171cd8>)
[<c0171c68>] (do_signal+0x0/0x688) from [<c01728e4>] (do_notify)
[<c01728c4>] (do_notify_resume+0x0/0x50) from [<c016f010>] (wor)
r4:ffffffff r3:00000000
Rebooting in 5 seconds
为了这个问题找了大神多次,有不同的答案,有的说因为ROM的相关可执行脚本或文件没有赋予权限,导致init不能执行出错,后来直接来狠的chmod 777 -R rootfs_dir,还是不行啊,有的说是文件系统mount成了只读导致的,可惜友善的init.rc根本没有这方面的内容。
后来对比了代码,改了system/core/init/init.c,增加了
+ if (!cur_command->func)
+ return;
因为友善的内核启动后,先启动的是linuxrc,再启动init,和别人不同,问题解决,但原因不明。
2. Unable to extract+optimize DEX from '/system/framework/android.policy.jar'
这个问题真的是不知如何形容啊,为了这个问题麻烦了大神更多次,但大家都说权限问题或挂载读写问题,和上面一样。如果没有logcat信息,那就可以放弃了,幸好此时已经可以看logcat了。
CM系统比较诡异的是不止有/data/dalvik-cache,还需要/cache/dalvik-cache,这点和官方系统2.3.3不同,不知道官方的2.3.7是不是也是这样。因为没有创建/cache/dalvik-cache,所以当然会出错啦,在init.rc里加入相关动作,这个问题解决。
3. FramebufferNativeWindow( 215): couldn't open framebuffer HAL (No such device
这个问题也是众说纷纭呀,普遍的说法有2种,1种是说内核中相应的board信息和android源码中的device配置文件board信息不一致导致无法引导系统。查了一下友善的内核源代码mach-s5pv110里面好像,定义的信息是SMDKV210,而我自己的device定义的是PRODUCT_BOARD := smdkv210,是对的呀,看来不是这个问题。
另一种说法是3D显示驱动有问题导致,这个时候我使用的是galaxytab的PowerVR SGX540驱动,和mini210的型号是一样的,因为怕新的系统可能会需要配合新的驱动,就保留了galaxytab的驱动,既然不成,就换回mini210自带的驱动,放置目录结构仍然不按照友善提供的文件夹位置,不然会找不到文件,果然。。。。。。出现的问题不一样了,这次是说gralloc.s5pc110.so里找不到某某函数,看来还是和系统版本有关系啊,这时又上大神那里找了找有没有地方下载驱动,结果没有找到。。。。。。卡壳了很久,试了一下用galaxytab的gralloc.s5pc110.so替换掉友善的gralloc.s5pc110.so,结果竟然可以了,真是狗屎运啊。
至此,系统已经可以启动啦。
4. setreuid() failed. errno: 2
这个问题信息太少,也不知怎么解决,至今无解。放着不管,系统也能正常使用,只是不知道会不会有什么影响。
5.nand ECC error
开机一段时间才会冒出来,无解。
6.E/MetadataRetrieverClient(269): failed to extract an album art
好像是媒体服务提取专辑封面?无关紧要把。。。
7. 编译的时候出现android build target Dex Term Could not reserve enough space for object heap
target Dex: xxxxx
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
说明你和我一样,编译开了多线程,电脑内存又小。
改build/core/definitions.mk修改防止内存不足
$(if $(findstring windows,$(HOST_OS)),,-JXms16M -JXmx1536M) \改成如下或更小
$(if $(findstring windows,$(HOST_OS)),,-JXms16M -JXmx1024M) \
8.编译指定cpu优化参数,主要是优化浮点运算,有3种情况
A.不指定
B.TARGET_GLOBAL_CFLAGS += -mtune=cortex-a8 -mfpu=vfpv3-d16 -mfloat-abi=softfp
TARGET_GLOBAL_CPPFLAGS += -mtune=cortex-a8 -mfpu=vfpv3-d16 -mfloat-abi=softfp
C.TARGET_GLOBAL_CFLAGS += -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp
TARGET_GLOBAL_CPPFLAGS += -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp
首先,使用B方案,编译通不过,而使用A方案和使用B方案,编译出来的系统,用安兔兔跑分测试了一下,基本没啥区别,所以最终A.不指定。
9.关于use samsung color format
友善的源码里添加了许多这些相关的代码,但在官方系统或Cm系统源码里都没有。
曾经使用了这个选项,而且也没在cm源码里添加相关内容,结果编译出的omx解码库在播放高清音频时会出错,后来一直寻找问题,找了好久,人都快崩溃了,才找到,后来去掉这个选项,就一切ok了,不知何故,问了大神,也没有相关内容。
[ 此帖被benjaminwan在2012-10-08 12:44重新编辑 ]