android4.0.3添加 Ethernet框架支持

来源:互联网 发布:python 时间戳 整数 编辑:程序博客网 时间:2024/04/25 00:24

一、移植framework部分(+号的行代表增加的内容,-号的行代表删除的内容) 

从4.0.3 master分支移植到4.0.3_r1

1.1.将源路径framework/base/ethernet 复制到目标路径的framework/base/目录下 

1.2.修改目标路径的framework/base目录下的Android.mk 
    vpn/java/android/net/vpn/IVpnService.aidl \ 
+    ethernet/java/android/net/ethernet/IEthernetManager.aidl \ 
    voip/java/android/net/sip/ISipSession.aidl \ 

1.3. 将源路径文件frameworks/base/services/java/com/android/server/EthernetService.java复制到目标路径frameworks/base/services/java/com/android/server/目录下

1.4. 修改目标路径framework/base/service/java/com/android/server目录下的ConnectivityService.java文件
import android.net.wifi.WifiStateTracker; 
+import android.net.ethernet.EthernetStateTracker; 
import android.net.wimax.WimaxManagerConstants; 
//-----------------------------------------------------------------------------------------
if ((n.type != ConnectivityManager.TYPE_ETHERNET) && (mRadioAttributes[n.radio] == null)) {
                    loge("Error in networkAttributes - ignoring attempt to use undefined " +
                            "radio " + n.radio + " in network type " + n.type);
                    continue;
//-----------------------------------------------------------------------------------------


+case ConnectivityManager.TYPE_ETHERNET:

 

+               mNetTrackers[netType] = new EthernetStateTracker(netType, mNetConfigs[netType].name);

 +              mNetTrackers[netType].startMonitoring(context, mHandler);
 +            break;

1.5. 将源路径framework/base/core/jni/android_net_ethernet.cpp复制到目标路径framework/base/core/jni/目录下

1.6. 修改目标路径framework/base/core/jni/AndroidRuntime.cpp文件 
extern int register_android_net_wifi_WifiManager(JNIEnv* env); 
+extern int register_android_net_ethernet_EthernetManager(JNIEnv* env); 
extern int register_android_security_Md5MessageDigest(JNIEnv *env); 
//-----------------------------------------------------------------------------------------
REG_JNI(register_android_net_wifi_WifiManager), 
+REG_JNI(register_android_net_ethernet_EthernetManager), 
REG_JNI(register_android_nfc_NdefMessage), 

1.7. 修改目标路径framework/base/core/jni/Android.mk文件,添加ethernetJNI接口文件的编译项 
android_net_wifi_Wifi.cpp \ 
+android_net_ethernet.cpp \ 
android_nio_utils.cpp \ 

1.8. 修改目标路径framework/base/core/java/android/content/Context.java 
public static final String WIFI_SERVICE = "wifi"; 
+public static final String ETHERNET_SERVICE = "ethernet"; 

1.9. 修改目标路径frameworks/base/core/java/android/provider/Settings.java 
        public static final String WIFI_ON = "wifi_on"; 

 /**
         * Ethernet related configurations
         */
        public static final String ETHERNET_ON      = "ethernet_on";
        public static final String ETHERNET_MODE    = "ethernet_mode";
        public static final String ETHERNET_IP      = "ethernet_ip";
        public static final String ETHERNET_MASK    = "ethernet_netmask";
        public static final String ETHERNET_DNS     = "ethernet_dns";
        public static final String ETHERNET_ROUTE   = "ethernet_iproute";
        public static final String ETHERNET_CONF    = "ethernet_conf";
        public static final String ETHERNET_IFNAME  = "ethernet_ifname";

1.10. 修改目标路径frameworks/base/core/java/android/app/ContextImpl.java 
iimport android.net.ethernet.IEthernetManager;
import android.net.ethernet.EthernetManager;
//-----------------------------------------------------------------------------------------

registerService(ETHERNET_SERVICE, new ServiceFetcher() {
                public Object createService(ContextImpl ctx) {
                    IBinder b = ServiceManager.getService(ETHERNET_SERVICE);
                    IEthernetManager service = IEthernetManager.Stub.asInterface(b);
                    return new EthernetManager(service, ctx.mMainThread.getHandler());
                }});


1.11. 修改目标路径frameworks/base/core/res/res/values/config.xml 
<item><xliff:g id="id">wifi</xliff:g></item> 
+<item><xliff:g id="id">ethernet</xliff:g></item> 
<item><xliff:g id="id">cdma_eri</xliff:g></item> 
//-----------------------------------------------------------------------------------------
<item>"mobile_hipri,5,0,3"</item> 
+<item>"ethernet,9,9,1"</item> 

</string-array> 

1.12.frameworks/base/services/Java/com/Android/server/SystemServer.java 

import android.net.ethernet.EthernetManager;
import android.net.ethernet.EthernetStateTracker;

EthernetService ethernet = null;

 try {
                Slog.i(TAG, "Ethernet Service");
                ethernet = new EthernetService(context);
                ServiceManager.addService(Context.ETHERNET_SERVICE, ethernet);
            } catch (Throwable e) {
                reportWtf("starting Ethernt Service", e);
            }

            try {
                Slog.i(TAG, "Connectivity Service");
                connectivity = new ConnectivityService(
                        context, networkManagement, networkStats, networkPolicy);
                ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);
                networkStats.bindConnectivityManager(connectivity);
                networkPolicy.bindConnectivityManager(connectivity);
                wifi.checkAndStartWifi();
                wifiP2p.connectivityServiceReady();
                ethernet.checkAndStartEthernet();
            } catch (Throwable e) {
                reportWtf("starting Connectivity Service", e);

            }

