Android2.2添加Ethernet 框架支持(一)

下载android-x86的Framework 和package 两个文件夹;

网址:http://www.android-x86.org/getsourcecode

我们要移植的是android-2.2的版本,所以我们必须得到android-x86在2.2版本上的源码。

        mkdir android-x86

        cd android-x86

        repo init -u git://git.android-x86.org/manifest.git -b froyo-x86

前面初始化了android-x86,接下来你可以repo sync,只需要check out我们需要的几个文件夹,如下:

        repo sync platform/build

        repo sync platform/frameworks/base

        repo sync platform/packages/apps/Settings

下面我们将ethernet部分内容移植到自己的android源码中:

1.       将framework/base/ethernet 复制到源码的framework/base/目录下:

2.       修改源码framework/base目录下的Android.mk

LOCAL_SRC_FILES += \

         … \

         vpn/java/android/net/vpn/IVpnService.aidl \

185+:ethernet/java/android/net/ethernet/IEthernetManager.aidl

3.       将文件framework/base/service/java/com/android/server/EthernetService.java复制到 framework/base/service/java/com/android/server/目录下;

4.      修改framework/base/service/java/com/android/server目录下的ConnectivityService.java文件:


--- /home/thomas/android2.2/frameworks/base/services/java/com/android/server/ConnectivityService.java	2011-07-04 15:37:30.949468920 +0800
+++ ./frameworks/base/services/java/com/android/server/ConnectivityService.java	2011-09-08 11:02:01.927843001 +0800
@@ -28,6 +28,7 @@
 import android.net.NetworkInfo;
 import android.net.NetworkStateTracker;
 import android.net.wifi.WifiStateTracker;
+import android.net.ethernet.EthernetStateTracker;
 import android.os.Binder;
 import android.os.Handler;
 import android.os.IBinder;
@@ -235,7 +236,7 @@
                             n.mType);
                     continue;
                 }
-                if (mRadioAttributes[n.mRadio] == null) {
+                if ((n.mType != ConnectivityManager.TYPE_ETHERNET) && (mRadioAttributes[n.mRadio] == null)) {
                     Slog.e(TAG, "Error in networkAttributes - ignoring attempt to use undefined " +
                             "radio " + n.mRadio + " in network type " + n.mType);
                    continue;
@@ -243,6 +244,7 @@
                 mNetAttributes[n.mType] = n;
                 mNetworksDefined++;
             } catch(Exception e) {
+                Slog.e(TAG, "wrong dev exception " + e);
                 // ignore it - leave the entry null
             }
         }
@@ -299,8 +301,14 @@
                 wifiService.startWifi();
                 mNetTrackers[ConnectivityManager.TYPE_WIFI] = wst;
                 wst.startMonitoring();
-
                 break;
+			case ConnectivityManager.TYPE_ETHERNET:
+				if (DBG) Slog.v(TAG, "#########Starting Ethernet Service.");
+                EthernetStateTracker est = new EthernetStateTracker(context, mHandler);
+                EthernetService ethService = new EthernetService(context, est);
+                ServiceManager.addService(Context.ETHERNET_SERVICE, ethService);
+                mNetTrackers[ConnectivityManager.TYPE_ETHERNET] = est;
+                est.startMonitoring();
             case ConnectivityManager.TYPE_MOBILE:
                 mNetTrackers[netType] = new MobileDataStateTracker(context, mHandler,
                     netType, mNetAttributes[netType].mName);
@@ -310,9 +318,23 @@
                     mNetTrackers[netType].teardown();
                 }
                 break;
+				
             default:
-                Slog.e(TAG, "Trying to create a DataStateTracker for an unknown radio type " +
-                        mNetAttributes[netType].mRadio);
+                /*
+                 * The ethernet is not a radio device, but we will still need to init
+                 * it. check if this is the etherent device or not.
+                 
+                if (netType == ConnectivityManager.TYPE_ETHERNET) {
+                    if (DBG) Slog.v(TAG, "Starting Ethernet Service.");
+                    EthernetStateTracker est = new EthernetStateTracker(context, mHandler);
+                    EthernetService ethService = new EthernetService(context, est);
+                    ServiceManager.addService(Context.ETHERNET_SERVICE, ethService);
+                    mNetTrackers[ConnectivityManager.TYPE_ETHERNET] = est;
+                    est.startMonitoring();
+                } else {
+                    Slog.e(TAG, "Trying to create a DataStateTracker for an unknown radio type " +
+                    mNetAttributes[netType].mRadio);
+                }*/
                 continue;
             }
         }

