編譯移植android 2.3到tiny210

原創作品,轉載請註明原作者及地址!

by 飛鴻驚雪



這兩天玩android,做個小結吧。


避免麻煩,直接從nfs啓動,下面是我常用的幾個參數。
1 從nfs啓動android (tiny210自帶的android根文件系統,使用自己稍加修改編譯好的tiny210自帶kernel,自己編譯的uboot啓動)。使用下面的bootargs:
console=ttySAC0,115200 root=/dev/nfs nfsroot=192.168.0.100:/tftpboot/nfs ip=192.168.0.101:192.168.0.100:192.168.0.1:255.255.255.0:www.richardnee.com:eth0:off init=/linuxrc androidboot.console=s3c2410_serial0

2 從nfs啓動qtopia linux (tiny210自帶qtopia根文件系統,使用自己稍加修改編譯好的tiny210自帶kernel,自己編譯的uboot啓動)。使用下面的bootargs:
console=ttySAC0,115200 root=/dev/nfs nfsroot=192.168.0.100:/tftpboot/nfs ip=192.168.0.101:192.168.0.100:192.168.0.1:255.255.255.0:www.richardnee.com:eth0:off init=/linuxrc

3 從nfs啓動openwrt,使用生成好的uImage,uboot能夠啓動。使用下面的bootargs:
console=ttySAC0,115200 root=/dev/nfs nfsroot=192.168.0.100:/tftpboot/nfs ip=192.168.0.101:192.168.0.100:192.168.0.1:255.255.255.0:www.richardnee.com:eth0:off 

使用第1個是用來測試啓動android。


使用自己稍加修改編譯好的tiny210自帶kernel,uboot可以成功啓動tiny210自帶的android系統。

下面內核保持不變,啓動自己編譯的android-2.3.1(目前這個源代碼還是友善自帶的,自己還沒開始動手移植),出現如下情況:

[ 3.642451] eth0: link up, 100Mbps, full-duplex, lpa 0x45E1
[ 4.646504] IP-Config: Complete:
[ 4.646535] device=eth0, addr=192.168.0.101, mask=255.255.255.0, gw=192.168.0.1,
[ 4.646615] host=www, domain=, nis-domain=richardnee.com,
[ 4.646665] bootserver=192.168.0.100, rootserver=192.168.0.100, rootpath=
[ 4.648396] DBUG_PORT must not use AFC!
[ 4.652311] Freeing init memory: 1436K
1Wire touchscreen OK
/init: line 103: can't open /r/dev/console: no such file
[ 4.841750] Kernel panic - not syncing: Attempted to kill init!
[ 4.841812] Backtrace: 
[ 4.841864] [<c0173efc>] (dump_backtrace+0x0/0x110) from [<c05c2be0>] (dump_stack+0x18/0x1c)
[ 4.841940] r6:dfc34000 r5:c07dc2a0 r4:c07daafc r3:00000000
[ 4.842008] [<c05c2bc8>] (dump_stack+0x0/0x1c) from [<c05c2c58>] (panic+0x74/0xf0)

因爲是最高權限生成rootfs_dir的,因此也要使用最高權限才能cp,比如rootfs_dir/dev/下的設備文件,

上面的錯誤就是使用一般權限導致/dev/console沒有拷貝過去!
sudo ./genrootfs.sh
sudo cp rootfs_dir/ /tftpboot/nfs -fpRv

繼續出錯:
[ 139.032041] request_suspend_state: wakeup (0->0) at 138479524004 (2011-08-13 20:12:20.456813585 UTC)
[ 139.034670] init: untracked pid 144 exited
[ 139.035349] init: untracked pid 145 exited

網上很多人也出現了同樣的錯誤。歸納起來主要三個原因:
1 system/lib/hw/下缺少gralloc.default.so
           把out/target/product/OK6410/obj/SHARED_LIBRARIES/gralloc.default_intermediates/LINKED下把這個文件放到文件系統的/system/lib/hw下就可以啓動了

參看:http://blog.csdn.net/zjg555543/article/details/7787905


2 如果是掛載nfs,檢查nfs權限
       a 關閉防火牆
       b 可以在/etc/exports 中配置nfs服務,增加rw,no_root_squash,可以解決此問題

參看:http://blog.csdn.net/zjg555543/article/details/7787905


3 還出現該問題,說明init程序所在的分區權限不夠。 參看:http://my.oschina.net/u/246816/blog/48892

mount rootfs rootfs / ro remount
改成
mount rootfs rootfs / rw remount

其他還有比如opengl等驅動不正確等問題導致的(http://blog.chinaunix.net/uid-7922708-id-3048378.html)。


一開始我也苦苦找尋原因,可是上面三者都不是我的原因。因此來招笨的,直接把友善自帶的android/system/代替自己編譯的,ok,一起成功啓動。

然後我就對比了友善tiny210自帶android和我編譯的有啥區別:
除了data和system,其他目錄、文件,包括/下的linuxrc,init,init.*.rc,uevent.*.rc都完全相同!!
而上面的測試可以知道,正是是因爲system中的內容不同,導致了上述的錯誤!!
好了,再開始對比system下的內容,不同的文件有:
############ android編譯生成的 ##########
system/framework
system/xbin
system/app

system/lib/libhardware_legacy.so
system/lib/libmock_ril.so
system/lib/libwebcore.so

system/etc/security/otacerts.zip	(android-2.3.1自帶)
+system/etc/ts.detected	 (tslib校驗時生成的)

########### 開發板BSP ############
system/lib/modules/2.6.35.7-FriendlyARM/ 沒有不同
+system/lib/hw/gps.mini6410.so	 只多出了gps.mini6410.so
system/lib/hw/gps.mini210.so

然後在只把tiny210自帶android的system/framwork/下的framwork*和core*.jar直接cp就可以啓動我自己編譯的了!!
最後發現:
-rw------- 1 richardnee richardnee 2.8M 2012-10-26 04:07 framework.jar
-rw-r--r-- 1 richardnee richardnee 4.4M 2012-10-26 04:02 framework-res.apk
-rw------- 1 richardnee richardnee 1.8M 2012-10-26 04:04 core.jar
-rw-r--r-- 1 richardnee richardnee 9.9K 2012-10-26 04:05 core-junit.jar

修改他們的權限爲644,o(∩∩)o...哈哈,終於可以運行了!!

原來是這個原因!!實際上就是剛剛提到的第三個原因:權限不夠!!






原創作品,轉載請註明原作者及地址!

by 飛鴻驚雪







發佈了103 篇原創文章 · 獲贊 16 · 訪問量 38萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章