android_net_wifi_startSupplicant这个就是jni函数
=>wifi_start_supplicant
static const char SUPP_CONFIG_TEMPLATE[]= "/system/etc/wifi/wpa_supplicant.conf";
static const char SUPP_CONFIG_FILE[] = "/data/misc/wifi/wpa_supplicant.conf";
=>ensure_config_file_exists该函数将SUPP_CONFIG_TEMPLATE文件拷贝到SUPP_CONFIG_FILE目录下,然后chown改变SUPP_CONFIG_FILE属组
=>control_supplicant(1),开启wpa_supplicant.
首先会检测当前property_get(SUPP_PROP_NAME, supp_status, NULL)是否已经开启,如果没有,那么调用
property_set(ctrl_prop, SUPPLICANT_NAME);设置prop来开启,然后最长等待20s,直到期望的控制状态正确.
也就是等待system/rootdir/init.rc脚本中名为wpa_supplicant的服务进程运行.
system/rootdir/init.rc脚本中的service后台服务进程定义如下:
...
service wpa_supplicant /system/bin/wpa_supplicant -Dwext -ieth0 -c/data/misc/wifi/wpa_supplicant.conf
????disabled
...
static const char SUPPLICANT_NAME[] = "wpa_supplicant";
"wpa_supplicant"为prop字符串,上面property_set(ctrl_prop, SUPPLICANT_NAME);
=>handle_property_set_fd 如果为"ctl."字符串,那么将调用service服务进程控制函数
????if(memcmp(msg.name,"ctl.",4) == 0) {
????????handle_control_message((char*) msg.name + 4, (char*) msg.value);
????}
=>handle_control_message
=>msg_start
=>service_start
????execve(svc->args[0], (char**) svc->args, (char**) ENV);
//执行/system/bin/wpa_supplicant程序,为什么是这个,如下:[luther.gliethttp]
/init/init.c进程是这样对service后台服务进程解析的
1.parse_config_file("/init.rc");
2.printf(tmp, "/init.%s.rc", hardware);
??parse_config_file(tmp);
3.sprintf(tmp, "/system/etc/init.%s.rc", hardware);
??parse_config_file(tmp);
parse_config_file
=>parse_config
=>state->context = parse_service(state, nargs, args)
=>
????nargs -= 2;
????svc->name = args[1];
????svc->classname = "default";
????memcpy(svc->args, args + 2, sizeof(char*) * nargs);
//这样svc->args[0]..[3]为"/system/bin/wpa_supplicant -Dwext -ieth0 -c/data/misc/wifi/wpa_supplicant.conf"了[luther.glithttp]
????svc->args[nargs] = 0;//参数结尾添0
????svc->nargs = nargs;
????list_add_tail(&service_list, &svc->slist);
=>state->parse_line = parse_line_service;
=>parse_line_service
那么handle_property_set_fd又是怎么来的呢,那么我们继续看,
init/init.c第一个kernel启动的用户空间引用程序:
int main(int argc, char **argv)
{
????...
????property_set_fd = start_property_service();
????...
????ufds[1].fd = property_set_fd;
????ufds[1].events = POLLIN;
????...
????for(;;) {
????????...
????????nr = poll(ufds, 3, timeout); //做poll等待[luther.gliethttp].
????????...
????????if (ufds[1].revents == POLLIN)
????????????handle_property_set_fd(property_set_fd);//从java层通过unix管道传来了控制数据,java层执行的reboot和powerdown操作也由该函数处理.
????????..
????}
????...
????return 0;
}
#define PROP_SERVICE_NAME "property_service"
int start_property_service(void)
{
????...
????fd = create_socket(PROP_SERVICE_NAME, SOCK_STREAM, 0666, 0, 0);
????...
????listen(fd, 8);
????return fd;
}
#define ANDROID_SOCKET_DIR????????"/dev/socket"
int create_socket(const char *name, int type, mode_t perm, uid_t uid, gid_t gid)
{
????...
????snprintf(addr.sun_path, sizeof(addr.sun_path), ANDROID_SOCKET_DIR"/%s",
?????????????name);
????...
}
所以这个property_set的unix通信文件位于:"/dev/socket/property_service"下.
当然java的jni应用程序链接调用的是system/lib/libandroid_runtime.so这个so库中的服务,不过和init中的没有区别
详细解决方案
浅析android经过jni控制service服务程序的简易流程
热度:72 发布时间:2016-05-01 14:31:46.0
相关解决方案
- Servlet.service() for servlet [jsp] in context with path解决方案
- 学习Web Service,用哪种框架好?AXIS,XFire,CXF?该如何处理
- java service 项目有关问题
- 对象集,数组,web service,该怎么解决
- android 读取byte[]中的元素解决方案
- android 标题栏兑现方式
- android 中Activity向BroadcastReceiver发送数据,该怎么解决
- Android 4.0 为什么模拟器老是提示小弟我谷歌拼音输入法已停止
- android:getSharedPreferences() 这是哪个类的方法解决思路
- android 怎么判断一个程序是否联网
- android RadioButton如何设置默认选中
- 新手学习j2me,请教调用.net service 时用ksoap,还是用JSR172好
- android 怎么重新设置锚点
- android 图片对象获取的有关问题
- android 关于服务连接的疑义
- android 怎么实现对view的放大和缩小
- android ID,该如何处理
- 准备复习2-3个月,看java+android,请问有经验者,怎么看效果最好》
- android UI线程与AsyncTask的有关问题
- android(java) 中文乱码的有关问题
- 请教:有人开发过OPOS驱动吗,撰写 service object?
- vc写的 windows service 控制台程序有关问题
- 请教一上有没有C++调用WEB SERVICE 做成DLL的例子
- vs2008中怎么使用vc++构建web service
- 客户端用vc2005的c++来编写,web service 只是连接就报错解决方法
- Reporting Service 报表订阅 到win2003 系统的有关问题
- Reporting Service 分组排列有关问题
- Silverlight学习数据跟RIA服务时,找不到domain service class模板
- asp reporting service 只显示一起,大神进
- !AJAX的autocompleteextender控件实现自动输入一定需要Web Service