目前的android平台设备都支持wifi无线上网,但很少有支持有线上网的,说的通俗点就是插上网线就能上网。最近公司的产品要实现这个功能就研究了一下,整个移植过程是在android-x86.org的帮助下完成的。Android X86平台是由Beyounn和Cwhuang主持设计的。项目的主要目的在于为X86平台提供一套完整的Android系统解决方案。这个项目提供了一套完整的可行源代码树,配套文档以及Live CD与Live USB。其中就有一套完整的ethernet 功能。
首先去android-x86.org上下载需要移植的代码,目前的android-x86的发行版本有:
- android-x86-v0.9 (obsolete)
Based on Android 1.5 release (Cupcake). - donut-x86
Based on Android 1.6 release (Donut). - eclair-x86
Based on Android 2.1 release (Eclair). - froyo-x86
Based on Android 2.2 release (Froyo). - gingerbread-x86
Based on Android 2.3 release (Gingerbread).
platform/build
platform/frameworks/base
platform/packages/apps/Settings
多说一点的是下载是通过repo脚本进行,但是好像最近android.git.kernel.org被黑了,很多人找不到地方下载repo脚本文件了,在给大家说一个可用的站点:https://www.codeaurora.org。
下载好所需代码后怎么办呢,当然要借助对比工具看看代码的不同之处,将需要的代码移植到我们的代码上,当然这个工作量还是比较大的,需要耐心和细心。不过网上也有一些牛人移植成功了,并做了patch文件,基本上各各的patch版本网上都有可以找到,开始我也找到了一个2.3版本的patch,但是在打补丁的过程中出现了很多问题。这些问题是因为补丁文件中的行号和我代码中的对不上,我的代码以前曾经改过,行号早已跟源代码中的不同。如果你也是这种情况,不幸的告诉你。你要自己从头移植了。
现成的patch文件虽然不能直接用,但是有很好的参考价值。另外推荐一个比较文件(夹)的好工具:Beyond Compare 。
ethernet 这部分代码虽然比较复杂,但是移植确实不需要太多的看代码,说白了移植工作是一件比较烦但不用动脑子的工作。涉及修改的文件大致如下:
frameworks/base下的改动
a) frameworks/base/core/java/android/app/ContextImpl.java
b) frameworks/base/core/java/android/content/Context.java
c) frameworks/base/core/java/android/net/ConnectivityManager.java
d) frameworks/base/core/java/android/net/NetworkUtils.java
e) frameworks/base/core/java/android/provider/Settings.java
f) frameworks/base/core/jni/Android.mk
g) frameworks/base/core/jni/AndroidRuntime.cpp
h) +frameworks/base/core/jni/android_net_ethernet.cpp
i) +frameworks/base/core/res/res/drawable/connect_creating.png
+frameworks/base/core/res/res/drawable/connect_established.png
+frameworks/base/core/res/res/drawable/connect_no.png
j) +frameworks/base/core/res/res/drawable-hdpi/connect_creating.png
+frameworks/base/core/res/res/drawable-hdpi/connect_established.png
+frameworks/base/core/res/res/drawable-hdpi/connect_no.png
k) +frameworks/base/core/res/res/drawable-mdpi/connect_creating.png
+frameworks/base/core/res/res/drawable-mdpi/connect_established.png
+frameworks/base/core/res/res/drawable-mdpi/connect_no.png
l) frameworks/base/core/res/res/values/arrays.xml
m) frameworks/base/core/res/res/values/config.xml
n) +frameworks/base/ethernet
o) frameworks/base/services/java/com/android/server/status/StatusBarPolicy.java
p) frameworks/base/services/java/com/android/server/ConnectivityService.java
q) +frameworks/base/services/java/com/android/server/EthernetService.java
r) frameworks/base/Android.mk
android源码目录下packages/apps/Settings下的改动
a) +packages/apps/Settings/res/drawable-hdpi/ic_settings_ethernet.png
b) +packages/apps/Settings/res/drawable-mdpi/ic_settings_ethernet.png
c) +packages/apps/Settings/res/layout/eth_configure.xml
d) packages/apps/Settings/res/values/strings.xml
e) +packages/apps/Settings/res/xml/ethernet_settings.xml
f) packages/apps/Settings/res/xml/settings.xml
g) +packages/apps/Settings/src/com/android/settings/ethernet/
h) +packages/apps/Settings/src/com/android/settings/EthernetSettings.java
i) packages/apps/Settings/AndroidManifest.xml
build目录的改动
a) build/core/pathmap.mk
在FRAMEWORKS_BASE_SUBDIRS中加入ethernet
另外还要在init.rc中启动dhcpd服务,如下所示:
service dhcpcd_eth0 /system/bin/dhcpcd -ABKL
disabled
oneshot
上面的这些基本上是整个移植过程,也仅仅是android层的移植,在内核层也要相应的驱动支持,我采用的usb-net 设备。关于内部部分的修改这里就不说了。
此外提过一个牛人的blog,上面有一些移植过程中出现问题的解决办法。
http://wifihack.net/blog/2011/08/portethernet-patch-for-android-gingerbread/