JNI接口文件添加:android_net_ethernet.cpp


5.    将framework/base/core/jni/android_net_ethernet.cpp复制到源码目录framework/base/core/jni/目录下;

6.    修改framework/base/core/jni/AndroidRuntime.cpp文件,注册JNI接口文件:

--- /home/thomas/android2.2/frameworks/base/core/jni/AndroidRuntime.cpp	2011-07-04 15:37:30.109468920 +0800
+++ ./frameworks/base/core/jni/AndroidRuntime.cpp	2011-09-08 15:35:47.047843001 +0800
@@ -141,6 +141,7 @@
 extern int register_android_net_NetworkUtils(JNIEnv* env);
 extern int register_android_net_TrafficStats(JNIEnv* env);
 extern int register_android_net_wifi_WifiManager(JNIEnv* env);
+extern int register_android_net_ethernet_EthernetManager(JNIEnv* env); //Added by TCL Thomas Yang Sep.08 2011
 extern int register_android_security_Md5MessageDigest(JNIEnv *env);
 extern int register_android_text_AndroidCharacter(JNIEnv *env);
 extern int register_android_text_AndroidBidi(JNIEnv *env);
@@ -1259,6 +1260,7 @@
     REG_JNI(register_android_net_NetworkUtils),
     REG_JNI(register_android_net_TrafficStats),
     REG_JNI(register_android_net_wifi_WifiManager),
+    REG_JNI(register_android_net_ethernet_EthernetManager),//Added by TCL Thomas Yang Sep.08 2011
     REG_JNI(register_android_os_MemoryFile),
     REG_JNI(register_com_android_internal_os_ZygoteInit),
     REG_JNI(register_android_hardware_Camera),

7.      修改framework/base/core/jni/Android.mk文件,添加ethernetJNI接口文件的编译项:


--- /home/thomas/android2.2/frameworks/base/core/jni/Android.mk	2011-07-04 15:37:30.109468920 +0800
+++ ./frameworks/base/core/jni/Android.mk	2011-09-08 15:42:58.551843002 +0800
@@ -60,6 +60,7 @@
 	android_net_NetUtils.cpp \
 	android_net_TrafficStats.cpp \
 	android_net_wifi_Wifi.cpp \
+	android_net_ethernet.cpp \
 	android_nio_utils.cpp \
 	android_pim_EventRecurrence.cpp \
 	android_text_format_Time.cpp \

8.      修改framework/base/core/java/android/net/ConnectivityManager.java文件:

--- /home/thomas/android2.2/frameworks/base/core/java/android/net/ConnectivityManager.java	2011-07-04 15:37:30.017468920 +0800
+++ ./frameworks/base/core/java/android/net/ConnectivityManager.java	2011-09-07 11:29:30.185267002 +0800
@@ -190,10 +190,19 @@
      * default connections.
      */
     public static final int TYPE_WIMAX       = 6;
+
+/**
+  * The Default Ethernet data connection.  When active, all data traffic
+  * will use this connection by default.  Should not coexist with other
+  * default connections.
+  */
+    public static final int TYPE_ETHERNET    = 7; //Changed by TCL Thomas Yang Sep.07 2011
+
+
     /** {@hide} TODO: Need to adjust this for WiMAX. */
     public static final int MAX_RADIO_TYPE   = TYPE_WIFI;
     /** {@hide} TODO: Need to adjust this for WiMAX. */
-    public static final int MAX_NETWORK_TYPE = TYPE_MOBILE_HIPRI;
+    public static final int MAX_NETWORK_TYPE = TYPE_ETHERNET;   //Changed by TCL Thomas Yang Sep.07 2011
      public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI;

9.     修改framework/base/java/android/content/Context.java:

--- /home/thomas/android2.2/frameworks/base/core/java/android/content/Context.java	2011-07-04 15:37:29.997468920 +0800
+++ ./frameworks/base/core/java/android/content/Context.java	2011-09-07 11:40:50.745267001 +0800
@@ -1450,6 +1450,16 @@
      * @see android.net.wifi.WifiManager
      */
     public static final String WIFI_SERVICE = "wifi";
