xfangfang / wiliwili

第三方B站客户端,目前可以运行在PC全平台、PSVita、PS4 、Xbox 和 Nintendo Switch上
https://xfangfang.github.io/wiliwili
GNU General Public License v3.0
3.37k stars 162 forks source link

在Xbox的开发者模式下将UWP安装后无法启动 #221

Open LonelyWindG opened 1 year ago

LonelyWindG commented 1 year ago

错误状况:如题,启动直接弹回桌面,也没有任何系统提示(在Xbox的Crash data内也没看到有Crash dumps产生) 版本:1.2.0

我没怎么了解过misx或appx应用构建流程,个人猜测是否跟签名证书有关,谷歌查找后发现Xbox应该是无法安装根证书; 相比Win下安装前会要求安装有发布者的根证书,Xbox开发者模式下并没有这样的限制,可直接安装,并且也成功安装;

此外,我也尝试了下安装云之幻大佬开发的另一个UWP的B站应用Bili.Uwp,Release内下载的压缩包内的msixbundle(在Win下需要安装其附带的cer证书才能安装的)以及上架商店的零售应用哔哩(不需要安装证书),两个均可正常安装并运行。

zeromake commented 1 year ago

@LonelyWindG 感觉可能 云之幻 打包的用的cer证书是开发者账号给的证书,上传到商店后还得再次通过商店签名才是正式版,开发者账号给的证书应该是开发者认证了,wiliwili 整的证书只是我拿 vs 自动生成的自签证书

LonelyWindG commented 1 year ago

@LonelyWindG 感觉可能 云之幻 打包的用的cer证书是开发者账号给的证书,上传到商店后还得再次通过商店签名才是正式版,开发者账号给的证书应该是开发者认证了,wiliwili 整的证书只是我拿 vs 自动生成的自签证书

感觉有可能是这样,开发者证书应该是从微软这边申请的,应用能通过系统认证;这样的话只能有空了我看下怎么申请一个开发者证书自己构建一个包试试了;不过我之前也没尝试过uwp开发和cmake构建流程,还是挺麻烦的。

xfangfang commented 1 year ago

@LonelyWindG README中的 wiliwili构建流程写的是 Windows下exe可执行文件的构建流程。

wiliwili 的uwp 构建使用的是 zeromake 写的 xmake 脚本,可以参考:

https://github.com/xfangfang/wiliwili/blob/43451445289f92f7a05efa567195548a391b4305/.github/workflows/build.yaml#L189-L228

zeromake commented 1 year ago

@LonelyWindG 主要就是这个 key.pfx 替换后即可。 签名命令在 lua 脚本里 uwp.lua 我猜测直接手动执行 signtool sign /fd SHA256 /a /f key.pfx wiliwili.msix 就能替换签名

LonelyWindG commented 1 year ago

@xfangfang @zeromake 我查看了下云之幻发布的侧载包签名证书,也是自签名的测试证书,提交到商店的签名证书的颁发者才是微软;

我构建出来用自己生成的自签名证书和他的测试证书都测试了也是一样的无法启动; 我把他的包用makeappx工具unpack再重新pack,用自己的证书重新签,侧载之后也是能正常安装启动的,所以应该不是签名问题;

然后我用Win SDK的Windows App Cert Kit(C:\Program Files (x86)\Windows Kits\10\App Certification Kit\appcertui.exe)跑了下测试,并没有通过,其中“支持的 API 测试”和“应用清单资源测试”两项测试没有通过,不确定是不是这两个原因导致的无法启动;

测试结果还有从https://store.rg-adguard.net/下载下来的哔哩零售包导出的证书如下(因为不能上传所以扩展名加了txt):

win_app_cert_kit_test_result.xml.txt Windows 应用认证工具包 - 测试结果.html.txt richasy_bili_store_cert.p7b.txt

xfangfang commented 1 year ago

看起来现在的uwp版本还不是很兼容xbox哈

zeromake commented 1 year ago

