2015-03-23 09:34
3862人阅读
收藏
举报
- logcat -s TCL_EthernetManager EthernetManager EthernetService EthernetServiceImpl EthernetNetworkFactory EthernetConfigStore TCL_EthernetDevInfo CommandListener ConnectivityService NetworkSettingsActivity Ethernetd dhcpcd NetworkMonitorNetworkAgentInfo NetworkManagementService NetdConnector NativeDaemonConnector Guide NetworkMonitorNetworkAgentInfo
一、启动流程
frameworks/base/services/java/com/android/server/SystemServer.java
- public final class SystemServer {
- private static final String ETHERNET_SERVICE_CLASS =
- "com.android.server.ethernet.EthernetService";
- public static void main(String[] args) {
- new SystemServer().run();
- }
- private void run() {
- startOtherServices();
- }
- private void startOtherServices() {
- if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_ETHERNET)) {
- mSystemServiceManager.startService(ETHERNET_SERVICE_CLASS);
- }
- }
- }
frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetService.java
- public final class EthernetService extends SystemService {
- private static final String TAG = "EthernetService";
- final EthernetServiceImpl mImpl;
- public EthernetService(Context context) {
- super(context);
- mImpl = new EthernetServiceImpl(context);
- }
- @Override
- public void onStart() {
- Log.i(TAG, "Registering service " + Context.ETHERNET_SERVICE);
- publishBinderService(Context.ETHERNET_SERVICE, mImpl);
- }
- @Override
- public void onBootPhase(int phase) {
- if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
- mImpl.start();
- }
- }
- }
frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetServiceImpl.java
- public class EthernetServiceImpl extends IEthernetManager.Stub {
- public EthernetServiceImpl(Context context) {
- mContext = context;
- Log.i(TAG, "Creating EthernetConfigStore");
- mEthernetConfigStore = new EthernetConfigStore();
- mIpConfiguration = mEthernetConfigStore.readIpAndProxyConfigurations();
- Log.i(TAG, "Read stored IP configuration: " + mIpConfiguration);
- IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
- mNMService = INetworkManagementService.Stub.asInterface(b);
- mTracker = new EthernetNetworkFactory();
- }
- public void start() {
- mCM = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
- HandlerThread handlerThread = new HandlerThread("EthernetServiceThread");
- handlerThread.start();
- mHandler = new Handler(handlerThread.getLooper());
- mEnabled = getPersistedState();
- Log.i(TAG, "Ethernet Persisted Enabled " + mEnabled);
- setState(mEnabled);
- }
- public synchronized void setState(int state) {
- enforceChangePermission();
- Log.i(TAG, "setState from mState=" + mState + " to state=" + state);
- if (mState != state) {
- mState = state;
- if (state == EthernetManager.ETHERNET_STATE_DISABLED) {
- setPersistedState(EthernetManager.ETHERNET_STATE_DISABLED);
- mTracker.stopInterface();
- mStarted.set(false);
- } else {
- setPersistedState(EthernetManager.ETHERNET_STATE_ENABLED);
- mTracker.stop();
- mTracker.start(mContext, mHandler);
- mStarted.set(true);
- }
- }
- }
- }
frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetNetworkFactory.java
- class EthernetNetworkFactory {
- EthernetNetworkFactory() {
- mNetworkInfo = new NetworkInfo(ConnectivityManager.TYPE_ETHERNET, 0, NETWORK_TYPE, "");
- mLinkProperties = new LinkProperties();
- initNetworkCapabilities();
- }
- public synchronized void start(Context context, Handler target) {
- IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
- mNMService = INetworkManagementService.Stub.asInterface(b);
- mEthernetManager = (EthernetManager) context.getSystemService(Context.ETHERNET_SERVICE);
- mFactory = new LocalNetworkFactory(NETWORK_TYPE, context, target.getLooper());
- mFactory.setCapabilityFilter(mNetworkCapabilities);
- mFactory.setScoreFilter(-1);
- mFactory.register();
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- mInterfaceObserver = new InterfaceObserver();
- try {
- mNMService.registerObserver(mInterfaceObserver);
- } catch (RemoteException e) {
- Log.e(TAG, "Could not register InterfaceObserver " + e);
- }
- updateInterfaceState(iface, true);
- }
- private void updateInterfaceState(String iface, boolean up) {
- updateAgent();
- mFactory.setScoreFilter(up ? NETWORK_SCORE : -1);
- }
- public void updateAgent() {
- mNetworkAgent.sendNetworkInfo(mNetworkInfo);
- }
- }
2.ETHERNET监听NETD进程的socket
init.rc
- service netd /system/bin/netd
- class main
- socket netd stream 0660 root system
- socket dnsproxyd stream 0660 root inet
- socket mdns stream 0660 root system
- socket fwmarkd stream 0660 root inet
frameworks/base/services/core/java/com/android/server/NetworkManagementService.java
- public static NetworkManagementService create(Context context) throws InterruptedException {
- return create(context, NETD_SOCKET_NAME);
-
-
-
- }
-
- private NetworkManagementService(Context context, String socket) {
- mConnector = new NativeDaemonConnector(
- new NetdCallbackReceiver(), socket, 10, NETD_TAG, 160, wl,
- FgThread.get().getLooper());
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- }
-
- private class NetdCallbackReceiver implements INativeDaemonConnectorCallbacks {
- public boolean onEvent(int code, String raw, String[] cooked) {
- notifyInterfaceAdded(cooked[3]);
- ......
- notifyInterfaceRemoved(cooked[3]);
- ......
- notifyInterfaceStatusChanged(cooked[3], cooked[4].equals("up"));
- ......
- notifyInterfaceLinkStateChanged(cooked[3], cooked[4].equals("up"));
- }
- private void notifyInterfaceLinkStateChanged(String iface, boolean up) {
- mObservers.getBroadcastItem(i).interfaceLinkStateChanged(iface, up);
- }
- }
frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetNetworkFactory.java
- private class InterfaceObserver extends BaseNetworkObserver {
- public void interfaceLinkStateChanged(String iface, boolean up) {
- updateInterfaceState(iface, up);
- }
- }
-
- private void updateInterfaceState(String iface, boolean up) {
- mFactory.setScoreFilter(up ? NETWORK_SCORE : -1);
- }
frameworks/base/core/java/android/net/NetworkFactory.java
- public void setScoreFilter(int score) {
- sendMessage(obtainMessage(CMD_SET_SCORE, score, 0));
- }
-
- public void handleMessage(Message msg) {
- case CMD_SET_SCORE: {
- handleSetScore(msg.arg1);
- break;
- }
- }
-
- private void handleSetScore(int score) {
- mScore = score;
- evalRequests();
- }
-
- private void evalRequests() {
- for (int i = 0; i < mNetworkRequests.size(); i++) {
- NetworkRequestInfo n = mNetworkRequests.valueAt(i);
- evalRequest(n);
- }
- }
-
- private void evalRequest(NetworkRequestInfo n) {
- needNetworkFor(n.request, n.score);
- }
-
- protected void needNetworkFor(NetworkRequest networkRequest, int score) {
- if (++mRefCount == 1) startNetwork();
- }
frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetNetworkFactory.java
- private class LocalNetworkFactory extends NetworkFactory {
- LocalNetworkFactory(String name, Context context, Looper looper) {
- super(looper, context, name, new NetworkCapabilities());
- }
- protected void startNetwork() {
- onRequestNetwork();
- }
- protected void stopNetwork() {
- }
- }
-
- public void onRequestNetwork() {
- Thread dhcpThread = new Thread(new Runnable() {
- public void run() {
- DhcpResults dhcpResults = new DhcpResults();
- if (!NetworkUtils.runDhcp(mIface, dhcpResults)) {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Log.e(TAG, "DHCP request error:" + NetworkUtils.getDhcpError());
-
-
- mFactory.setScoreFilter(-1);
- return;
- }
- mNetworkAgent = new NetworkAgent(mFactory.getLooper(), mContext,
- NETWORK_TYPE, mNetworkInfo, mNetworkCapabilities, mLinkProperties,
- NETWORK_SCORE)
- }
- });
- dhcpThread.start();
- }
三、项目问题
应用程序调用关键API
- public void updateDevInfo(EthernetDevInfo info);
配置完成以后ConnectivityService向EthernetManager发送CONNECTIVITY_ACTION_IMMEDIATE的广播;EthernetManager接收到该广播以后向应用程序发送ETHERNET_INTERFACE_CONF_CHANGED广播。否则;应用程序将TIMEOUT。
- public static final String EXTRA_ETHERNET_STATE = "ETHERNET_state";
- public static final String ETHERNET_INTERFACE_CONF_CHANGED =
- "android.net.ethernet.ETHERNET_INTERFACE_CONF_CHANGED";
- private void sendEthBroadcast(String action, boolean state) {
- String bootStr = SystemProperties.get("sys.boot_completed");
- Log.d(TAG, "sendEthBroadcast -->: " + bootStr);
- if(bootStr.equals("1")) {
- Intent intent = new Intent(action);
- intent.putExtra(EXTRA_ETHERNET_STATE, state);
-
- Log.d(TAG, "sendEthBroadcast --> action= " + action + " state=" + state);
- mContext.sendBroadcast(intent);
- }
- }
-
- sendEthBroadcast(ETHERNET_INTERFACE_CONF_CHANGED, true);
-
- sendEthBroadcast(ETHERNET_INTERFACE_CONF_CHANGED, false);
1.手动配置IP后子网掩码错误,以及子网掩码在应用不显示问题
原因:向上层应用提供信息有误
2.手动配置IP提示网关错误,以及网关获取错误问题
原因:同上
3.自动获取IP地址速度慢
原因:应用程序在等待ConnectivityService的广播通过EthernetM