zoukankan      html  css  js  c++  java
  • Ril分析一——rild进程

          rild进程

    rild进程 init.rc中描述:

      service ril-daemon /system/bin/rild

          class main

          socket rild stream 660 root radio

          socket rild-debug stream 660 radio system

          user root

    进程rild.c中:

    int main(int argc, char **argv)
    {
        const char * rilLibPath = NULL;
        const RIL_RadioFunctions *(*rilInit)(const struct RIL_Env *, int, char **);
    
        RIL_setRilSocketName("rild");
        
        //通过属性系统获取lib路径:rild.libpath
            property_get(LIB_PATH_PROPERTY, rilLibPath, NULL);
        
    //动态加载链接库返回句柄 dlclose卸载掉动态链接库 dlHandle = dlopen(rilLibPath, RTLD_NOW);
    //创建客户端事件监听线程 RIL_startEventLoop();
    //通过dlsym定位到需要执行的函数指针    rilInit = (const RIL_RadioFunctions *(*)(const struct RIL_Env *, int, char **))dlsym(dlHandle, "RIL_Init");
    //通过属性系统获取参数:rild.libargs property_get(LIB_ARGS_PROPERTY, args, ""); argc = make_argv(args, s_argv); //reference-ril.so初始化 处理客户端请求的模块reference-ril.c //s_rilEnv建立应答回调机制 //返回处理请求的相关接口 funcs_inst[0] = rilInit(&s_rilEnv, argc, s_argv);
    //多卡模式 if (isMultiSimEnabled() && !isMultiRild()) { } RIL_setMaxNumClients(numClients); //注册客户端事件处理接口,并创建socket监听事件 for (i = 0; i < numClients; i++) { RIL_register(funcs_inst[i], i); }   done: while(1) { // sleep(UINT32_MAX) seems to return immediately on bionic sleep(0x00ffffff); } }

       在这里主要是建立ril事件机制对客户端请求监听和处理机制。

    EventLoop与RequestHandle:ril.cpp与reference-ril.c 

        

      EventLoopRequestHandle两个模块要进行通信

    按照上面初始化及相关接口注册过程:

    EventLoopRequestHandle传递消息————通过RequestHandle初始化返回的funcs_inst

                  funcs_inst[0] = rilInit(&s_rilEnv, argc, s_argv);

                  返回:         s_callbacks 注册给EventLoop:

                  注册: RIL_register(funcs_inst[i], i);

                         static const RIL_RadioFunctions s_callbacks = {

                             RIL_VERSION,

                             onRequest,

                             currentState,

                             onSupports,

                             onCancel,

                             getVersion

                         };

    RequestHandleEventLoop传递消息————通过初始化RequestHandle时传递回调接口:

           funcs_inst[0] = rilInit(&s_rilEnv, argc, s_argv);

           传递s_rilEnv给RIL_Init:

                  static struct RIL_Env s_rilEnv = {

               RIL_onRequestComplete,

               RIL_onUnsolicitedResponse,

               RIL_requestTimedCallback

                  };

     

    通过属性系统获取ril相关库的路径和ril执行相关的参数:

    通过build.prop中获取具体的参数值:

           Android的build.prop文件是在Android编译时收集的各种property(LCD density/语言/编译时间, etc.),

           编译完成之后,文件生成在out/target/product/<board>/system/build.prop

    例如

           高通:

                  rild.libpath=/system/lib/libreference-ril.so

                  rild.libargs=-d /dev/ttyS0         //终端串口

           MTK:

                  rild.libpath=/system/lib/mtk-ril.so

                  rild.libargs=-d /dev/ttyC0        //终端串口

     

    通过dlopen加载动态链接库:

           dlopen()是一个强大的库函数。该函数将打开一个新库,并把它装入内存。

    该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的。

  • 相关阅读:
    JavaSE 基础 第51节 定义自己的异常
    JavaSE 基础 第50节 Java中的异常链
    JavaSE 基础 第49节 手动抛出异常
    JavaSE 基础 第48节 Java中的异常声明
    JavaSE 基础 第47节 获取异常信息
    JavaSE 基础 第46节 异常的分类
    JavaSE 基础 第45节Java异常快速入门
    JavaSE 基础 第44节 引用外部类的对象
    JavaSE 基础 第43节 静态内部类
    通用爬虫
  • 原文地址:https://www.cnblogs.com/bastard/p/2754891.html
Copyright © 2011-2022 走看看