Android準備往OpenWrt上移植

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

by 飛鴻驚雪

http://blog.csdn.net/niyufeng




Android準備往OpenWrt上移植


這兩天全力編譯android,cpu 4個線程全開,磁盤大吞吐的存取,導致溫度過高,編譯中間筆記本保護性質的自動休眠關機。
不說廢話,進入正題。


友善的mini6410自帶的是android-2.3.4,而tiny210自帶android-2.3.1(以及Android-4.0.3),我想把他們統一到android-2.3.7_r1,然後放到OpenWrt框架下。
之前nbd維護的android-1.6 for OpenWrt早就因爲google android服務器的更換而不能夠正常運行了。而nbd現在維護的是android 4.0,但是據他自己說只有dalvik可能能夠運行,但是我沒有編譯成功。


總之,在openwrt下的qpe已經完成的情況下,我想把android拉到openwrt下。


目前進展:

ok      0 安裝beyond compare,或使用diff腳本,測試、對比,得到files-patches;
ok      1 編譯tiny210自帶的android-2.3.1源代碼;
ok      2 編譯原始android-2.3.1的goldfish;
ok      3 編譯原始android-2.3.1 + tiny210的files-patches補丁;
        4 精簡2.3.1補丁,去除不需要的補丁,再往2.3.7上移植;
        5 分析android和nbd的源代碼,把2.3.7移植到openwrt框架上;


升級路線:

|--------------------------------------------------------
|  (低原始) --\                                         
|              =>得到  (低差異) --\                     
|  (低已好) --/                   =>結合 得到  (高版本)  
|                     (高原始) --/                      
|--------------------------------------------------------
原則只添不減(除非不可共存,相沖突)!

android的移植按如下流程:

1 android linux內核的普通驅動移植,讓內核可以在目標平臺上運行起來。
2 正確掛載文件系統:確保內核啓動參數,和android源代碼system/core/rootdir目錄下的init.rc中的文件系統掛載正確。
3 調試控制檯,讓內核啓動參數中的console參數,和android源代碼system/core/init/init.c中的console_name設置和硬件保持一致。
4 打開android相關的驅動(logger,binder等),串口輸入logcat看logger驅動起來,沒有的話調試logger驅動。


Android源代碼結構分析:

----------------
├── Makefile            全局的Makefile
├── build               系統編譯規則和配置所需要的腳本和工具
----------------
├── prebuilt		各種平臺編譯工具鏈
├── bionic              基礎C庫源代碼
----------------
├── frameworks *        Android應用程序的核心框架層(java及C++語言)
├── system     *        底層文件系統/庫/應用及組件(C語言)
├── dalvik              JAVA虛擬機
├── external            android使用的一些額外開源庫
├── libcore             與媒體播放框架代碼相關
----------------
├── packages            各種應用程序實例
├── development         程序開發所需要的實例/模板/工具
----------------
├── ndk
├── sdk
├── cts                 Android CTS兼容性規範測試用例
----------------
├── vendor     *        廠商定製代碼
├── device     *        廠商定製代碼
├── hardware   *        一些與硬件相關的庫,部分廠家開源的硬解適配層HAL代碼
├── kernel     *        Linux源代碼
├── bootable            引導加載器
├── recovery            與目標的恢復功能相關
----------------


Android移植主次順序:

----------------
├── kernel     *        (自帶,完成)		Linux源代碼
----------------
├── build               (1稍變化)(針對64 JDK)	(變化要改)	系統編譯規則和配置所需要的腳本和工具
----------------
├── vendor     *        (2最主要)(完成,相同)	(變化要改)	廠商定製代碼
├── device     *        (2最主要)(完成,相同)	(變化要改)	廠商定製代碼
├──+frameworks *x       (2最主要)(完成,不同,未改動docs,core/tests)	(變化要改)	和硬件有關的核心框架中C/C++語言要根據情況修改
----------------
├── system     *        (3主要)(完成,相同)	(變化要改)	底層文件系統/庫/應用及組件(C語言)
├── hardware   *        (3主要)(完成,相同)	(變化要改)	一些與硬件相關的庫,部分廠家開源的硬解適配層HAL代碼
├── external    x       (3主要)(完成,只添加libusb未刪除tcpdump)	(變化要改)	依賴的額外開源庫
├── libcore     x       (3次要)(變化,但未改,不同)	(變化可不改)	與媒體播放框架代碼相關
----------------
├── packages            (4次要)(完成,相同)	(變化要改)	各種應用程序實例
├──+frameworks  x       (4次要)和圖像界面有關的java程序根據需要修改
----------------
├── development         (4次要,變化)(完成,相同)	(變化可不改)	程序開發所需要的實例/模板/工具
├── cts                 (0變化,不改)	Android CTS兼容性規範測試用例
├── ndk                 (0變化,不改)
├── prebuilt		(0變化,不改)	各種平臺編譯工具鏈
├── bionic              (0無變化)	基礎C庫源代碼
├── dalvik              (0無變化)	JAVA虛擬機(dalvik是依賴於bionic編譯的)
├── bootable            (0無變化)	引導加載器
├── Makefile            (0無變化)	全局的Makefile
├── sdk                 (0無變化)
----------------



出錯及總結:


上面這1,2,3,4四個部分,都能夠編譯成功,只是在第3步以後才能夠在tiny210上運行android!


1 出錯:庫定義重複
build/core/base_rules.mk:158: *** device/samsung/crespo/sec_mm/sec_omx/sec_osal: MODULE.TARGET.STATIC_LIBRARIES.libsecosal already defined by device/samsung/sec_mm/sec_omx/sec_osal

原因:device/samsung/crespo/下的sec_mm/和device/samsung/下的sec_mm/定義重複!!
刪除device/samsung/crespo後就ok了!


2 只進行到第二部分時,測試出錯:內核不能夠啓動android

tslib可以運行,但是tslib運行過後就kernel出錯!

[    4.646506] IP-Config: Complete:
[    4.646537]      device=eth0, addr=192.168.0.101, mask=255.255.255.0, gw=192.168.0.1,
[    4.646617]      host=www, domain=, nis-domain=richardnee.com,
[    4.646668]      bootserver=192.168.0.100, rootserver=192.168.0.100, rootpath=
[    4.648401] DBUG_PORT must not use AFC!
[    4.652312] Freeing init memory: 1436K
1Wire touchscreen OK
TouchDevice: /dev/touchscreen-1wire
xres = 800, yres = 480


[    3.149864] mmc0: new high speed MMC card at address 0001
[    3.150163] mmcblk0: mmc0:0001 000000 122 MiB 
[    3.150478]  mmcblk0: p1
[    3.642449] eth0: link up, 100Mbps, full-duplex, lpa 0x45E1
[    4.646498] IP-Config: Complete:
[    4.646529]      device=eth0, addr=192.168.0.101, mask=255.255.255.0, gw=192.168.0.1,
[    4.646609]      host=www, domain=, nis-domain=richardnee.com,
[    4.646659]      bootserver=192.168.0.100, rootserver=192.168.0.100, rootpath=
[    4.648398] DBUG_PORT must not use AFC!
[    4.652309] Freeing init memory: 1436K
[    4.926688] init: cannot open '/initlogo.rle'
[    4.943464] Kernel panic - not syncing: Attempted to kill init!
[    4.943526] Backtrace: 
[    4.943577] [<c0173efc>] (dump_backtrace+0x0/0x110) from [<c05c2be0>] (dump_stack+0x18/0x1c)
[    4.943653]  r6:dfc34000 r5:c07dc2a0 r4:c07daafc r3:00000000
[    4.943720] [<c05c2bc8>] (dump_stack+0x0/0x1c) from [<c05c2c58>] (panic+0x74/0xf0)
[    4.951291] [<c05c2be4>] (panic+0x0/0xf0) from [<c0196a00>] (do_exit+0x74/0x5f4)
[    4.958492]  r3:c07dc2a0 r2:00000000 r1:00000025 r0:c0734e90
[    4.964118] [<c019698c>] (do_exit+0x0/0x5f4) from [<c0197264>] (do_group_exit+0x98/0xc8)
[    4.972189]  r7:dfc02200
[    4.974690] [<c01971cc>] (do_group_exit+0x0/0xc8) from [<c01a1d64>] (get_signal_to_deliver+0x358/0x394)
[    4.984120]  r7:dfc02200 r6:dfc37ec8 r5:00106001 r4:dfc36000
[    4.989682] [<c01a1a0c>] (get_signal_to_deliver+0x0/0x394) from [<c0172cd8>] (do_signal+0x70/0x688)
[    4.998709] [<c0172c68>] (do_signal+0x0/0x688) from [<c01738e4>] (do_notify_resume+0x20/0x50)
[    5.007203] [<c01738c4>] (do_notify_resume+0x0/0x50) from [<c0170010>] (work_pending+0x1c/0x20)
[    5.015857]  r4:ffffffff r3:00000000
[    5.019401] Rebooting in 5 seconds..
[    5.884652] eth0: no IPv6 routers present
[    5.264526] 
[    5.264545] Restart


