在 Linux 上用 Waydroid 跑酷安,結果每次開啟都立刻閃退。
問題現象
啟動酷安後,應用程式視窗會短暫出現,然後立刻閃退。透過 waydroid logcat 查看日誌,發現大量錯誤訊息:
E LoadedApk: java.lang.ClassNotFoundException: Didn't find class
"androidx.core.app.CoreComponentFactory"
以及:
E ActivityManager: ANR in com.coolapk.market
E ActivityManager: Reason: Input dispatching timed out
E ActivityManager: 68% kernel
App 不斷出現 ANR(Application Not Responding),且 68% 的時間都花在 kernel 上,這暗示著問題出在 native 層。
問題分析
進一步查看日誌,發現了關鍵線索:
F .coolapk.market: runtime.cc:675] native: #10 pc ...
/system/lib64/libndk_translation.so
我的 Waydroid 使用的是 x86_64 架構,而酷安是 ARM 應用程式。Waydroid 需要透過轉譯層將 ARM 指令轉換為 x86 指令才能執行。
檢查目前使用的轉譯層:
sudo waydroid shell getprop ro.dalvik.vm.native.bridge
# 輸出: libndk_translation.so
libndk_translation 是 Waydroid 預設的開源 ARM 轉譯層,但它與酷安的某些 native 程式碼不相容。
解決方案
切換到 libhoudini——Google 開發的 ARM 轉譯層,相容性通常比 libndk_translation 更好。
步驟 1:安裝 waydroid_script
cd /tmp
git clone https://github.com/casualsnek/waydroid_script.git
cd waydroid_script
sudo pip3 install --break-system-packages -r requirements.txt
步驟 2:安裝 libhoudini
sudo python3 main.py install libhoudini
腳本會自動下載並安裝 libhoudini 到 Waydroid 系統映像檔中。
步驟 3:重新啟動 Waydroid 容器
sudo waydroid container restart
步驟 4:驗證安裝
sudo waydroid shell getprop ro.dalvik.vm.native.bridge
# 輸出: libhoudini.so
確認已切換到 libhoudini 後,重新啟動酷安:
waydroid app launch com.coolapk.market
這次 App 成功啟動,不再閃退。
總結
| 項目 | 說明 |
|---|---|
| 問題 | 酷安在 Waydroid 中閃退 |
| 原因 | libndk_translation 與酷安 native 程式碼不相容 |
| 解決 | 切換到 libhoudini |
| 工具 | waydroid_script |
其他 ARM App 閃退也可以試試這個方法。不過 libhoudini 是 Google 的閉源元件,可能存在授權問題。
測試環境:Linux 6.14.0-37-generic, Waydroid MAINLINE, Android 13