接上条,自从编译出想要的mpv后,就想着编译个iina只是举手之劳,没想到今天试了试才发现,事情没那么简单。。
iina的GitHub仓库是有配置构建的workflow的,理论上只要修改下它的构建脚本,将它依赖的libmpv
替换自己构建的就行了。
但是我fork之后构建出的最新版本iina虽然能在我的mac 10.15上打开,可播放任意文件都会闪退。一开始以为是我修改造成的问题,于是从iina官方仓库的action里下载了最新版本,结果也是一样……
没办法只好手动checkout到上一次稳定版本的commit,然后再跑一次构建脚本,这次在下载依赖包的环节就失败了。。由此可见现代软件构建链的脆弱性,太多环境太多版本了。。
从头构建暂时走不通,就想办法直接改本地的app。
众所周知.app
文件其实是个特定结构的文件夹,iina也不例外,而iina.app
里面恰好就有一个libmpv.2.dylib
,这个文件我已经构建出来了能播放hevc flv的版本,就在这个链接里(libmpv-x86_64-45c1c58.zip
)。
所以问题就成了怎样将iina.app
里的libmpv.2.dylib
替换成我们自己构建的。
直接替换好像不行,app直接打不开,我折腾半天又是codesign
又是xattr
,还是行不通,实在搞不懂mac的安全策略。。
最终在otool
的帮助下发现了线索,otool -L /Applications/IINA.app/Contents/MacOS/IINA
可以查看它依赖的dylib
,里面就有我们的目标libmpv,于是先执行
install_name_tool -change @rpath/libmpv.2.dylib /Users/me/code/github/mpv-mac/temp/libmpv.2.dylib /Applications/IINA.app/Contents/MacOS/IINA
将二进制IINA中引用的libmpv链接重定向到本地下载好的新构建的dylib文件
这样还没完,因为otool分析这个新构建的libmpv.2.dylib
会发现它还引用了一个libluajit-5.1.2.dylib
,这个文件的路径/Users/runner/work/mpv-mac/mpv-mac/opt/lib/libluajit-5.1.2.dylib
在我的本地mac上找不到,但也在libmpv-x86_64-45c1c58.zip
这个压缩包里。所以需要再执行下install_name_tool:
install_name_tool -change /Users/runner/work/mpv-mac/mpv-mac/opt/lib/libluajit-5.1.2.dylib /Users/me/code/githubx/mpv-mac/temp/libluajit-5.1.2.dylib libmpv.2.dylib
# 此外二进制IINA也引用了libluajit,所以也顺带改下
install_name_tool -change @rpath/libluajit-5.1.2.dylib /Users/me/code/github/mpv-mac/temp/libluajit-5.1.2.dylib /Applications/IINA.app/Contents/MacOS/IINA
依赖问题解决后,再执行一遍codesign -s - -f /Applications/IINA.app
这样就能成功打开iina.app了,而且它内部调用的libmpv也变成了我们自己构建的版本,所以也能成功打开hevc的flv文件了。