@xfangfang 全是 win32 和 libc 函数依赖,应该是 Microsoft Store Windows SDK 不支持很多 win32 函数,我可以尝试找一下看看有没人做c#的预编译版主要是 libmpv 和 sdl2 依赖了一把东西(大概率是不行,上回也找过一次都是只支持 win32 的 uwp),应用清单资源测试到是好处理,应该就是 resources.pri 里有资源没放好。

LonelyWindG commented 1 year ago

@zeromake 有一个其他问题, 为什么UWP版的搜索输入框不支持输入中文, 而且也没法粘贴进来文本

zeromake commented 1 year ago

@LonelyWindG uwp 用的 sdl 的输入,我上次只做了 win32 的测试,uwp 还真没测试,粘贴复制,由于 wiliwili 用的框架问题根本不能绑定键盘,上次做了一版代码太烂效果也不好就没做粘贴复制

dragonflylee commented 1 year ago

重新编译了一版 开启UWP选项 的 mpv ,但是没有声音了 https://github.com/dragonflylee/mingw-packages/releases/download/CLANG64/mpv-dev-uwp-x86_64.7z

zeromake commented 1 year ago

@xfangfang @LonelyWindG 今天翻了一下代码发现 sdl 并没有做 winrt 的输入法支持(只是尝试调起了虚拟键盘),之前做 sdl 输入法的时候用的是 win32 的去测试的……

ikas-mc commented 11 months ago

现在编译的uwp不是传统意义的uwp,只是使用了winrt的win32打包应用,xbox目前不支持这种类型的包。

不支持的win32 api也需要换掉,主要是mpv, 我尝试将libmpv编译到uwp没有成功,所以直接使用winrt的MediaPlayer代替目前的mpv,然后打包为传统uwp,在xbox测试播放成功

目前用mediaPlayer简单实现MPVCore,视频也是拷贝了几次. 感觉完全没有必要了,商店也很难发布,现在也就xbox特殊了

20231229 我把uwp编译的相关cmake配置放上来了,使用cmake.vs2022生成uwp项目来编译,希望有人可以搞试试,我自己不熟悉c++与cmake ikas-mc/wiliwili-uwp-poc

xfangfang commented 11 months ago

@ikas-mc 感谢更新代码,在设计之初没有考虑到切换不同的播放器,直接用MPV做的播放器,可能有一些应用的行为是比较依赖MPV内部的状态变化的,如果有兴趣继续完善的话倒是也可以把播放器核心单独抽象出来,或许未来可以让这个应用支持到 vlc 或者其他播放器。

ikas-mc commented 11 months ago

目前是编译了一个可以用跑的xbox版本了..播放器确实是最难弄的,其它一些适配改动不多. 目前一些播放的接口,如果要支持多种播放器,需要一些改动,比如seturl,若要原生dash播放(如使用winrt MediaPlayer),需要更多的参数(如indexRange...)

看了下之前用过的一些播放器内核,基本不支持uwp(非win32+winrt)了,所以目前感觉不太值得搞了

-- xbox下可以尝试这个包 wiliwili-uwp-poc/actions中下载最新的

thedavidweng commented 11 months ago

目前是编译了一个可以用跑的xbox版本了..播放器确实是最难弄的,其它一些适配改动不多. 目前一些播放的接口,如果要支持多种播放器,需要一些改动,比如seturl,若要原生dash播放(如使用winrt MediaPlayer),需要更多的参数(如indexRange...)

看了下之前用过的一些播放器内核,基本不支持uwp(非win32+winrt)了,所以目前感觉不太值得搞了

-- xbox下可以尝试这个包 https://github.com/ikas-mc/wiliwili-uwp-poc/releases/download/v0.2/wiliwili-uwp_1.2.3.0_x64_Test.zip xss截图: 293519123-ab82124b-2ac6-4f28-b5ed-255f65b2a3e3.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MDQ1NjY5MjAsIm5iZiI6MTcwNDU2NjYyMCwicGF0aCI6Ii82NTg5NTQyOC8yOTM1MTkxMjMtYWI4MjEyNGItMmFjNi00ZjI4LWI1ZWQtMjU1ZjY1YjJhM2UzLmdpZj9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDAxMDYlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwMTA2VDE4NDM0MFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWI5NTk4ODU1MzZmOWUwZDk1ZDVjN2MxYjQzMWNiNzU4ODQ0MTQ2NDkwZDkwOGJiODA2Y2YzOWVkZDA5MTY2YWEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.ayL-dQtFd6ru90P8mh4hBbmoCQa2rNfe8yokHS90PFk

