网易云音乐Linux版在Fedora上运行的一些尝试

网易云音乐在近期推出了Linux版,虽然是由Deepin团队代为开发的,但是一经推出就一片好评。毕竟国内软件厂商基本无视Linux平台。当然对于真正的Linux User来说,他们有着自己的生存方式,也不会去在意这些问题。况且以一些国内厂商的作风来看,不管到哪个平台上都能变成流氓。但是至少Deepin在努力改善国内的Linux生态,包括提供CrossOver/Wine运行的QQ等国产软件。这次的网易云音乐也算是做了一件好事。

网易官方提供了deb包给Deepin Linux和Ubuntu使用,由于个人并不使用Deepin Linux或者Ubuntu,所以似乎这软件就与我无缘了。至于不用Deepin的原因在于Deepin本身是基于Ubuntu乃至Debian的,从上游更新下来的软件包自然比较慢。Debian本身就是以“稳定”著称的一个Linux发行版,为了追求稳定,软件更新通常很慢。前段时间还出现过软件作者因为Debian不能及时更新软件源里的版本而Angry的事情。不选Ubuntu也是基于类似的原因。

至于为什么选Fedora,主要是因为Fedora与CentOS同源,便于服务器维护的相关调试,而且更新比较快,接近于Arch Linux(现在(2016-5-31)的Fedora 23的Kernel版本是4.4.9),而且比Arch Linux更稳定一些。

又说了一堆废话,不管怎样,可以说是突发奇想,也可以说是刚性需求,想在Fedora上运行网易云音乐。

在Linux下包管理器就是为了解决软件依赖关系而诞生的,而不同Linux发行版的软件包一般不能通用,其原因在于,一个软件包通常需要依赖其他的一些软件包,通常是一些库文件,这些库文件在不同发行版下面的打包方式有很大的差异。不同的发行版同一软件的软件包版本大多都不尽相同。

但是对于操作系统来说,可执行文件是几乎没有区别的。只要是为Linux编译的相同架构的二进制可执行文件,在Linux Kernel下基本上都是可以执行的(可能会有版本的问题)。比如说,下载一个BusyBox,得到其可执行文件,这个可执行文件可以在任意一个对应架构的Linux下执行。当然这也是因为BusyBox采用静态编译,不需要任何的外部的链接库。

但是大多数程序都会要求一些外部链接库。如果是通过包管理器去安装,一般软件在打包的时候都会在配置文件里面写明需要的库的版本,同时就通过包管理器安装了。但是我们现在是要移植,自然不能直接安装。网易云音乐的Linux版是deb包,在Debian系Linux可以通过dpkg或者apt之类的命令安装。

在搜索中,发现Fedora的软件仓库居然也提供了dpkg。不是很懂其中的原因。是不是Debian还有rpm命令呢?  :)

言归正传,将官方下载的deb包直接解压缩,得到了下面的文件

-rw-r--r--. 1 hcl hcl 2.7K 5月 25 05:01 control.tar.gz
-rw-r--r--. 1 hcl hcl 32M 5月 25 05:01 data.tar.xz
-rw-r--r--. 1 hcl hcl 4 5月 25 05:01 debian-binary

再次解包,根据deb的结构,control目录下面是对这个包的描述和配置,其中control文件如下

 Package: netease-cloud-music
 Version: 0.9.0-1
 Architecture: amd64
 Maintainer: Deepin Sysdev <[email protected]>
 Installed-Size: 109236
 Depends: <此处省略>
 Section: sound
 Priority: optional
 Homepage: http://www.deepin.org
 Description: netease cloud music player.
 netease cloud music player.

data目录下是这个软件的相关文件,也就是prefix。目录结构如下:

├── usr
├── bin
│   └── netease-cloud-music -> ../lib/netease-cloud-music/netease-cloud-music
├── lib
│   └── netease-cloud-music
│   ├── cef_100_percent.pak
│   ├── cef_200_percent.pak
│   ├── cef_extensions.pak
│   ├── cef.pak
│   ├── chrome-sandbox
│   ├── icudtl.dat
│   ├── libcef.so
│   ├── libcrypto.so.1.0.0
│   ├── locales
│   ├── natives_blob.bin
│   ├── netease-cloud-music
│   └── snapshot_blob.bin
└── share
├── applications
│   └── netease-cloud-music.desktop
├── doc
│   └── netease-cloud-music
│   ├── changelog.Debian.gz
│   ├── copyright
│   └── README.md.gz
└── icons
└── hicolor
└── scalable
└── apps
└── netease-cloud-music.svg

尝试直接执行bin下面的netease-cloud-music,发现是一个符号链接

netease-cloud-music -> ../lib/netease-cloud-music/netease-cloud-music

然后报错说缺libcue,Fedora下面,直接执行

sudo dnf install libcue

就可以安装了。
接着,又提示缺libcrypto.so.1.0.0,尝试将/usr/lib64/libcrypto.so软链接过来,发现还是不行,提示

version `OPENSSL_1.0.0' not found

用下面的命令查看动态库的信息

objdump -p /lib64/libcrypto.so | grep OPENSSL

发现

3 0x00 0x066a2b21 OPENSSL_1.0.1
4 0x00 0x02b21533 OPENSSL_1.0.1_EC
5 0x00 0x066a2b22 OPENSSL_1.0.2

没有所需要的1.0.0版本。也就是说它依赖一个旧版的openssl里的libcrypto.so。
果断下载一个OpenSSL 1.0.0k版本的源码包,编译安装

./config shared --prefix=./dist --openssldir=./
make

接着就在源码包根目录下得到了libcrypto.so.1.0.0,复制到netease-cloud-music可执行文件的同级目录下(程序寻找动态链接库优先找同目录)。再运行,出现几个错误

./netease-cloud-music: ./libcrypto.so.1.0.0: no version information available (required by ./netease-cloud-music)
[0531/210401:ERROR:browser_main_loop.cc(203)] Running without the SUID sandbox! See https://code.google.com/p/chromium/wiki/LinuxSUIDSandboxDevelopment for more information on developing with the sandbox on.
/home/lch/Downloads/netease-cloud-music_0 1.9.0-2_amd64/data/usr/lib/netease-cloud-music/netease-cloud-music: ./libcrypto.so.1.0.0: no version information available (required by /home/lch/Downloads/netease-cloud-music_0 1.9.0-2_amd64/data/usr/lib/netease-cloud-music/netease-cloud-music)

但是还是成功运行起来了。

netease_cloud_music_fedora

然而运行起来并不算完,测试一下播放,程序就崩溃了

[1] 23255 segmentation fault (core dumped) ./netease-cloud-music

所以移植并不完美,还有待继续尝试。

经过研究发现,

no version information available

才是问题的关键,那么我们就要想办法给这个libcrypto.so添加VERSION字段。当然可以去重新编译一个libcrypto.so ,但是OpenSSL的文档看了半天没有看明白究竟是怎么添加VERSION信息的。所以,又想到,Ubuntu软件源里的libcrypto应该是能够满足需求的,毕竟网易云依赖这个包。

这里 下载libcrypto1.0.0-udeb (1.0.2g-1ubuntu4), 解包,找到libcrypto.so.1.0.0,然后复制到lib目录下面就可以正常运行了。

在测试中,这样处理之后,网易云音乐所有的功能都可以正常地执行。

在Fedora上要正常播放,还需要系统能够播放MP3格式的音乐,否则就会提示“网络错误”,但是并不是因为网络不好,而是系统没有相应的解码器。系统是否支持MP3播放,其标志是Amarok能够播放本地硬盘的MP3文件。VLC有自己的一套解码包,如果安装VLC是可以直接播放MP3的,但是这不代表系统可以MP3播放。

对于Linux来说,由于MP3的播放涉及到专利,所以大多数Linux发行版都不支持MP3播放。对于Fedora来说,其支持软件包,也不被包括在Free的官方软件源里,而是包括在RPM Fusion源里,关于RPM Fusion的添加这里不多细讲。

关于Fedora的MP3支持,网上有很多的资料,但是其准确性太差,基本不符合实际。正确的做法应该是安装RPM Fusion源里面的 gstreamer1-libav ,这样Amarok以及网易云音乐都能够正常的播放音乐了。

这种方法理论上对于任何Linux发行版都能成功。但是我只测试了Fedora 23。其他的Linux发行版也需要安装一系列的动态库软件包,具体名字需要自行去根据网易云的依赖列表(controls文件)去确定,但总体来说需要安装Qt5、alsa(音频支持)。

 

《网易云音乐Linux版在Fedora上运行的一些尝试》上有5条评论

  1. 我到现在都没法直视dnf,一直都是yum习惯了。。再加上一看到dnf就想到毒奶粉和鹅厂代理的游戏,也是醉了。

  2. 看博主的文章感觉很麻烦 = = 我打算折腾下,先装了下 gstreamer1-libav 没想到直接deb包里的二进制直接就可以跑起来了 fedora29

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注