解決方法:在第三部分system和hardware修改完成後,ok,android可以啓動!


3 出錯:java找不到符號

Install: out/target/product/smdkv210/system/app/QuickSearchBox.apk
target Java: Settings (out/target/common/obj/APPS/Settings_intermediates/classes)
packages/apps/Settings/src/com/android/settings/DisplaySettings.java:40: 軟件包 com.slsi.sec.android 不存在
import com.slsi.sec.android.HdmiService;
                           ^
packages/apps/Settings/src/com/android/settings/DisplaySettings.java:64: 找不到符號
符號: 類 HdmiService
位置: 類 com.android.settings.DisplaySettings
    private HdmiService mHdmiService;
            ^
packages/apps/Settings/src/com/android/settings/DisplaySettings.java:110: 找不到符號
符號: 類 HdmiService
位置: 類 com.android.settings.DisplaySettings
        mHdmiService = new HdmiService();
                           ^
358 Copying: out/target/common/obj/JAVA_LIBRARIES/android.policy_intermediates/emma_out/lib/classes-jarjar.jar
359 target Java: services (out/target/common/obj/JAVA_LIBRARIES/services_intermediates/classes)
360 frameworks/base/services/java/com/android/server/MountService.java:1105: 找不到符號
361 符號: 變量 usbdisk
362 位置: 類 com.android.internal.R.drawable
363         myNoti.icon = com.android.internal.R.drawable.usbdisk;
364                                                      ^


target Java: SystemUI (out/target/common/obj/APPS/SystemUI_intermediates/classes)
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarService.java:348: 找不到符號
符號: 變量 net3g
位置: 類 com.android.internal.R.drawable
                    setStatusIcon(com.android.internal.R.drawable.net3g, "Connected. (FriendlyARM-3G)");
                                                                 ^
注意:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/Ticker.java 使用了未經檢查或不安全的操作。
注意:要了解詳細信息,請使用 -Xlint:unchecked 重新編譯。


這一情況是,一開始沒有把slsi補丁加上去,而是中間加上的。
我在網上搜索了半天也沒解決。


後來乾脆把這幾個變量註釋掉,先讓編譯順利進行,註釋:
com.slsi.sec.android.HdmiService
com.android.internal.R.drawable.usbdisk
com.android.internal.R.drawable.net3g


後來發現這個usbdisk,net3g等都是tiny210的BSP,所以我在考慮是不是因爲slsi補丁中間加上去,所以就沒有把路徑加對?
重試了一下,果然,先把slsi補丁加上,就不會出現java變量找不到的錯誤!!!







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

by 飛鴻驚雪

http://blog.csdn.net/niyufeng








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