调试 WatchFace 时永远 "Waiting for application to start debug server"

Forever "Waiting for application to start debug server" when debugging a WatchFace

我正在学习使用 Android Studio 3.1.4 在 WearOS 下开发表盘。我的调试器有问题。

看来我无法在调试模式 (Shift-F9) 下直接 运行 应用程序。如果我这样做,我会系统地收到以下消息,尽管在手表(模拟器或真实手表(Huawai Watch 2))上进行了授权调试:

08/24 09:03:00: Launching wearmodule
$ adb push     /path/wearmodule/build/outputs/apk/debug/wearmodule-debug.apk /data/local/tmp/com.example.wearmodule
$ adb shell pm install -t -r "/data/local/tmp/com.example.wearmodule"
Success


Waiting for application to come online: com.example.wearmodule.test | com.example.wearmodule
Waiting for application to come online: com.example.wearmodule.test | com.example.wearmodule
Waiting for application to come online: com.example.wearmodule.test | com.example.wearmodule
Connecting to com.example.wearmodule
Waiting for application to start debug server
Waiting for application to come online: com.example.wearmodule.test | com.example.wearmodule
Connecting to com.example.wearmodule
Waiting for application to start debug server
Waiting for application to come online: com.example.wearmodule.test | com.example.wearmodule
Connecting to com.example.wearmodule
Waiting for application to start debug server
Waiting for application to come online: com.example.wearmodule.test | com.example.wearmodule
Connecting to com.example.wearmodule
Waiting for application to start debug server
Waiting for application to come online: com.example.wearmodule.test | com.example.wearmodule
Connecting to com.example.wearmodule
Waiting for application to start debug server
Waiting for application to come online: com.example.wearmodule.test | com.example.wearmodule
Connecting to com.example.wearmodule
Waiting for application to start debug server
Waiting for application to come online: com.example.wearmodule.test | com.example.wearmodule
Connecting to com.example.wearmodule
Waiting for application to start debug server
Waiting for application to come online: com.example.wearmodule.test | com.example.wearmodule
Connecting to com.example.wearmodule
Waiting for application to start debug server
Waiting for application to come online: com.example.wearmodule.test | com.example.wearmodule
Connecting to com.example.wearmodule
Waiting for application to start debug server
Waiting for application to come online: com.example.wearmodule.test | com.example.wearmodule
Connecting to com.example.wearmodule
Waiting for application to start debug server
Waiting for application to come online: com.example.wearmodule.test | com.example.wearmodule
Connecting to com.example.wearmodule
Waiting for application to start debug server
Waiting for application to come online: com.example.wearmodule.test | com.example.wearmodule
Connecting to com.example.wearmodule
Waiting for application to start debug server
Waiting for application to come online: com.example.wearmodule.test | com.example.wearmodule
Connecting to com.example.wearmodule
Waiting for application to start debug server
Waiting for application to come online: com.example.wearmodule.test | com.example.wearmodule
Connecting to com.example.wearmodule
Waiting for application to start debug server
Could not connect to remote process. Aborting debug session.

如果我没理解错的话,调试服务器必须在手表本身上启动。我怎样才能做到这一点?

如果我想调试我的手表,唯一的选择是 运行 正常模式下的应用程序 (Shift-F10) 然后 然后 将调试器附加到进程.

这并不理想,因为它不允许我对代码的初始化过程进行故障排除。特别是像initializeWatchFace()onCreate()onSurfaceChanged()这样的方法无法调试,真烦人。

手表本身、清单中的某个地方是否需要做任何特别的事情来解决这个问题?它是否与我的应用程序没有 activity 这一事实有关(如 Google CodeLab 中所述)。我似乎有消息将这些问题与活动管理联系起来。

除了您已经找到的解决方案外,恐怕没有真正的解决方案:正常启动表盘,然后将调试器附加到它上面。如您所料,问题在于调试器正在等待 Activity 启动;因为表盘是基于 Service 而不是,所以这永远不会发生。

但是,您可以使用一些技巧来帮助调试表盘启动代码。这是一种方法:

  1. 根据需要在您的启动代码中放置断点,然后 运行 表盘正常。
  2. 将调试器附加到您的表盘。
  3. 切换到手表上的不同 面孔。只要您的进程在手表上处于活动状态,调试器就应该保持连接状态,并且您将有几秒钟的时间直到系统终止它。
  4. 切换回你自己的脸。此时你所有的启动代码应该运行。

如果这不起作用,另一种方法是在您的应用中创建 "dummy" activity,使用 Android Studio 中的 Shift-F9 对其进行调试,然后设置你的表盘。同样,在建立调试器会话后,所有启动代码都应该 运行。

注意:调试表盘时您会发现的另一个烦恼是 OS 会在停止几秒钟后作为 ANR 杀死您的进程调试器。除了快点之外,我还没有找到解决此问题的方法!

另一种选择是覆盖表盘服务上的 onCreate 方法并调用 Debug.waitForDebugger()

override fun onCreate() {
    Debug.waitForDebugger()
    super.onCreate()
}

在 Android Studio 中使用 Run,以便在手表中安装表盘服务。 然后在 Android Studio 中转到 Run 顶部菜单,那里有 select Attach to Process...

waitForDebugger 基本上使主线程暂停,直到附加了调试器。您可以将 Debug.waitForDebugger 放在代码中任何更有意义的地方。

重新启动 Android Studio 对我有用。