1.13. 修改目标路径文件frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java

import android.net.wifi.WifiManager; 
+import android.net.ethernet.EthernetManager; 
+import android.net.ethernet.EthernetStateTracker; 
import android.os.Binder; 
//-----------------------------------------------------------------------------------------
String mContentDescriptionEthernet;
 // Ethernet
    boolean mEthernetEnabled, mEthernetConnected;
    int mEthernetIconId = 0; // overlay arrows for wifi direction
    int mEthernetActivity = EthernetManager.DATA_ACTIVITY_NONE;
    private static final int[] sEthImages = {
            R.drawable.connect_established,
            R.drawable.connect_no,
            R.drawable.connect_creating

        };

filter.addAction(EthernetManager.ETHERNET_STATE_CHANGED_ACTION);


 public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();
        if (action.equals(WifiManager.RSSI_CHANGED_ACTION)
                || action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)
                || action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
            updateWifiState(intent);
            refreshViews();
        } else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) {
            updateSimState(intent);
            updateDataIcon();
            refreshViews();
        } else if (action.equals(Telephony.Intents.SPN_STRINGS_UPDATED_ACTION)) {
            updateNetworkName(intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_SPN, false),
                        intent.getStringExtra(Telephony.Intents.EXTRA_SPN),
                        intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_PLMN, false),
                        intent.getStringExtra(Telephony.Intents.EXTRA_PLMN));
            refreshViews();
        } else if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION) ||
                 action.equals(ConnectivityManager.INET_CONDITION_ACTION)) {
            updateConnectivity(intent);
            refreshViews();
        } else if (action.equals(Intent.ACTION_CONFIGURATION_CHANGED)) {
            refreshViews();
        } else if (action.equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)) {
            updateAirplaneMode();
            refreshViews();
        } else if (action.equals(WimaxManagerConstants.NET_4G_STATE_CHANGED_ACTION) ||
                action.equals(WimaxManagerConstants.SIGNAL_LEVEL_CHANGED_ACTION) ||
                action.equals(WimaxManagerConstants.WIMAX_NETWORK_STATE_CHANGED_ACTION)) {
            updateWimaxState(intent);
            refreshViews();
        } else if (action.equals(EthernetManager.ETHERNET_STATE_CHANGED_ACTION)) {
            updateEth(intent);
            refreshViews();
        }
    }



