v2.6.1: quick launch with fallback
Browse files
hubble.py
CHANGED
|
@@ -308,8 +308,57 @@ def run_hubble_sync(raw_input_text, scratch_dir, log, progress, stop_event=None)
|
|
| 308 |
except: pass
|
| 309 |
|
| 310 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 311 |
def run_hubble_launch(raw_input_text, scratch_dir, log, progress, stop_event=None):
|
| 312 |
-
"""
|
| 313 |
def check_stop():
|
| 314 |
if stop_event and stop_event.is_set():
|
| 315 |
raise HubbleError("用户已中断")
|
|
@@ -320,10 +369,19 @@ def run_hubble_launch(raw_input_text, scratch_dir, log, progress, stop_event=Non
|
|
| 320 |
|
| 321 |
sess = _init_session(raw_input_text, log, progress, check_stop)
|
| 322 |
try:
|
| 323 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 324 |
png = _screenshot(sess, scratch_dir, log)
|
| 325 |
-
log("\n=== Hubble 启动页面完成 ===")
|
| 326 |
-
log("请查看截图确认是否成功.")
|
| 327 |
progress(100)
|
| 328 |
return True, png, None
|
| 329 |
finally:
|
|
|
|
| 308 |
except: pass
|
| 309 |
|
| 310 |
|
| 311 |
+
def _quick_launch(sess, log, progress, check_stop):
|
| 312 |
+
"""快速尝试: 直接 am start intent, 不暖机. 返回 True=成功 False=白屏需兜底."""
|
| 313 |
+
log("[快速] 尝试直接启动 (不暖机)...")
|
| 314 |
+
progress(22)
|
| 315 |
+
check_stop()
|
| 316 |
+
|
| 317 |
+
# 先 force-stop 再启动
|
| 318 |
+
sess.sh(f"am force-stop {DST_PKG}", check=False)
|
| 319 |
+
time.sleep(2)
|
| 320 |
+
|
| 321 |
+
intent = INTENT_TEMPLATE.format(dst=DST_PKG, url=CERT_URL)
|
| 322 |
+
sess.sh(f'am start "{intent}"', check=False)
|
| 323 |
+
log(" intent 已发送, 等待 15s...")
|
| 324 |
+
progress(30)
|
| 325 |
+
|
| 326 |
+
for i in range(15):
|
| 327 |
+
check_stop()
|
| 328 |
+
time.sleep(1)
|
| 329 |
+
progress(30 + i)
|
| 330 |
+
|
| 331 |
+
# 验证: top activity + WebView 日志
|
| 332 |
+
top = sess.sh(
|
| 333 |
+
"dumpsys activity activities | grep topResumedActivity | head -1",
|
| 334 |
+
check=False,
|
| 335 |
+
).strip()
|
| 336 |
+
|
| 337 |
+
if "LiveDummyActivity" not in top:
|
| 338 |
+
log(" [快速] Activity 不在前台, 需兜底")
|
| 339 |
+
return False
|
| 340 |
+
|
| 341 |
+
# 检查 WebView 实例是否创建 (cr_AwContents / cr_TTPlugin)
|
| 342 |
+
pid = sess.sh(
|
| 343 |
+
f"ps -ef | grep {DST_PKG} | grep -v grep | head -1 | awk '{{print $2}}'",
|
| 344 |
+
check=False,
|
| 345 |
+
).strip()
|
| 346 |
+
if pid:
|
| 347 |
+
wv = sess.sh(
|
| 348 |
+
f"logcat -d --pid={pid} 2>/dev/null | grep -iE 'cr_AwContents|cr_TTPlugin' | tail -1",
|
| 349 |
+
check=False, timeout=10,
|
| 350 |
+
).strip()
|
| 351 |
+
if wv:
|
| 352 |
+
log(" [快速] WebView 已创建, 成功!")
|
| 353 |
+
return True
|
| 354 |
+
|
| 355 |
+
# Activity 在前台但 WebView 未检测到 — 可能白屏
|
| 356 |
+
log(" [快速] WebView 未检测到, 可能白屏, 进入兜底...")
|
| 357 |
+
return False
|
| 358 |
+
|
| 359 |
+
|
| 360 |
def run_hubble_launch(raw_input_text, scratch_dir, log, progress, stop_event=None):
|
| 361 |
+
"""先快速直接启动, 失败则暖机+轮询兜底."""
|
| 362 |
def check_stop():
|
| 363 |
if stop_event and stop_event.is_set():
|
| 364 |
raise HubbleError("用户已中断")
|
|
|
|
| 369 |
|
| 370 |
sess = _init_session(raw_input_text, log, progress, check_stop)
|
| 371 |
try:
|
| 372 |
+
# 第一轮: 快速尝试
|
| 373 |
+
if _quick_launch(sess, log, progress, check_stop):
|
| 374 |
+
progress(95)
|
| 375 |
+
png = _screenshot(sess, scratch_dir, log)
|
| 376 |
+
log("\n=== 快速启动成功 ===")
|
| 377 |
+
progress(100)
|
| 378 |
+
return True, png, None
|
| 379 |
+
|
| 380 |
+
# 第二轮: 完整暖机兜底
|
| 381 |
+
log("[兜底] 进入完整暖机+轮询流程...")
|
| 382 |
+
_do_launch(sess, log, progress, check_stop, pct_start=50, pct_end=97)
|
| 383 |
png = _screenshot(sess, scratch_dir, log)
|
| 384 |
+
log("\n=== Hubble 启动页面完成 (兜底) ===")
|
|
|
|
| 385 |
progress(100)
|
| 386 |
return True, png, None
|
| 387 |
finally:
|