牛批,有计划上架商店吗

wisdomhxz commented 10 months ago

一直默默看各位大佬。 希望有那么一天可以通过微软商店下到Xbox的Wiliwili

ikas-mc commented 10 months ago

经过一些摸索与修改,终于编译出了可以通过uwp api检测的mpv. 这样只需要修改有限的几个uwp限制api即可正常编译uwp版本了. 目前支持d3d11硬件解码,软件渲染,还需要对mpv修改以支持显卡渲染. 想测试的可以去我的github action里面下载新编译包,我在xss中正常使用..


对mpv与libplacebo源码的修改目前还在整理中( 看来uwp已经没有人关心了,mpv中的uwp支持没人维护了,libplacebo则完全没考虑uwp ~~) 工具链使用https://github.com/mstorsjo/llvm-mingw 主要是参考了vlc的uwp编译脚本 编译过程的一些配置,还有编译后的文件,有兴趣的可以参考: wiliwili-uwp-poc/blob/main/libs/sources/build.md 另外ffmpeg的依赖openssl编译不好搞,目前是链接到了msvc编译的动态dll

dragonflylee commented 10 months ago

@ikas-mc d3d11的硬件渲染可以参考这个 https://github.com/dragonflylee/mingw-mpv/blob/0.36/mingw/mpv/0001-d3d11-render.patch

toolchain的话 msys2下的clang64环境是不是也可以?

ikas-mc commented 10 months ago

@dragonflylee 应该是可以,需要手动在项目中加入uwp相关的参数,这个工具链只是内置了https://github.com/mstorsjo/llvm-mingw/blob/master/wrappers/clang-target-wrapper.c [built-in options]

我之前也是直接用的msys2 clang,然后在meson的交叉编译的配置中指定相关参数 https://github.com/ikas-mc/wiliwili-uwp-poc/blob/main/libs/sources/x86_64-w64-mingw32uwp.txt 不过就是麻烦,都需要修改项目的配置


这些编译链还有工具我基本都不熟悉,都是直接尝试的,可能还有更简单的方法吧

我去合并这个补丁搞试试

ikas-mc commented 10 months ago

@dragonflylee 合并了补丁,重新编译了shaderc依赖(uwp相关参数),桌面端的uwp已经可以正常gpu渲染


但是xbox无法使用,播放后直接出错, 错误是D3D11On12相关的dll(没想到xbox现在不是原生dx11),没有任何有用的debug信息

ikas-mc commented 10 months ago

屏幕截图 2024-01-18 184922

测试版本: https://github.com/ikas-mc/wiliwili-uwp-poc/releases/download/0.4/wiliwili-uwp_1.3.2.0_x64.zip

775852123 commented 10 months ago

可以开发安卓TV版和Apple TV版吗

PandaFiredoge commented 7 months ago

云之幻的商店版哔哩可以在Xbox上用了?

endpne commented 1 month ago

@dragonflylee 合并了补丁,重新编译了shaderc依赖(uwp相关参数),桌面端的uwp已经可以正常gpu渲染

但是xbox无法使用,播放后直接出错, 错误是D3D11On12相关的dll(没想到xbox现在不是原生dx11),没有任何有用的debug信息

有完整的mpv和相关库的编译脚本吗?另外x86_64-w64-mingw32uwp这个sdk是在哪里下载的呢?

ikas-mc commented 1 month ago

@endpne https://github.com/mstorsjo/llvm-mingw https://github.com/videolan/vlc/blob/master/doc/BUILD-win32.md 没有完整的编译脚本,mpv相关代码需要修改才能支持uwp

endpne commented 1 month ago

@endpne https://github.com/mstorsjo/llvm-mingw https://github.com/videolan/vlc/blob/master/doc/BUILD-win32.md 没有完整的编译脚本,mpv相关代码需要修改才能支持uwp

