网易云音乐在近期推出了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)
但是还是成功运行起来了。
然而运行起来并不算完,测试一下播放,程序就崩溃了
[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(音频支持)。
赞!期待完美运行的时候。
播放崩溃大概与解码器库相关
好能折腾
我到现在都没法直视dnf,一直都是yum习惯了。。再加上一看到dnf就想到毒奶粉和鹅厂代理的游戏,也是醉了。
看博主的文章感觉很麻烦 = = 我打算折腾下,先装了下 gstreamer1-libav 没想到直接deb包里的二进制直接就可以跑起来了 fedora29
现在可能确实不用这么麻烦了,因为我测试的时候大概还是 Fedora 23。