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] [] (dump_backtrace+0x0/0x110) from [] (dump_stack+0x18/0x1c)
[    4.943653]  r6:dfc34000 r5:c07dc2a0 r4:c07daafc r3:00000000
[    4.943720] [] (dump_stack+0x0/0x1c) from [] (panic+0x74/0xf0)
[    4.951291] [] (panic+0x0/0xf0) from [] (do_exit+0x74/0x5f4)
[    4.958492]  r3:c07dc2a0 r2:00000000 r1:00000025 r0:c0734e90
[    4.964118] [] (do_exit+0x0/0x5f4) from [] (do_group_exit+0x98/0xc8)
[    4.972189]  r7:dfc02200
[    4.974690] [] (do_group_exit+0x0/0xc8) from [] (get_signal_to_deliver+0x358/0x394)
[    4.984120]  r7:dfc02200 r6:dfc37ec8 r5:00106001 r4:dfc36000
[    4.989682] [] (get_signal_to_deliver+0x0/0x394) from [] (do_signal+0x70/0x688)
[    4.998709] [] (do_signal+0x0/0x688) from [] (do_notify_resume+0x20/0x50)
[    5.007203] [] (do_notify_resume+0x0/0x50) from [] (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








你可能感兴趣的:(OpenWRT,OpenWrt)