BlueStacks 在 Hyper-V 模式下取得 ADB Port 的方法

之前用 BlueStacks 模擬器和 ADB 來測試程式
但我為了使用 WSL,開啟了 Hyper-V
導致了 BlueStacks 的 ADB 的 Port 會一直更改,並不是固定的
每次重新開啟 BlueStacks 模擬器後,都要更改設定…

從 2020 年底開始1BlueStacks 推出了基於 Hyper-V 的模擬器,玩家終於不用再一直去開關 Hyper-V,雖然目前我測試下來使用 Hyper-V 版本的性能上會弱於沒有使用 Hyper-V 的,但是也還算堪用,至少不用一直重複去更改設定。
雖然我覺得性能上的減損影響不大,但 Hyper-V 版本的 BlueStacks 有一個問題卻一直讓我很厭煩,每次我在使用 ADB 的時候,模擬器的 ADB 的 Port 就會隨機跳動,導致我每次重開模擬器都要去看新的 Port 是多少,於是就有了今天這篇。
解決辦法
我在網路上找了好久,官方的回覆都是這是正常的,Port 沒辦法固定,但最後我在 Reddit 上看到了一篇文章 2,雖然官方沒辦法固定 Port,但我們可以透過一些手段來讀取當前的 Port,一樣可以自動連上 ADB。
如果沒有更動預設安裝位置,BlueStacks 會將模擬器參數存放在 C:\ProgramData\BlueStacks_nxt\bluestacks.conf
,

C:\ProgramData\BlueStacks_nxt
打開後會看到密密麻麻的設定參數,由於 BlueStacks 可以多開模擬器,因此裡面會有多個模擬器的參數,每個多開模擬器的 prefix 也都不同,像這裡是 bst.instance.Nougat64
,後續可能依照 Android 版本不同,也會有像是 bst.instance.Pie64
。

bluestacks.conf (prefix)
不過,BlueStacks 的模擬器名稱 (display_name) 都是唯一的,因此可以先依靠名稱來找到我們的目標模擬器的 prefix,再找到目標模擬器的 port。

bluestacks.conf (display_name)
這邊用 regex 來找到我們的目標模擬器,如果我們的目標模擬器名稱為 BlueStacks App Player
,則正規表達式為:
(.+).display_name="BlueStacks App Player"
找到目標模擬器的 prefix 之後,可以再找 port,例如找到的 prefix 是 bst.instance.Nougat64
,正規表達式為:
bst.instance.Nougat64.status.adb_port="(\d+)"
這邊附上完整的 Python code:
import re
# 讀取所有檔案內的內容
with open(r'C:\ProgramData\BlueStacks_nxt\bluestacks.conf', 'r') as file:
data = file.read()
# 找目標模擬器的正規表達式
BS_name = "BlueStacks App Player"
prefix_pattern = rf'(.+).display_name="{BS_name}"'
# 找目標模擬器
m = re.search(prefix_pattern, data)
prefix = m.group(1)
print(prefix)
# 找 port 的正規表達式
port_pattern = rf'{prefix}.status.adb_port="(\d+)"'
# 找 port
m = re.search(port_pattern, data)
port = int(m.group(1))
print(port)
Reference
如果你覺得這篇文章有用 可以考慮贊助飲料給大貓咪