我看仓库里面的头文件和库都是在sdk/x86_64-w64-mingw32uwp下面,x86_64-w64-mingw32uwp这个没有找到下载的链接

ikas-mc commented 1 month ago

@endpne 你是指第三方那些依赖库吧,这个是需要自己编译的.. 三方库使用了vlc的脚本,参照https://github.com/videolan/vlc/blob/master/doc/BUILD-win32.md 可以编译支持uwp的版本 如果你不想自己编译,也可以下载vlc编译好的 https://artifacts.videolan.org/vlc/uwp64-libvlc-llvm/ 解压即是x86_64-w64-mingw32uwp 三方库也是需要根据mpv需要进行修改的

另外mpv的新版核心插件libplacebo并不支持uwp,需要不少的修改,并且由于libplacebo使用了c++,导致编译更加麻烦

endpne commented 1 month ago

@endpne 你是指第三方那些依赖库吧,这个是需要自己编译的.. 三方库使用了vlc的脚本,参照https://github.com/videolan/vlc/blob/master/doc/BUILD-win32.md 可以编译支持uwp的版本 如果你不想自己编译,也可以下载vlc编译好的 https://artifacts.videolan.org/vlc/uwp64-libvlc-llvm/ 解压即是x86_64-w64-mingw32uwp 三方库也是需要根据mpv需要进行修改的

另外mpv的新版核心插件libplacebo并不支持uwp,需要不少的修改,并且由于libplacebo使用了c++,导致编译更加麻烦

好的感谢,另外目前编译出来支持显卡渲染吗?

ikas-mc commented 1 month ago

@endpne 需要参照这个帖子,自行添加dx渲染支持

endpne commented 1 month ago

D3D11On12

D3D11On12这个问题是咋解决的?有参考的资料吗?

dragonflylee commented 1 month ago

@ikas-mc 关于 uwp 下的 mpv 问题可以参考 https://github.com/mpv-player/mpv/issues/5979

endpne commented 1 month ago

@dragonflylee 合并了补丁,重新编译了shaderc依赖(uwp相关参数),桌面端的uwp已经可以正常gpu渲染

但是xbox无法使用,播放后直接出错, 错误是D3D11On12相关的dll(没想到xbox现在不是原生dx11),没有任何有用的debug信息

日志都是一些没啥用的信息

D:\DevelopmentFiles\7b93b878-71fe-42d9-be5b-ff77df19d063VS.Debug_x64.endpne\umd12ddi_arden.pdb: Cannot open symbol file.
M:\windows\system32\umd12ddi_arden.pdb: Cannot find or open the PDB file.
C:\Users\endeny\AppData\Local\Temp\SymbolCache\umd12ddi_arden.pdb\bfa7ea25b2ad71490de1f7d1bc9001561\umd12ddi_arden.pdb: Cannot find or open the PDB file.
C:\Users\endeny\AppData\Local\Temp\SymbolCache\umd12ddi_arden.pdb\bfa7ea25b2ad71490de1f7d1bc9001561\stripped\umd12ddi_arden.pdb: Cannot find or open the PDB file.
C:\Users\endeny\AppData\Local\Temp\SymbolCache\MicrosoftPublicSymbols\umd12ddi_arden.pdb\bfa7ea25b2ad71490de1f7d1bc9001561\umd12ddi_arden.pdb: Cannot find or open the PDB file.
ikas-mc commented 1 month ago

@endpne xbox端目前不能用显卡渲染,只能使用硬解+软件渲染 我使用clang编译了带pdb的mpv尝试找问题,但是一样没有任何有用信息,实际它是播放了,只要断点放慢,会发现他其实已经播放了.. 后面多次修改mpv尝试,最终都没有解决...我现在xbox暂时用的软件渲染

@dragonflylee 这个我之前也看过.但是应该与你的那个dx补丁的实现基本没有区别的

endpne commented 1 month ago

@endpne xbox端目前不能用显卡渲染,只能使用硬解+软件渲染 我使用clang编译了带pdb的mpv尝试找问题,但是一样没有任何有用信息,实际它是播放了,只要断点放慢,会发现他其实已经播放了.. 后面多次修改mpv尝试,最终都没有解决...我现在xbox暂时用的软件渲染