private void updateEthernetIcons() {
        if (mEthernetConnected) {
            mEthernetIconId = sEthImages[0];
        } else {
            mEthernetIconId = sEthImages[1];
            }
    }


if (mEthernetConnected) {
            switch (mEthernetActivity) {
                case EthernetStateTracker.EVENT_HW_CONNECTED:
                case EthernetStateTracker.EVENT_INTERFACE_CONFIGURATION_SUCCEEDED:
                    mEthernetIconId = sEthImages[0];
                    break;
                case EthernetStateTracker.EVENT_HW_DISCONNECTED:
                case EthernetStateTracker.EVENT_INTERFACE_CONFIGURATION_FAILED:
                    mEthernetIconId = sEthImages[1];
                    return;
                    default:
                mEthernetIconId = sEthImages[2];
            }
        }


private final void updateEth(Intent intent) {
        final int event = intent.getIntExtra(EthernetManager.EXTRA_ETHERNET_STATE, EthernetManager.ETHERNET_STATE_UNKNOWN);
        switch (event) {
            case EthernetStateTracker.EVENT_HW_CONNECTED:
            case EthernetStateTracker.EVENT_INTERFACE_CONFIGURATION_SUCCEEDED:
                mEthernetIconId = sEthImages[0];
                break;
            case EthernetStateTracker.EVENT_HW_DISCONNECTED:
            case EthernetStateTracker.EVENT_INTERFACE_CONFIGURATION_FAILED:
                mEthernetIconId = sEthImages[1];
                return;
            default:
                mEthernetIconId = sEthImages[2];
        }
    }


1.14. 修改目标路径文件frameworks/base/core/jni/android_net_NetUtils.cpp

int ifc_configure(const char *ifname, in_addr_t ipaddr, uint32_t prefixLength, in_addr_t gateway, in_addr_t dns1, in_addr_t dns2);

{ "configureNative", "(Ljava/lang/String;IIIII)Z",  (void *)android_net_utils_configureInterface },

static jboolean android_net_utils_configureInterface(JNIEnv* env,
        jobject clazz,
        jstring ifname,
        jint ipaddr,
        jint prefixLength,
        jint gateway,
        jint dns1,
        jint dns2)
{
    int result;
    uint32_t lease;

    const char *nameStr = env->GetStringUTFChars(ifname, NULL);
    result = ::ifc_configure(nameStr, ipaddr, prefixLength, gateway, dns1, dns2);
    env->ReleaseStringUTFChars(ifname, nameStr);
    return (jboolean)(result == 0);
}


1.15. 修改目标路径文件frameworks/base/core/java/android/net/NetworkUtils.java

public static boolean configureInterface(String interfaceName, DhcpInfo ipInfo) {
        return configureNative(interfaceName,
            ipInfo.ipAddress,
            netmaskIntToPrefixLength(ipInfo.netmask),
            ipInfo.gateway,
            ipInfo.dns1,
            ipInfo.dns2);
    }

    private native static boolean configureNative(
        String interfaceName, int ipAddress, int prefixLength, int gateway, int dns1, int dns2);




二、移植packages部分 
2.1.复制源路径packages/apps/Settings/src/com/android/settings/ethernet目录到目标路径packages/apps/Settings/src/com/android/settings/目录下;

2.3.复制源路径packages/apps/Settings/res/drawable-hdpi/ic_settings_ethernet.png到目标路径packages/apps/Settings/res/drawable-hdpi/目录下

2.4.复制源路径packages/apps/Settings/res/drawable-mdpi/ic_settings_ethernet.png到目标路径packages/apps/Settings/res/drawable-mdpi/目录下

2.5.复制源路径packages/apps/Settings/res/layout/eth_configure.xml到目标路径packages/apps/Settings/res/layout/目录下

2.6.复制源路径packages/apps/Settings/res/xml/ethernet_settings.xml到目标路径packages/apps/Settings/res/xml/目录下

