【折騰記錄】Ubuntu24.04LTS下安裝Windows版微信

Re-Ch發表於2024-08-01

最近裝了Win11和Ubuntu雙系統,為了能更方便地和朋友交流,遂決定在Ubuntu下安裝微信。

首先要去網上找教程,經過一番搜尋,正當我在wine和deepin-wine之間猶豫不定之時,忽然發現了GitHub上的這個倉庫zq1997/deepin-wine

據其README描述:

deepin-wine環境與應用在Debian/Ubuntu上的移植倉庫
使用deepin官方原版軟體包
安裝QQ/微信只需要兩條命令

居然還有這麼方便的事情?那必須得是選擇這種方式啊!

殊不知,README中還藏著一段文字,被我所忽視,而它將為後文的一切埋下深深的伏筆……

Linux不是Windows,Wine也不是Windows,不要期待100%絲滑享受。

依賴問題

在依據其README完成setup之後,使用apt安裝微信,出現類似下面的依賴問題:

(因為當時自己這邊的資訊找不到了,所以用了GitHub上別人的)

正在讀取軟體包列表... 完成
正在分析軟體包的依賴關係樹... 完成
正在讀取狀態資訊... 完成
有一些軟體包無法被安裝。如果您用的是 unstable 發行版,這也許是
因為系統無法達到您要求的狀態造成的。該版本中可能會有一些您需要的軟體
包尚未被建立或是它們已被從新到(Incoming)目錄移出。
下列資訊可能會對解決問題有所幫助:

下列軟體包有未滿足的依賴關係:
libsane : 依賴: libsane-common (= 1.0.27.2-3.2+deepin) 但是 1.2.1-7build4 正要被安裝
E: 無法修正錯誤,因為您要求某些軟體包保持現狀,就是它們破壞了軟體包間的依賴關係。

因為有很多已安裝的包依賴於1.2.1版本的libsane-common,所以只能嘗試提高deepin版微信依賴的libsane-common的版本。

因此需要修改deb包中的依賴資訊並重新打包。

但是由於不是很懂Ubuntu的包管理機制,只好在這個倉庫的issues裡搜尋sane關鍵詞,最終找到了這篇博文——解決向日葵軟體在Ubuntu 20.04依賴libwebkitgtk-3.0-0等問題

透過aptitude可以發現,是com.qq.weixin.deepin包依賴的deepin-wine8-stable包依賴了libsane,所以需要修改deepin-wine8-stable包的deb。

先下載對應的deb檔案,

apt download deepin-wine8-stable

然後參照這篇博文去修改即可。

由於我才疏學淺,不知道怎麼指定版本為>=1.2.1(試過了修改版本號但是有問題,睡了一覺忘記問題是啥了),為了快速解決問題,用了個簡單粗暴的方法——直接去掉libsane這個依賴項。

安裝上述博文中的方法修改,然後重新打包,再使用

apt install ./xxx.deb

安裝即可(install後面要寫一個路徑,否則apt會認為是包名從而到倉庫中去找)

接著再使用

sudo apt-get install com.qq.weixin.deepin

來安裝微信就沒有問題了,安裝好之後可能需要登出再重新登陸(或者重啟)才能看到微信的圖示。

高興得太早

正當高興之時,開啟微信,發現居然提示解壓錯誤了。

不過好在,在GitHub Issues裡找到了適配的解決方案:微信解壓失敗,files.7z的md5值不正確 #378

image

按照上圖方法修改後,終於可以開啟微信了……

後記

探究解壓失敗的原因

在run_v4.sh中找到相關程式碼,發現其邏輯是這樣的:

如果7z解壓檔案後返回的狀態碼不是0,則認為是解壓失敗。

ExtractApp()
{
    $SHELL_DIR/deepin-wine-banner unpack &
        mkdir -p "$1"
        7z x "$APPDIR/$APPTAR" -o"$1"
    if [ $? != 0 ];then
        $SHELL_DIR/deepin-wine-banner info "解壓失敗"
        rm -rf "$1"
        exit 1
    fi
        mv "$1/drive_c/users/@current_user@" "$1/drive_c/users/$USER"
        sed -i "s#@current_user@#$USER#" $1/*.reg
    FixLink
    $SHELL_DIR/deepin-wine-banner unpacked
}

而在7z命令後面加上 || true之後,這條命令的返回值就一定是0了,也就是忽略7z解壓錯誤,繼續執行後面的程式碼。

可是為什麼明明解壓發生錯誤了,還能正常啟動呢?

我嘗試自己執行了run指令碼中的解壓命令,發現裡面是有一些危險的連結被忽略了,從而導致了ERROR。

例如:

ERROR: Dangerous link path was ignored : drive_c/windows/winhlp32.exe : /opt/deepin-wine8-stable/lib/wine/i386-windows/winhlp32.exe

除了這些連結以外的檔案似乎都被正確地解壓出來了,但是我不太理解為什麼沒有這些連結,應用也能正常執行,也許是實際執行時沒有用到,或者deepin-wine(或wine)對此有fallback機制?

待解決的托盤問題

deepin-tool中修改托盤的指令碼在Ubuntu中無法生效,從而導致微信視窗關閉之後無法再開啟。重新點選微信圖示則會造成前一個視窗的crash,然後又得重新登陸。

後面有空看看能不能修改一下托盤相關指令碼,讓它能夠正常執行。

相關文章