@dragonflylee 这个我之前也看过.但是应该与你的那个dx补丁的实现基本没有区别的

好的,感谢。vlc 在 xbox 倒是可以用显卡渲染,但是 vlc 打开硬解会黑屏。

ikas-mc commented 1 month ago

@endpne 我自己单独调用dx11写的播放都是没有问题,包括硬解与渲染...加上mpv不好调试,所以目前是暂时放弃解决了

ikas-mc commented 1 month ago

@endpne @dragonflylee

经过检查所有的警告,最后测试这个地方

D3D11: WARNING: ID3D11DeviceContext::Begin: Begin is being invoked on a Query, where the previous results have not been obtained with GetData. This is valid; but unusual. The previous results are being abandoned, and new Query results will be generated. [ EXECUTION WARNING #408: QUERY_BEGIN_ABANDONING_PREVIOUS_RESULTS ]

D3D11 WARNING: ID3D11DeviceContext::End: End is being invoked on a Query, where the previous results have not been obtained with GetData.

还没有找到具体问题,但是注释后,播放正常,最新的mpv代码编译 ra_d3d11.c

static void timer_start(struct ra *ra, ra_timer *ratimer)
{
    struct ra_d3d11 *p = ra->priv;
    struct d3d_timer *timer = ratimer;

    // Latch the last result of this ra_timer (returned by timer_stop)
    timer->result = timer_get_result(ra, ratimer);

    //ID3D11DeviceContext_Begin(p->ctx, (ID3D11Asynchronous *)timer->disjoint);
    //ID3D11DeviceContext_End(p->ctx, (ID3D11Asynchronous *)timer->ts_start);
}

static uint64_t timer_stop(struct ra *ra, ra_timer *ratimer)
{
    struct ra_d3d11 *p = ra->priv;
    struct d3d_timer *timer = ratimer;

    //ID3D11DeviceContext_End(p->ctx, (ID3D11Asynchronous *)timer->ts_end);
    //ID3D11DeviceContext_End(p->ctx, (ID3D11Asynchronous *)timer->disjoint);

    return timer->result;
}

https://github.com/mpv-player/mpv/blob/b40241889b2e11816ded52640300d061fc401b6f/video/out/d3d11/ra_d3d11.c#L2075

endpne commented 1 month ago

@endpne @dragonflylee

经过检查所有的警告,最后测试这个地方

D3D11: WARNING: ID3D11DeviceContext::Begin: Begin is being invoked on a Query, where the previous results have not been obtained with GetData. This is valid; but unusual. The previous results are being abandoned, and new Query results will be generated. [ EXECUTION WARNING #408: QUERY_BEGIN_ABANDONING_PREVIOUS_RESULTS ]

D3D11 WARNING: ID3D11DeviceContext::End: End is being invoked on a Query, where the previous results have not been obtained with GetData.

还没有找到具体问题,但是注释后,播放正常,最新的mpv代码编译 ra_d3d11.c

static void timer_start(struct ra *ra, ra_timer *ratimer)
{
    struct ra_d3d11 *p = ra->priv;
    struct d3d_timer *timer = ratimer;

    // Latch the last result of this ra_timer (returned by timer_stop)
    timer->result = timer_get_result(ra, ratimer);

    //ID3D11DeviceContext_Begin(p->ctx, (ID3D11Asynchronous *)timer->disjoint);
    //ID3D11DeviceContext_End(p->ctx, (ID3D11Asynchronous *)timer->ts_start);
}

static uint64_t timer_stop(struct ra *ra, ra_timer *ratimer)
{
    struct ra_d3d11 *p = ra->priv;
    struct d3d_timer *timer = ratimer;

    //ID3D11DeviceContext_End(p->ctx, (ID3D11Asynchronous *)timer->ts_end);
    //ID3D11DeviceContext_End(p->ctx, (ID3D11Asynchronous *)timer->disjoint);

    return timer->result;
}

https://github.com/mpv-player/mpv/blob/b40241889b2e11816ded52640300d061fc401b6f/video/out/d3d11/ra_d3d11.c#L2075

🐂🍺