參考:
http://blog.csdn.net/weiqing1981127/article/details/8521600
一.以太網framework分析
啟動流程:SystemServer類的main函數:The main entry point from zygote,開機的時候執行
main : SystemServer.java (frameworks\base\services\java\com\android\server)
new SystemServer().run();
run //系統server的初始化
startOtherServices(); //初始化startBootstrapServices();,startCoreServices();之后
ServiceManager.addService(Context.NETWORKMANAGEMENT_SERVICE, networkManagement);
mSystemServiceManager.startService(ETHERNET_SERVICE_CLASS); //初始化Internet server
//SystemServiceManager.java (frameworks\base\services\core\java\com\android\server)
startService(String className)
//Starts a service by class name. //
SystemServiceManager.java (frameworks\base\services\core\java\com\android\server)
startService(serviceClass); //Creates and starts a system service
service = constructor.newInstance(mContext); //構建一個實例
mServices.add(service); //注冊sever
service.onStart(); //啟動servece
EthernetService : 這里我們分析的severce是internet的
//EthernetService.java (frameworks\opt\net\ethernet\java\com\android\server\ethernet)
new EthernetServiceImpl(context);
//new EthernetServiceImpl
publishBinderService(Context.ETHERNET_SERVICE, mImpl); 啟動EthernetServiceImpl的start\
//EthernetServiceImpl.java (frameworks\opt\net\ethernet\java\com\android\server\ethernet),用來操作以太網
EthernetServiceImpl //構造函數
new EthernetConfigStore(); //This class provides an API to store and manage Ethernet network configuration.
readIpAndProxyConfigurations
writeIpAndProxyConfigurations
new EthernetNetworkFactory(mListeners); //Manages connectivity for an Ethernet interface.
//
EthernetNetworkFactory.java (frameworks\opt\net\ethernet\java\com\android\server\ethernet)
new NetworkInfo(ConnectivityManager.TYPE_ETHERNET, 0, NETWORK_TYPE, ""); //Describes the status of a network interface.
new LinkProperties(); //Describes the properties of a network link.
initNetworkCapabilities(); //設置網卡的功能
start() //
EthernetServiceImpl的執行函數,
Starting Ethernet service
new HandlerThread("EthernetServiceThread"); //初始化
Thread,創建線程Handy class for starting a new thread that has a looper
handlerThread.start(); //啟動線程
new Handler(handlerThread.getLooper());
//用來發送和處理與線程消息隊列相關的Message以及Runnable對象
mTracker.start(mContext, mHandler); //執行EthernetNetworkFactory類中的start
start //EthernetNetworkFactory中,Begin monitoring connectivity
mIfaceMatch = context.getResources().getString(
com.android.internal.R.string.config_ethernet_iface_regex); //
Interface match regex.匹配
mFactory = new LocalNetworkFactory(NETWORK_TYPE, context, target.getLooper()); // Create and register our NetworkFactory.
mFactory.register();
mInterfaceObserver = new InterfaceObserver(); //Start tracking interface change events.
mNMService.listInterfaces(); // If an Ethernet interface is already connected, start tracking that.
updateInterfaceState(iface, true); //We have our interface. Track it.
//注冊
mFactory.setScoreFilter(up ? NETWORK_SCORE : -1);
//設置scroe值;這個是網絡優先級判斷依據
mStarted.set(true); //設置serverce已經啟動
二.以太網mt6735移植-kernel部分
1.config里面添加一些宏定義
+ONFIG_MISC_VIA=y
+CONFIG_USB_USBNET=y+CONFIG_USB_NET_AX8817X=y+CONFIG_USB_NET_CDCETHER=y+CONFIG_USB_NET_CDC_EEM=y+CONFIG_USB_NET_CDC_NCM=y+CONFIG_USB_NET_DM9601=y+CONFIG_USB_NET_SMSC75XX=n+CONFIG_USB_NET_SMSC95XX=n+CONFIG_USB_NET_GL620A=n+CONFIG_USB_NET_NET1080=y+CONFIG_USB_NET_PLUSB=y+CONFIG_USB_NET_MCS7830=n+CONFIG_USB_NET_RNDIS_HOST=y+CONFIG_USB_NET_CDC_SUBSET=y+CONFIG_USB_ALI_M5632=n+CONFIG_USB_AN2720=n+CONFIG_USB_BELKIN=y+CONFIG_USB_ARMLINUX=y+CONFIG_USB_EPSON2888=n+CONFIG_USB_KC2190=n+CONFIG_USB_NET_ZAURUS=y+CONFIG_USB_NET_CX82310_ETH=n+CONFIG_USB_NET_KALMIA=n+CONFIG_USB_NET_QMI_WWAN=n+CONFIG_USB_HSO=y+CONFIG_USB_NET_INT51X1=n+CONFIG_USB_CDC_PHONET=n+CONFIG_USB_IPHETH=n+CONFIG_USB_SIERRA_NET=n+CONFIG_USB_VL600=n
三.以太網mt6735移植-中間層部分
1.DHCP的util
system/core/libnetutils/dhcp_utils.c的dhcp_do_request函數403行
這里主要是自動分配ip的一個文件,這里需要改動下參數
原來:
// snprintf(daemon_cmd, sizeof(daemon_cmd), "%s_%s:-A -f %s -h %s %s", DAEMON_NAME,
// p2p_interface,DHCP_CONFIG_PATH, prop_value, interface);
改成:
snprintf(daemon_cmd, sizeof(daemon_cmd), "%s_%s", DAEMON_NAME, interface);
ALOGE("dhcp_do_request property_get ok daemon_cmd = %s", daemon_cmd);
原來:
// snprintf(daemon_cmd, sizeof(daemon_cmd), "%s_%s:-A -f %s %s", DAEMON_NAME, p2p_interface,
// DHCP_CONFIG_PATH, interface);
改成:
snprintf(daemon_cmd, sizeof(daemon_cmd), "%s_%s", DAEMON_NAME, interface);
ALOGE("dhcp_do_request property_get fail daemon_cmd = %s", daemon_cmd);
2.加上系統sevice
+//Add for usb to RJ45 Ethernet
+service dhcpcd_eth0 /system/bin/dhcpcd -ABKL -d eth0
+ class main
+ disabled
+ oneshot
+//End
+//Add for usb to RJ45 Athernet
+service iprenew_eth0 /system/bin/dhcpcd -n
+ class main
+ disabled
+ oneshot
四.以太網mt6735移植-framework部分
1.啟動ETHERNET_SERVICE_CLASS
frameworks/base/services/java/com/android/server/SystemServer.java的startOtherServices函數里面:
// if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_ETHERNET)) {
Slog.e(TAG, "on mSystemServiceManager.startService");
mSystemServiceManager.startService(ETHERNET_SERVICE_CLASS); //啟動service
// }
2.在標准的Framework中添加自己的新的資源
frameworks/base/core/res/res/values/config.xml 這是framework的默認配置
<string-array name="config_statusBarIcons"> //這里是添加配置欄
+<item><xliff:g id="id">ethernet</xliff:g></item>
<string-array translatable="false" name="networkAttributes"> //這里是framework里面需要的屬性
+
<item>"ethernet,9,9,1,-1,true"</item>
<string-array translatable="false" name="radioAttributes"> //這里是添加無線的屬性
+
<item>"9,9"</item>
+
<string-array translatable="false" name="config_tether_ethernet_regexs"> //這里是加入一個端點,比如eth0
+<item>"eth\\d"</item>
+</string-array>
3.在系統的framework/base/core/res/res中添加字串等資源,需要在framework/base/core/res/res/values/symbols.xml中同步添加資源字串,否則編譯會出錯。
frameworks/base/core/res/res/values/symbols.xml
//這里添加是因為在config.xml里面添加了新的一欄
<java-symbol type="array" name="config_tether_ethernet_regexs" />
四.以太網mt6735移植-app部分(Setting)
1.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.EthernetConfigDialog" 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>
2.增加eth用的的字符串資源
packages/apps/Settings/res/values/strings.xml
<!-- 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_dns1">DNS address 1</string>
<string name="eth_dns2">DNS address 2</string>
<string name="eth_gw">Gateway address</string>
<string name="eth_ipaddr">IPv4 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</string>
<string name="eth_conf_perf_title">Ethernet configuration</string>
<string name="eth_conf_summary">Configure Ethernet devices</string>
<string name="eth_pre_length">Network prefix length</string>
<string name="eth_toggle_summary_off">Turn off Ethernet</string>
<string name="eth_toggle_summary_on">Turn on Ethernet</string>
3.添加Setting子菜單
packages/apps/Settings/res/xml/dashboard_categories.xml
<!-- Ethernet -->
<dashboard-tile
android:id="@+id/ethernet_settings"
android:title="@string/eth_radio_ctrl_title"
android:fragment="com.android.settings.EthernetSettings"
android:icon="@drawable/ic_settings_ethernet" />
所謂的dashboard就是Settings模塊首界面的一個抽象。而dashboard-categorys則是設置分類集合的抽象,而dashboard-category是分類的抽象,dashboard-tile就是分類下每個選項的抽象了。代碼中的List<DashboardCategory>對應dashboard-categorys, DashboardCategory對應dashboard-category,而dashboard-tile則對因代碼中的DashboardTile。
4.eth圖標, layout文件,媒體聲音,Seting文件
圖標:packages/apps/Settings/res/drawable-hdpi/

layout:packages/apps/Settings/res/layout/
媒體聲音:packages/apps/Settings/res/raw/
Seting文件:packages/apps/Settings/res/xml/ethernet_settings.xml
5.Setting程序:
packages/apps/Settings/src/com/android/settings/EthernetSettings.java
setting的一些操作
子activity文件:packages/apps/Settings/src/com/android/settings/ethernet