100 19 Android Ethernet http cafe naver comembeddedcrazyboys
망고 100 보드로 놀아보자-19 Android Ethernet 분석 http: //cafe. naver. com/embeddedcrazyboys http: //www. mangoboard. com
Android Activity Lifecycle
안드로이드 Ethernet Config 추가
안드로이드 Ethernet Config 추가
Setting. xml 과 Icon. Preference. Screen <com. android. settings. Icon. Preference. Screen android: title="@string/eth_radio_ctrl_title" settings: icon="@drawable/ic_settings_ethernet"> <intent android: action="android. intent. action. MAIN" android: target. Package="com. android. settings" android: target. Class="com. android. settings. Ethernet. Settings" /> </com. android. settings. Icon. Preference. Screen>
XML과 Ethernet. Settings class관 계 <com. android. settings. Icon. Preference. Screen android: title="@string/eth_radio_ctrl_title" settings: icon="@drawable/ic_settings_ethernet"> <intent android: action="android. intent. action. MAIN" android: target. Package="com. android. settings" android: target. Class="com. android. settings. Ethernet. Se ttings" /> </com. android. settings. Icon. Preference. Screen>
Ethernet Service 초기화 (Ethernet. Manager) get. System. Service(ETH_SERVICE), . /packages/apps/Settings/src/com/android/settings/Ethernet. Settings. jav a }else if (ETH_SERVICE. equals(name)) { return get. Ethernet. Manager(); . /frameworks/base/core/java/android/app/Application. Context. java private Ethernet. Manager get. Ethernet. Manager() { synchronized (s. Sync) { if (s. Eth. Manager == null) { IBinder b = Service. Manager. get. Service(ETH_SERVICE); IEthernet. Manager service = IEthernet. Manager. Stub. as. Interface(b); s. Eth. Manager = new Ethernet. Manager(service, m. Main. Thread. get. Handler()); . /frameworks/base/core/java/android/app/Application. Context. java
Service Manager Ethernet 등록 private Ethernet. Manager get. Ethernet. Manager() { synchronized (s. Sync) { if (s. Eth. Manager == null) { IBinder b = Service. Manager. get. Service(ETH_SERVICE); IEthernet. Manager service = IEthernet. Manager. Stub. as. Interface(b); s. Eth. Manager = new Ethernet. Manager(service, m. Main. Thread. get. Handler()); . /frameworks/base/core/java/android/app/Application. Context. java Connectivity service에서 등록 private Connectivity. Service(Context context) { …. Service. Manager. add. Service(Context. ETH_SERVICE, eth. Service); . /frameworks/base/services/java/com/android/server/Connectivity. Service. java
Service Manager 역할 POWER_SERVI CE CONNECTIVITY _SERVICE Servic e manag er … ETH_SERVICE
Connectivity Service wifi ethern et Connectivi ty service …. mms
Ethernet service (부팅 시) private Connectivity. Service(Context context) { if (DBG) Log. v(TAG, "Connectivity. Service starting up"); if (DBG) Log. v(TAG, "Starting Ethernet Service"); m. Ethernet. State. Tracker = new Ethernet. State. Tracker(context, m. Handler); Ethernet. Service eth. Service = new Ethernet. Service(context, m. Ethernet. State. Tracker); Service. Manager. add. Service(Context. ETH_SERVICE, eth. Service); m. Net. Trackers[Connectivity. Manager. TYPE_ETH] = m. Ethernet. State. Tracker;
자손클래스에서 조상클래스로부터 상속받은 멤버를 Ethernetsuper는 service (부팅 시) 참조하는데 사용되는 참조변수 public Ethernet. State. Tracker(Context context, Handler target) { super(context, target, Connectivity. Manager. TYPE_ETH, 0, "ETH", ""); Log. i(TAG, "Starts. . . "); if(Ethernet. Native. init. Ethernet. Native() != 0 ) { Log. e(TAG, "Can not init ethernet device layers"); return; }
Ethernet service (부팅 시) static JNINative. Method g. Ethernet. Methods[] = { {"wait. For. Event", "()Ljava/lang/String; “, (void *)android_net_ethernet_wait. For. Event}, {"get. Interface. Name", "(I)Ljava/lang/String; “, void )android_net_ethernet_get. Interface. Name}, {"init. Ethernet. Native", "()I“, (void *)android_net_ethernet_init. Ethernet. Native}, {"get. Interface. Cnt", "()I“, (void *)android_net_ethernet_get. Interface. Cnt} }; static jint android_net_ethernet_init. Ethernet. Native(JNIEnv *env, jobject clazz) { if ((ret = netlink_init_interfaces_list()) < 0) {
Ethernet service (부팅 시) static int netlink_init_interfaces_list(void) {. . if ((netdir = opendir(SYSFS_CLASS_NET)) != NULL) { while((de = readdir(netdir))!=NULL) { static const char SYSFS_CLASS_NET[] = "/sys/class/net"; snprintf(path, SYSFS_PATH_MAX, "%s/%s/ifindex", SYSFS_CLASS_NET, de>d_name); if ((ifidx = fopen(path, "r")) != NULL ) {
Ethernet service (부팅 시)
Ethernet Service 등록 Flow private Connectivity. Service(Context context) { … if (DBG) Log. v(TAG, "Starting Ethernet Service"); m. Ethernet. State. Tracker = new Ethernet. State. Tracker(context, m. Handler); Ethernet. Service eth. Service = new Ethernet. Service(context, m. Ethernet. State. Tracker); public Ethernet. Service(Context context, Ethernet. State. Tracker){ m. Tracker = Tracker; m. Context = context; is. Eth. Enabled = get. Persisted. State(); Log. i(TAG, "Ethernet dev enabled " + is. Eth. Enabled ); get. Device. Name. List(); set. Eth. State(is. Eth. Enabled); Log. i(TAG, "Trigger the ethernet monitor"); m. Tracker. Start. Polling(); }
Ethernet Service 등록 Flow(계속) public Ethernet. Service(Context context, Ethernet. State. Tracker){ … get. Device. Name. List(); } public String[] get. Device. Name. List() { if (scan. Eth. Device() > 0 ) return Dev. Name; else return null; }
Ethernet Service 등록 Flow(계속) private int scan. Eth. Device() { int i = 0, j; if ((i = Ethernet. Native. get. Interface. Cnt()) != 0) { Log. i(TAG, "total found "+i+ " net devices"); Dev. Name = new String[i]; } else return i; for (j = 0; j < i; j++) { Dev. Name[j] = Ethernet. Native. get. Interface. Name(j); if (Dev. Name[j] == null) break; Log. i(TAG, "device " + j + " name " + Dev. Name[j]); } return i; }
Ethernet Service 등록 Flow(계속) static jint android_net_ethernet_get. Interface. Cnt() { return total_int; } static jint android_net_ethernet_init. Ethernet. Native(JNIEnv *env, jobject clazz) netlink_init_interfaces_list() LOGI("interface %s: %d found", intfinfo->name, intfinfo ->i); add_int_to_list(intfinfo); //에서 total_int ++
Ethernet Service 등록 Flow(계속) static jstring android_net_ethernet_get. Interface. Name(JNIEnv *env, jobject clazz, jint index) { info= interfaces; if (total_int != 0 && index <= (total_int -1)) { while (info != NULL) { if (index == i) { LOGI("Found : %s", info->name); return env->New. String. UTF(info->name); } static jint android_net_ethernet_init. Ethernet. Native(JNIEnv *env, jobject clazz) netlink_init_interfaces_list() LOGI("interface %s: %d found", intfinfo->name, intfinfo ->i); add_int_to_list(intfinfo); //에서 Node 생성
Ethernet Event 처리 쓰레드 생성 public Ethernet. Service(Context context, Ethernet. State. Tracker){ Log. i(TAG, "Trigger the ethernet monitor"); m. Tracker. Start. Polling(); 쓰레드 생성 static jstring android_net_ethernet_wait. For. Event(JNIEn v *env, jobject clazz) {
이더넷이 연결된 경우(DHCP) Monitor. T hread Ethernet Monitor Connecti vity. Servi ce Ethernet State. Tra cker
이더넷이 연결된 경우(DHCP) static jstring android_net_ethernet_wait. For. Event(JNIEnv *env, jobject clazz) { if((len = recvmsg(nl_socket_poll, &msg, 0))>= 0) { Monitor. Thread. run. } else if (cmd == NEW_LINK) { event = PHYUP; handle. Event(events[i], event);
이더넷이 연결된 경우(DHCP) void handle. Event(String ifname, int event) { switch (event) { case PHYUP: m. Tracker. notify. Phy. Connected(ifname); ); break; public void notify. Phy. Connected(String ifname) { if synchronized(this) { this. send. Empty. Message(EVENT_HW_PHYCONNECTE D); Monitor. Thread
이더넷이 연결된 경우(DHCP) public void handle. Message(Message msg) {. . case EVENT_HW_PHYCONNECTED: try { configure. Interface(info); } private boolean configure. Interface(Ethernet. Dev. Info info) throws Unknown. Host. Exception { if (info. get. Connect. Mode(). equals(Ethernet. Dev. Info. ETH_CONN_MOD E_DHCP)) { m. Dhcp. Target. send. Empty. Message(EVENT_DHCP_START); DHCP Handler
이더넷이 연결된 경우(DHCP) public void handle. Message(Message msg) {. . switch (msg. what) { case EVENT_DHCP_START: if (Network. Utils. run. Dhcp(m. Interface. Name, m. Dhcp. Info)) {} static jboolean android_net_utils_run. Dhcp(JNIEnv* env, jobject clazz, jstring ifname, jobject info) { result = : : dhcp_do_request(name. Str, &ipaddr, &gateway, &mask,
- Slides: 26