分类: LINUX
2012-07-02 14:56:45
0,需求:
将ubuntu12.04系统中的声音设置程序(gnome-control-center中的sound模块),移植到我们产品使用的系统中。
我们产品的桌面属于gnome2.xx版本,其上使用的声音设置程序是属于gnome-media包中(gnome-media中的gnome-volume-control)。
即:移植gnome-control-center的sound 到 gnome-media中。
这里遇到的问题有:
1. 运行方式和代码不同。
2. 依赖控件库的版本有差异。
3. 配置资源、图标资源、声音资源有差异。
4. 移植工作带来的一些错误。
以上,是在移植过程中一步步发现,并解决的。下面会依次记录下如何发现问题,并且如何去fix它
1,拿到软件包。
首先,我们拿到两个包的代码:gnome-control-center 和 gnome-media,方式依旧是apt-get source。
gnome-media包目录:
gnome-media/gnome-volume-control/
gnome-media/gnome-volume-control/src/
gnome-media/gnome-volume-control/data/
gnome-media/gnome-volume-control/data/icons
其他文件....
gnome-control-center包目录:
gnome-control-center/panels/
gnome-control-center/panels/sound/
gnome-control-center/panels/sound/data/
gnome-control-center/panels/sound/data/icons
gnome-control-center/panels/sound/data/sounds
gnome-control-center/panels/sound/data/symbolic-icons
gnome-control-center/panels/sound-nua/
其他文件....
如上,gnome-media/gnome-volume-control/、gnome-control-center/panels/sound/、gnome-control-center/panels/sound-nua/这三个目录是我们最需关注的地方。
根据需求,以及在ubuntu 12.04的系统上对声音设置程序进程的分析,我们能够得出:需要将gnome-control-center/panels/sound-nua/这个模块移植到gnome-media中,代替gnome-volume-control/模块。
另外通过对相关Makefile.am的分析,我们猜测,可能还会用到gnome-control-center/panels/sound/下面的资源文件data(这一步是在后续工作才体会到的)。
了解了以上情况,就准备:
2,着手移植工作。
1) 观察两个模块的Makefile.am文件:
gnome-control-center/panels/sound-nua/的Makefile.am规则是生成libsoundnua_la_LIBADD
gnome-media/gnome-volume-control/的Makefile.am规则是生成 gnome-volume_control_LDADD和gnome-volume_control_applet_LDADD(小图标)。
关于Makefile.am:
编译时,autoconf会根据目录中的Makefile.am和configure.ac生成Makefile.in和configure文件。
可见,在ubuntu12.04中,声音设置模块是编译成so库而在gnome2.xx版本系统中gnome-volume-control是编译成执行程序的。那意味着,程序的入口可能不一样。
2) 拷贝代码、Makefile并修改和编译:
a) 我们将gnome-control-center中的代码拷贝到gnome-media中,根据代码修改好Makelfile.am,以及程序的入口gvc_mixer_control_new; 用gtk2相关函数代替gtk3库。
b) 处理了信号(去掉gnome-media的connecting 和 ready,直接接回调函数)。
在程序的入口处,老版本会将Object链接两个自建信号,connecting和ready。但新版的已经使用state-changed代替。这里我们舍弃掉connecting信号的操作,保留ready的操作,但修改了调用callback的方法,直接调用。不用信号connect。
这样能够解决掉昨天编译出现的错误,但执行起来,没有出现程序窗口。
c) 处理dialog的信号response和close,新版的已经改成了vbox,故索性舍弃response和close(这两个信号的回调都是gtk_main_quit),改成delete-event。
在ready的回调函数中,有两个信号response、close,链接在dialog中,这个"dialog"在新旧两个版本不是一个容器。旧版的是一个真正的dialog,而新版的实际上是一个vbox。
旧版代码中,response、close两个信号的回调都是gtk_main_quit,故而我们将这个两个信号去掉,直接将delete-event链接到新版的vbox上(container一个window内)。
3,资源问题
我们将gnome-control-center的资源,主要是sound以及symbolic-icons拷贝到旧版软件包gnome-media内。
gnome-control-center的sound模块中,部分icons是不在软件包内的,而是依赖了gnome-icon-theme-symbolic包。如某些svg图片。
我们将其中需要使用到的svg图片拷贝到gnome-media软件包内,再进行编译。可以使用。
需要注意修改configure.ac文件(添加对拷贝过来的icon的Makefile支持)以及Makefile.am文件。
关于schemas:
schema即sound的问题:在"声音效果"的"选择警报音量"没有对各种风格警报声的支持。
1,声音,警报音:gsettings-desktop-schemas_3.0.0-0ubuntu1.1_all.deb
2,警报音的默认声音:ubuntu-sounds_0.13_all.deb
4,引用:
新的声音设置程序来自ubuntu 12.04,与当前系统的声音设置程序相比,更加简洁易懂。然而两边程序有较大差异,例如分别来自不同的软件包,运行方式有差异,图形控件版本不同。
因此本次移植工作代码层面主要是上述差异的处理,例如兼容老的运行方式,所使用的图形控件使用回退到前一个主要版本等等,这个过程也经历了不少问题,最后均被调试解决。
在资源层面,两边程序所使用的配置资源、图标资源、声音资源均有差异。主要通过分析Linux下最常见的构建系统“autoconf/automake”,来分析,改动内建资源的变化。外部依赖资源则通过了strace,以及分析源代码来定位。最后也都处理完毕。
上述移植工作为确保全面,均又进行了系统检查,确保没有遗漏问题
另外,还处理了ubuntu程序本身的段错误以及因移植而产生的段错误的情况。
5,附:
在移植过程中,发现gnome-control-center-3.4.1源代码的一个潜在bug。
在gnome-control-center-3.4.1/panels/sound-nua/gvc-speaker-test.c的第436行,g_free (output_name);
源份代码如下: