首次啟動與 Runtime
Android 版的首次啟動分兩段:先把 Linux Runtime 部署到應用私有目錄,再啟動 Runtime 裡的 AzurPilot。兩段都可能失敗,但錯誤資訊是分開的。
部署狀態機
| 狀態 | 含義 | 下一步 |
|---|---|---|
Checking | 檢查已裝版本 | 自動繼續 |
NotInstalled | 尚未部署 | 主頁點「下載 Runtime」 |
NotBundled | 輕量包且 Release 無本架構 | 換完整包 |
LowDisk | 剩餘不足 2 GB | 清理空間 |
Downloading | 下載中(按壓縮字節計) | 等待 |
Extracting | 解壓縮中(同樣按壓縮字節計) | 等待 |
Ready | 就位 | 啟動 |
Failed | 異常 | 看 reason 重試 |
部署不會自動開始:完整包內置 rootfs,但依然要你點一下「下載 Runtime」才會解壓縮。這是為了避免在存儲不足時靜默失敗。
部署做了什麼
- 若存在
rootfs.previous(上次中斷),先恢復。 - 校驗
.provisioned標記、BUILD_MANIFEST與設備 ABI 是否一致。 - 解壓縮到
rootfs.tmp,成功後原子改名為rootfs——半途失敗不會留下半成品。 - 保留
config/(含 SQLite、實例目錄)、password.txt、log/。 - 寫入新標記,完成。
下載支援四連接分段(≥8 MiB 時先做 Range 探測),失敗自動回退單連接重試一次。完成後校驗大小與 SHA-256,任一不符進入 Failed。
為什麼第一次打開 WebUI 很慢
解壓縮時會剝離 __pycache__。新 rootfs 第一次啟動要重建全部字節碼,WebUI 可能超過 90 秒才就緒。日誌裡會出現:
AzurPilot WebUI not ready within 90000ms這是預期警告,不是錯誤。服務隨後會自然就緒,第二次啟動恢復正常速度。
不要在這個階段強殺應用
強殺會留下未完成的會話與鎖。等它自己起來,或者用應用內的「停止 Runtime」走正常收尾。
必要權限
| 權限 | 用途 | 不給會怎樣 |
|---|---|---|
| 通知 | 前臺服務、配對碼、任務狀態 | 無法用通知完成無線配對 |
| 電池最佳化白名單 | 後臺保活 | 息屏後處理程序可能被回收 |
| 懸浮窗 | 全局控制面板 | 無法在其他應用上操作 |
| 安裝未知應用 | 應用內更新 APK | 只能手動下載安裝 |
| 所有檔案訪問(可選) | 匯出日誌到公共目錄 | 匯出到應用私有目錄 |
不同廠商還有額外的「自啟動」「後臺彈出視窗」「省電策略」開關。Android 12+ 的「精確鬧鐘」與本應用無關,不需要給。
啟用權限
本地執行必須啟用特權服務,否則無法建立虛擬螢幕、截圖與注入觸控。三種方式:
| 方式 | 適用 | 入口 |
|---|---|---|
| 內置 ADB(推薦) | Android 11+ | 設定 → 執行與安全 → 內置 Shizuku |
| Root | 已 root 設備 | 同一頁面選擇 Root |
| 外部 Shizuku / Sui | 已裝管理器 | 同一頁面選擇外部服務 |
詳細步驟見權限啟用。
啟動 Runtime
- 主頁確認 Runtime 為
Ready。 - 點擊「啟動」。
- 等待狀態變為執行中;首次啟動可能較慢。
- 打開「控制台」,進入內嵌 WebUI。
內嵌 WebUI 與桌面版是同一套前端,連接埠 25548,由 Runtime 監聽在 127.0.0.1。宿主的 AzurPilotGateway 是唯一的 /api/v1/ws 訂閱者。
建立第一個實例
控制台 → 已安裝配置 → 新建。名稱用 ap 或自定義。
模擬器/本機上的遊戲包名。Android 宿主通常就是國服 com.bilibili.azurlane,渠道服按實際選擇。
Android 宿主必須使用 azurpilot_android 截圖與控制方案。其他方案走 ADB,無法訪問虛擬螢幕。
先開「科研」或「收穫」,把下一次執行時間設為現在。
掛機頁能看到畫面變化,日誌出現任務開始/結束,就說明整條鏈路通了。
驗證清單
| 檢查 | 通過標準 |
|---|---|
| Runtime 狀態 | 執行中,無反覆重新啟動 |
| 畫面推流 | 掛機頁能看到遊戲畫面 |
| 控制台 | 實例列表、任務頁可打開 |
| 任務 | 日誌有完整開始/結束,遊戲內狀態變化 |
| 後臺 | 切到其他應用 5 分鐘後回來,任務仍在跑 |