+
+	/**
+     * Use with {@link #getSystemService} to retrieve a {@link
+     * android.net.ethernet.EthernetManager} for handling management of
+     * ethernet access.
+     *
+     * @see #getSystemService
+     * @see android.net.ethernet.EthernetManager
+     */
    public static final String ETHERNET_SERVICE = "ethernet";  //Added by TCL Thomas Yang Sep.07 2011
     /**
Use with {@link #getSystemService} to retrieve a

10.    修改文件frameworks/base/core/java/android/provider/Settings.java

--- /home/thomas/android2.2/frameworks/base/core/java/android/provider/Settings.java	2011-07-04 15:37:30.037468920 +0800
+++ ./frameworks/base/core/java/android/provider/Settings.java	2011-09-07 14:15:12.273267001 +0800
@@ -2628,6 +2628,20 @@
         public static final String WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS =
             "wifi_mobile_data_transition_wakelock_timeout_ms";
 +		/**
+		* Added by TCL Thomas Yang Sep.07 2011
+		* For Ethernet 
+		*/
+		public static final String ETHERNET_ON = "eth_on";
+		public static final String ETHERNET_MODE = "eth_mode";
+		public static final String ETHERNET_IFNAME = "eth_ifname";
+		public static final String ETHERNET_IP = "eth_ip";
+		public static final String ETHERNET_DNS = "eth_dns";
+		public static final String ETHERNET_MASK ="eth_mask";
+		public static final String ETHERNET_ROUTE = "eth_route";
+		public static final String ETHERNET_CONF = "eth_conf";
+		
+
         /**
          * Whether background data usage is allowed by the user. See
          * ConnectivityManager for more info.

11.     修改文件:frameworks/base/core/java/android/app/ContextImpl.java

--- /home/thomas/android2.2/frameworks/base/core/java/android/app/ContextImpl.java	2011-07-04 15:37:29.973468920 +0800
+++ ./frameworks/base/core/java/android/app/ContextImpl.java	2011-09-08 13:33:12.531843001 +0800
@@ -72,6 +72,8 @@
 import android.net.Uri;
 import android.net.wifi.IWifiManager;
 import android.net.wifi.WifiManager;
+import android.net.ethernet.IEthernetManager;
+import android.net.ethernet.EthernetManager;
 import android.os.Binder;
 import android.os.Bundle;
 import android.os.DropBoxManager;
@@ -168,6 +170,7 @@
     private static ConnectivityManager sConnectivityManager;
     private static ThrottleManager sThrottleManager;
     private static WifiManager sWifiManager;
+    private static EthernetManager sEthernetManager;
     private static LocationManager sLocationManager;
     private static final HashMap<File, SharedPreferencesImpl> sSharedPrefs =
             new HashMap<File, SharedPreferencesImpl>();
@@ -936,6 +939,8 @@
             return getThrottleManager();
         } else if (WIFI_SERVICE.equals(name)) {
             return getWifiManager();
+        } else if (ETHERNET_SERVICE.equals(name)) {
+            return getEthernetManager();
         } else if (NOTIFICATION_SERVICE.equals(name)) {
             return getNotificationManager();
         } else if (KEYGUARD_SERVICE.equals(name)) {
@@ -1057,6 +1062,18 @@
         return sWifiManager;
     }
+    private EthernetManager getEthernetManager()
+    {
+        synchronized (sSync) {
+            if (sEthernetManager == null) {
+                IBinder b = ServiceManager.getService(ETHERNET_SERVICE);
+                IEthernetManager service = IEthernetManager.Stub.asInterface(b);
+                sEthernetManager = new EthernetManager(service, mMainThread.getHandler());
+            }
+        }
+        return sEthernetManager;
+    }
+
     private NotificationManager getNotificationManager() {
         synchronized (mSync) {
             if (mNotificationManager == null) {

12.     修改文件:frameworks/base/core/res/res/values/arrays.xml

--- /home/thomas/android2.2/frameworks/base/core/res/res/values/arrays.xml	2011-07-04 15:37:30.273468920 +0800
+++ ./frameworks/base/core/res/res/values/arrays.xml	2011-09-08 13:23:28.271843001 +0800
@@ -133,6 +133,7 @@
         <item><xliff:g id="id">mute</xliff:g></item>
         <item><xliff:g id="id">speakerphone</xliff:g></item>
         <item><xliff:g id="id">wifi</xliff:g></item>
+        <item><xliff:g id="id">ethernet</xliff:g></item>
         <item><xliff:g id="id">tty</xliff:g></item>
         <item><xliff:g id="id">bluetooth</xliff:g></item>
         <item><xliff:g id="id">gps</xliff:g></item>

13.  修改文件:frameworks/base/core/res/res/values/config.xml

--- /home/thomas/android2.2/frameworks/base/core/res/res/values/config.xml	2011-07-04 15:37:30.277468920 +0800
+++ ./frameworks/base/core/res/res/values/config.xml	2011-09-08 13:25:17.127843001 +0800
@@ -58,6 +58,7 @@
         <item>"mobile_mms,2,0,2"</item>
         <item>"mobile_supl,3,0,2"</item>
         <item>"mobile_hipri,5,0,3"</item>
+        <item>"ethernet,7,7,1"</item>
     </string-array>
     <!-- This string array should be overridden by the device to present a list of radio
下文待续------


 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: Android 9.0是一款广泛应用于移动设备的操作系统,它提供了强大的连接功能,包括无线和有线网络。而ethernet模块是其中一个重要的组成部分。 在Android 9.0中,ethernet模块是用于连接有线网络的功能。它允许用户通过有线网络连接设备,以获取更稳定和高速的数据传输。与无线网络相比,有线网络具有更高的带宽和更低的延迟,适用于一些对网络稳定性有更高要求的场景。比如,在办公室或家庭中,用户可以通过ethernet模块将设备连接到路由器或交换机上,以提供更稳定的网络连接。 ethernet模块的设置非常简单。用户只需将网线插入设备的ethernet接口,然后在系统设置中进行一些简单的配置即可。一般来说,用户需要指定IP地址、子网掩码、网关等网络参数。此外,用户还可以设置DNS服务器地址,以便设备能够正确解析域名。 通过ethernet模块连接有线网络后,用户可以享受到更快速的网络体验。无论是浏览网页、观看视频还是进行在线游戏,都能够感受到更低的延迟和更稳定的连接。此外,ethernet模块还可以用于实现局域网共享,用户可以在局域网内共享文件、打印机和其他资源。 总的来说,Android 9.0的ethernet模块提供了一种可靠稳定的有线网络连接方式,使用户可以更好地利用有线网络资源,以获取更高速的数据传输和更稳定的网络连接。无论是在家庭、办公室还是其他需要高稳定性网络场景中,ethernet模块都能够为用户带来更好的网络体验。 ### 回答2: Android 9.0引入了Ethernet模块,使得Android设备可以通过有线网络连接。Ethernet模块提供了一套API,供开发者在Android应用中操控有线网络。 在Android 9.0及以上版本中,Ethernet模块可以通过“EthernetManager”类相关的API进行控制。开发者可以使用这些API来管理设备的Ethernet连接,包括获取当前连接状态、启用或禁用有线网络、获取有线网络的IP地址等。 在代码中,可以通过获取EthernetManager实例,然后调用相关方法来操作Ethernet连接。例如,可以通过“getEthernetState()”方法获取Ethernet的当前连接状态,返回值为“EthernetManager.ETHERNET_STATE_DISABLED”表示有线网络已禁用,返回值为“EthernetManager.ETHERNET_STATE_ENABLED”表示有线网络已启用。 除了控制有线网络的连接状态,Ethernet模块还提供了获取有线网络的IP地址的功能。通过“getIpAddress()”方法可以获取当前有线网络的IP地址信息。 虽然Ethernet模块在Android 9.0中引入,但需要注意的是,并非所有的Android设备都支持有线网络连接。因此,在使用Ethernet模块相关功能之前,建议开发者先检查设备是否支持有线网络连接,以避免在不支持的设备上使用导致错误。 总之,Android 9.0的Ethernet模块为开发者提供了方便的API,用于管理和控制Android设备的有线网络连接。通过使用相关的API,开发者可以轻松地获取和操控有线网络的连接状态和IP地址等信息。这一功能为Android设备的网络连接提供了更多选择和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值