Android準備往OpenWrt上移植

 

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下。

目前進展:
[cpp] 
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框架上; 

升級路線:
[cpp] 
|——————————————————– 
|  (低原始) –\                                          
|              =>得到  (低差異) –\                      
|  (低已好) –/                   =>結合 得到  (高版本)   
|                     (高原始) –/                       
|——————————————————– 
原則隻添不減(除非不可共存,相沖突)! 

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源代碼結構分析:
[cpp]
—————- 
├── 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移植主次順序:
[cpp]
—————- 
├── 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 出錯:庫定義重復
[cpp]
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出錯!

[cpp]
[    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找不到符號

[cpp] 
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補丁加上去,而是中間加上的。
我在網上搜索瞭半天也沒解決。

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

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

 

You May Also Like