[android源码解析]bluetoothd默认初始化中main.conf的解析

本文深入剖析了Bluetoothd服务启动过程中的关键步骤,包括默认配置初始化、命令行参数解析及main.conf配置文件的具体读取与应用。通过这些内容,读者能够了解到蓝牙服务是如何根据配置文件进行初始化设置的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上文我们从总体上把握了bluetoothd启动的流程,下面我们就具体的细节来详细分析一下,首先要看到的就是init_defaults,在它里面最重要也是最有意义的就是main.conf的解析了。我们通常需要修改某个配置就去修改main.conf中的内容,那么这些内容又是如何真正被配置呢?本文就来和你一一说来。

2.2.1默认的初始化简介

这个函数会初始化一些默认的配置,在main.conf中没有修改的参数,将会使用这里定义的,当然,若是修改过了,那就只能使用这里的参数了

  1. staticvoidinit_defaults(void)
  2. {
  3. /*DefaultHCIdsettings*/
  4. //默认的配置
  5. //这里的main_opts是一个全局变量
  6. memset(&main_opts,0,sizeof(main_opts));
  7. main_opts.mode=MODE_CONNECTABLE;//可连接的
  8. main_opts.name=g_strdup("BlueZ");//名字是bluez
  9. main_opts.discovto=DEFAULT_DISCOVERABLE_TIMEOUT;//默认的可发现timeout是3分钟
  10. main_opts.remember_powered=TRUE;
  11. main_opts.reverse_sdp=TRUE;
  12. main_opts.name_resolv=TRUE;//需要remotenamerequest
  13. main_opts.link_mode=HCI_LM_ACCEPT;
  14. //支持roleswtich以sniff,hold和park状态了
  15. main_opts.link_policy=HCI_LP_RSWITCH|HCI_LP_SNIFF|
  16. HCI_LP_HOLD|HCI_LP_PARK;
  17. //这里就是获取主机的名字来作为host_name
  18. if(gethostname(main_opts.host_name,sizeof(main_opts.host_name)-1)<0)
  19. strcpy(main_opts.host_name,"noname");
  20. }

2.2.2glib命令行解析库的简单使用

这个方法使用的目的就是避免一个一个参数进行switch的解析,就像hciattach中写的那样,大家会发现那样去解析要写很大一段代码。glib库提供了一个库函数进行解析,他会根据一个GoptionEntry结构体进行自动地解析,先来看一下GoptionEntry结构体:

  1. typedefstruct{
  2. constgchar*long_name;//完整命令如:--name
  3. gcharshort_name;//简写命令如:-n
  4. gintflags;//GOptionFlags枚举的值
  5. GOptionArgarg;//GOptionArg枚举的值
  6. gpointerarg_data;//解析出来的数据,所要存储的位置
  7. constgchar*description;//参数描述,--help可以查看到
  8. constgchar*arg_description;
  9. }GOptionEntry;

这样一看就感觉到很清晰了吧,就是说我们解析命令行中的参数最终把它保存到arg_data中,我们只要事先实现这个结构体就万事大吉了。

回到我们的分析中来,我们这个结构体是实现在options中的,我们看一下它的定义:

  1. staticGOptionEntryoptions[]={
  2. {"debug",'d',G_OPTION_FLAG_OPTIONAL_ARG,
  3. G_OPTION_ARG_CALLBACK,parse_debug,
  4. "Specifydebugoptionstoenable","DEBUG"},
  5. {"plugin",'p',0,G_OPTION_ARG_STRING,&option_plugin,
  6. "Specifypluginstoload","NAME,..,"},
  7. {"noplugin",'P',0,G_OPTION_ARG_STRING,&option_noplugin,
  8. "Specifypluginsnottoload","NAME,..."},
  9. {"nodetach",'n',G_OPTION_FLAG_REVERSE,
  10. G_OPTION_ARG_NONE,&option_detach,
  11. "Don'trunasdaemoninbackground"},
  12. {"version",'v',0,G_OPTION_ARG_NONE,&option_version,
  13. "Showversioninformationandexit"},
  14. {"udev",'u',0,G_OPTION_ARG_NONE,&option_udev,
  15. "Runfromudevmodeofoperation"},
  16. {NULL},
  17. };


所以,很清晰把,就是我们定义了一系列的参数比如-n,后面的参数就会被保存在parse_debug中,简单吧。

那么在我们想解析的时候该如何使用,并调用哪些函数呢?

首先你需要调用context =g_option_context_new(NULL);来创建一个goptioncontext,然后

调用g_option_context_add_main_entries(context,options, NULL);关联对应的GoptionEntry,下面就可以调用_option_context_parse(context, &argc, &argv, &err)来解析传入的参数了,需要注意的是,在最后不要忘了调用g_option_context_free来释放对应的goptioncontext,否则就会出现内存泄露的情况了。

2.2.3main.conf的解析

这个函数就是根据main.conf中的配置进行不同的设置。需要注意的是bluez中有一个main.conf的文件,然而android最终并没有使用这个文件,而是使用了system/bluetooth/data目录下的main.conf文件。

初略地去看一下,这个文件的内容其实蛮简单的,去除掉注释就是这样的:

[plain] view plain copy
  1. [General]
  2. Name=%m
  3. Class=0x40020C
  4. DiscoverableTimeout=120
  5. PairableTimeout=0
  6. PageTimeout=8192
  7. DiscoverSchedulerInterval=30
  8. InitiallyPowered=true
  9. RememberPowered=false
  10. DeviceID=android:generic:1.5
  11. ReverseServiceDiscovery=true
  12. NameResolving=true
  13. DebugKeys=false
  14. EnableLE=false
  15. AttributeServer=false
  16. DefaultLinkPolicy=7

下面我们就根据源码解析的代码来看一下这些参数都是什么意思

  1. staticvoidparse_config(GKeyFile*config)
  2. {
  3. GError*err=NULL;
  4. char*str;
  5. intval;
  6. gbooleanboolean;
  7. //首先肯定是文件要是存在的
  8. if(!config)
  9. return;
  10. DBG("parsingmain.conf");
  11. //找到General下面的DiscoverableTimeout
  12. val=g_key_file_get_integer(config,"General",
  13. "DiscoverableTimeout",&err);
  14. if(err){
  15. DBG("%s",err->message);
  16. g_clear_error(&err);
  17. }else{
  18. //设置main_opts中的discovto参数
  19. //同时把flags中的HCID_SET_DISCOVTO置位
  20. DBG("discovto=%d",val);
  21. main_opts.discovto=val;
  22. main_opts.flags|=1<<HCID_SET_DISCOVTO;
  23. }
  24. ……
  25. //下面的代码就全部是类似的,不再相信分析
  26. //所以,都只是根据main.conf然后设置一些值,这些值将在后面才会真正用到,我们在用到的时候再来具体分析
  27. }


这样main.conf中的内容就被我们解析出来了,后面只要根据具体的内容做具体的配置就可以了。这些配置的值如何被使用的,我们在后面的文章中将一一介绍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值