Я учусь разрабатывать циферблаты под WearOS с Android Studio 3.1.4. У меня проблемы с отладчиком.
Кажется, я не могу запустить приложение напрямую в режиме отладки (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()
, что очень раздражает.
Есть ли что-то особенное, что нужно сделать на самих часах, в манифесте, где-нибудь, чтобы исправить это? Может ли это быть связано с тем, что в моем приложении нет активности (как учат в Google CodeLab). Мне кажется, что сообщения связывают эти проблемы с управлением действиями.
Боюсь, что нет никакого реального решения, кроме того, что вы уже нашли: запустить циферблат в обычном режиме, а затем прикрепить к нему отладчик. Как вы уже догадались, проблема в том, что отладчик ожидает запуска Activity
; поскольку циферблат основан на Service
, этого никогда не происходит.
Однако есть несколько приемов, которые можно использовать для отладки кода запуска циферблата. Вот один из подходов:
Если это не сработает, альтернативным методом является создание «фиктивного» действия в вашем приложении, отладка его с помощью Shift-F9
из Android Studio, а затем установка циферблата. Опять же, весь ваш код запуска должен запускаться после установления сеанса отладчика.
ПРИМЕЧАНИЕ: еще одна неприятность, которую вы обнаружите при отладке циферблатов, заключается в том, что ОС убьет ваш процесс как ANR после остановки в отладчике всего на несколько секунд. Я не нашел обходного пути, кроме как просто побыстрее!
Жалко это слышать. Похоже, что инструменты разработки циферблатов нуждаются в серьезных улучшениях. Для такого новичка, как я, немного больно управлять всеми дисфункциями эмулятора / отладчика И преодолевать все трудности, присущие задаче в целом. В любом случае, спасибо за разъяснения.
Верно. Я разговаривал с командой разработчиков Wear об этих проблемах в Google I / O последние пару лет, и, хотя они признают, что проблемы реальны, не было проявлено интереса к их решению. ?
Другой вариант - переопределить метод onCreate
в службе циферблата и вызвать Debug.waitForDebugger ().
override fun onCreate() {
Debug.waitForDebugger()
super.onCreate()
}
Используйте Run
в Android Studio, чтобы на ваших часах была установлена служба циферблата.
Затем в Android Studio перейдите в верхнее меню Run
и там выберите Attach to Process...
.
waitForDebugger
в основном ставит основной поток на паузу, пока не будет подключен отладчик. Вы можете разместить Debug.waitForDebugger
в любом месте вашего кода.
У меня сработал перезапуск Android Studio.
Вы можете попробовать решение, представленное в этом SO поток: включить USB-отладку для обоих устройств или сделать недействительными кеши / перезапустить.