2.7. 修改目标路径文件packages/apps/Settings/res/values/strings.xml 
<string name="sound_category_feedback_title">Feedback</string> 
+<!-- Ethernet configuration dialog -->   
+<string name="eth_config_title">Configure Ethernet device</string>   
+<string name="eth_setting">Ethernet setting</string>   
+<string name="eth_dev_list">Ethernet Devices:</string>   
+<string name="eth_con_type">Connection Type</string>   
+<string name="eth_con_type_dhcp">DHCP</string>   
+<string name="eth_con_type_manual">Static IP</string>   
+<string name="eth_dns">DNS address</string>   
+<string name="eth_gw">Default Gateway</string>   
+<string name="eth_ipaddr">IP address</string>   
+<string name="eth_quick_toggle_title">Ethernet</string>   
+<string name="eth_quick_toggle_summary">Turn on Ethernet</string>   
+<string name="eth_radio_ctrl_title">Ethernet configuration</string>   
+<string name="eth_conf_perf_title">Ethernet configuration</string>   
+<string name="eth_conf_summary">Configure Ethernet devices</string>   
+<string name="eth_mask">Netmask</string>   
+<string name="eth_toggle_summary_off">Turn off Ethernet</string>   
+<string name="eth_toggle_summary_on">Turn on Ethernet</string>   

2.8. 修改目标路径文件packages/apps/Settings/res/xml/settings_headers.xml 
<!-- Ethernet -->
   <header
        android:id="@+id/ethernet_settings"
        android:title="@string/eth_radio_ctrl_title"
        android:icon="@drawable/ic_settings_ethernet"
        android:fragment="com.android.settings.ethernet.EthernetSettings"/>


2.9. 修改目标路径文件packages/apps/Settings/AndroidManifest.xml 
 <!-- Ethernet controls -->
        <activity android:name="EthernetSettings"
                android:label="@string/eth_radio_ctrl_title">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.settings.ETHERNET_SETTINGS" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.VOICE_LAUNCH" />
            </intent-filter>
        </activity>

        <activity android:name=".ethernet.EthernetEnabler"
        android:label="@string/eth_setting"
                android:clearTaskOnLaunch="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.settings.ETHERNET_SETTINGS" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.VOICE_LAUNCH" />
                <category android:name="com.android.settings.SHORTCUT" />
            </intent-filter>
        </activity>

        <activity android:name=".ethernet.EthernetConfigure"
        android:label="@string/eth_conf_perf_title"
                android:clearTaskOnLaunch="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.settings.ETHERNET_SETTINGS" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.VOICE_LAUNCH" />
                <category android:name="com.android.settings.SHORTCUT" />
            </intent-filter>
        </activity>

三、接下来要增加Ethernet的状态栏图标 
3.1.复制源路径frameworks/base/packages/SystemUI/res/drawable-hdpi/connect_creating.png到目标路径对应目录下

3.2.复制源路径frameworks/base/packages/SystemUI/res/drawable-hdpi/connect_established.png到目标路径对应目录下

3.3.复制源路径frameworks/base/packages/SystemUI/res/drawable-hdpi/connect_no.png到目标路径对应目录下

3.4.复制源路径frameworks/base/packages/SystemUI/res/drawable-mdpi/connect_creating.png到目标路径对应目录下

3.5.复制源路径frameworks/base/packages/SystemUI/res/drawable-mdpi/connect_established.png到目标路径对应目录下

3.6.复制源路径frameworks/base/packages/SystemUI/res/drawable-mdpi/connect_no.png到目标路径对应目录下


四、修改目标路径文件build/core/pathmap.mk

vpn \ 
+ethernet \ 
keystore \ 

最后记得修改init.rc,在最后增加DHCP服务 
service dhcpcd_eth0 /system/bin/dhcpcd -ABKL
          disabled
          oneshot
service iprenew_eth0 /system/bin/dhcpcd -n
          disabled
          oneshot
0 0
原创粉丝点击