2017-01-02 2 views
21

Я пытаюсь отладить приложение виджетов на экране Android, которое я сделал. При нажатии кнопки на виджете начинается отладчик, а затем он просто отключается от виртуальной машины. Нет причин. Я использую Windows, 10.Отладчик отключается в Android Studio при отладке виджета главного экрана

Это то, что говорят журналы:

D/Atlas: Validating map... D/libEGL: loaded 
/system/lib/egl/libEGL_emulation.so D/libEGL: loaded 
/system/lib/egl/libGLESv1_CM_emulation.so D/libEGL: loaded 
/system/lib/egl/libGLESv2_emulation.so 

D/   ] HostConnection::get() New Host Connection established 0xef0394f0, tid 3709 
I/OpenGLRenderer: Initialized EGL, version 1.4 
D/OpenGLRenderer: Enabling debug mode 0 W/EGL_emulation: eglSurfaceAttrib not implemented 
W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xef1485e0, error=EGL_SUCCESS 
D/roboguice.RoboGuice: Using annotation database(s). 
D/roboguice.RoboGuice: Using annotation database(s) : [, roboguice] 
D/roboguice.RoboGuice: Time spent loading annotation databases : 21 
W/art: Verification of com.gdbd.geedeebeedee.model.GdbdWidgetRecord 
    com.gdbd.geedeebeedee.model.GdbdWidgetRecordsRealmImpl.create(java.util.Date) took 127.878ms 
W/art: Verification of com.gdbd.geedeebeedee.model.GdbdWidgetRecord 
    com.gdbd.geedeebeedee.model.GdbdWidgetRecordsRealmImpl.getTodaysRecord() took 111.586ms 
D/GdbdWidgetBase: Received intent: android.appwidget.action.APPWIDGET_ENABLED 
D/GdbdWidgetBase: Updating widget index: 0 with id: 23 
D/GdbdWidgetBase: Received intent: android.appwidget.action.APPWIDGET_UPDATE 
D/GdbdWidgetBase: Received intent: android.appwidget.action.APPWIDGET_UPDATE_OPTIONS 
D/GdbdWidgetBase: Received intent: change_day_staus 
I/art: Thread[5,tid=3470,WaitingInMainSignalCatcherLoop,Thread*=0xf3c30c00, 
    peer=0x22c0a0a0,"Signal Catcher"]: reacting to signal 3 
I/art: Wrote stack traces to '/data/anr/traces.txt' 
Disconnected from the target VM, address: 'localhost:8619', transport: 'socket' 

я вытащил traces.txt, но не нашел никаких сообщений об ошибке очевидных. Может быть, я не знаю, что искать. При первом размещении виджета на экране отладчик не отключается. Это происходит как с официальным эмулятором, так и с GenyMotion. Эмулятор Google Nexus 5 5.1.0 API 22.

enter image description here

Они являются Gradle построить установки:

android { 
    compileSdkVersion 25 
    buildToolsVersion "25.0.0" 
    defaultConfig { 
     applicationId "com.gdbd.geedeebeedee" 
     minSdkVersion 15 
     targetSdkVersion 25 
     versionCode 1 
     versionName "1.0" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } } 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
     exclude group: 'com.android.support', module: 'support-annotations' 
    }) 

    compile group: 'com.google.code.gson', name: 'gson', version: '2.3.1' 
    compile 'com.android.support:appcompat-v7:25.0.0' 

    compile 'org.roboguice:roboguice:3.+' 
    provided 'org.roboguice:roboblender:3.+' 

    testCompile 'junit:junit:4.12' } 

Кто-нибудь знает, что происходит и почему я не могу отлаживать? Благодарю.

Edit 1:

Видимо процесс умирает.
enter image description here

D/OpenGLRenderer: Enabling debug mode 0 
W/EGL_emulation: eglSurfaceAttrib not implemented 
W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xf3ff6900, error=EGL_SUCCESS 
D/roboguice.RoboGuice: Using annotation database(s). 
D/roboguice.RoboGuice: Using annotation database(s) : [, roboguice] 
D/roboguice.RoboGuice: Time spent loading annotation databases : 19 
80: 80 D/   ] Socket deconnection 
D/GdbdWidgetBase: Received intent: change_day_staus 
80: 80 D/   ] Socket deconnection 
80: 80 D/   ] Socket deconnection 
80: 80 D/   ] Socket deconnection 
80: 80 D/   ] Socket deconnection 
I/art: Thread[5,tid=13474,WaitingInMainSignalCatcherLoop,Thread*=0xf3c30c00, 
    peer=0x12c0a0a0,"Signal Catcher"]: reacting to signal 3 
I/art: Wrote stack traces to '/data/anr/traces.txt' 

Edit 2 добавил Android файл манифеста

`

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 

    <meta-data 
     android:name="roboguice.modules" 
     android:value="com.gdbd.geedeebeedee.model.ModelModule" /> 


    <activity 
     android:name=".activity.StatsActivity" 
     android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <receiver android:name=".widget.GdbdWidgetBase" > 
     <intent-filter> 
      <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="change_day_staus" /> 
     </intent-filter> 


     <meta-data android:name="android.appwidget.provider" 
      android:resource="@xml/gdbd_widget_info" /> 

    </receiver> 

</application> 

`

Редактировать 3 traces.txt https://ufile.io/c41eb

Edit 4 GdbdWidgetBase

@Inject 
    GdbdWidgetRecords gdbdWidgetRecords; 

    public void onHandleUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
     // Perform this loop procedure for each App Widget that belongs to this provider 
     for (int widgetIndex = 0; widgetIndex < appWidgetIds.length; widgetIndex++) { 
      int widgetId = appWidgetIds[widgetIndex]; 
      Log.d(TAG, "Updating widget index: " + widgetIndex + " with id: " + widgetId); 

      GdbdWidgetRecord todaysRecord = gdbdWidgetRecords.getTodaysRecord(); 

      RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.gdbd_widget); 

      if(todaysRecord.getCurrentStatus() == DayStatus.GOODDAY) 
       views.setImageViewResource(R.id.btnClicker, R.drawable.ic_gd); 
      else if(todaysRecord.getCurrentStatus() == DayStatus.BADDAY) 
       views.setImageViewResource(R.id.btnClicker, R.drawable.ic_bd); 
      else if(todaysRecord.getCurrentStatus() == DayStatus.NOTSET) 
       views.setImageViewResource(R.id.btnClicker, R.drawable.ic_undecided); 


      Intent intent = new Intent(context, GdbdWidgetBase.class); 
      intent.setAction(CHANGE_DAY_STATUS); 
      intent.putExtra(WIDGET_ID_EXTRA, widgetId); 
      PendingIntent changeStatusIntent = PendingIntent.getBroadcast(context, widgetId, intent, 
        PendingIntent.FLAG_CANCEL_CURRENT); 
      views.setOnClickPendingIntent(R.id.btnClicker, changeStatusIntent); 

      scheduleUpdateAtMidnight(context, widgetId); 

      appWidgetManager.updateAppWidget(widgetId, views); 
     } 
    } 

    @Override 
    public void onHandleReceived(Context context, Intent intent) { 
     Log.d(TAG, "Received intent: " + intent.getAction()); 
     //Log.d(TAG,"getDebugUnregister: " + (getDebugUnregister()?"true":"false")); 

     if (CHANGE_DAY_STATUS.equals(intent.getAction())) { 

      int appWidgetId = intent.getIntExtra(WIDGET_ID_EXTRA, -1); 
      if (appWidgetId >= 0) { 
       GdbdWidgetRecord todaysRecord = gdbdWidgetRecords.getTodaysRecord(); 
       Log.d(TAG, "today record: " + todaysRecord.toString()); 
       DayStatus newDayStatus = DayStatus.NOTSET; 

       if(todaysRecord.getCurrentStatus() == DayStatus.NOTSET) 
        newDayStatus = DayStatus.GOODDAY; 
       else if(todaysRecord.getCurrentStatus() == DayStatus.GOODDAY) 
        newDayStatus = DayStatus.BADDAY; 
       else if(todaysRecord.getCurrentStatus() == DayStatus.GOODDAY) 
        newDayStatus = DayStatus.NOTSET; 

       Log.d(TAG, "newDayStatus: " + newDayStatus); 

       gdbdWidgetRecords.changeTodaysStatus(newDayStatus); 
       onHandleUpdate(context, AppWidgetManager.getInstance(context), new int[]{appWidgetId}); 
      } 
     } 
    } 

    private void scheduleUpdateAtMidnight(Context context, int widgetId) { 
     Calendar calendar = Calendar.getInstance(); 
     calendar.setTimeInMillis(System.currentTimeMillis()); 
     calendar.set(Calendar.SECOND, 1); 
     calendar.set(Calendar.MINUTE, 0); 
     calendar.set(Calendar.HOUR_OF_DAY, 0); 
     calendar.add(Calendar.DAY_OF_YEAR, 1); 

     Intent updateAtMidnightIntent = new Intent(context, GdbdWidgetBase.class); 
     updateAtMidnightIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
     updateAtMidnightIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[]{widgetId}); 

     PendingIntent broadcastIntent = PendingIntent.getBroadcast(context, widgetId + 1, 
       updateAtMidnightIntent, PendingIntent.FLAG_CANCEL_CURRENT); 

     AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), broadcastIntent); 
     } else { 
      alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), broadcastIntent); 
     } 
    } 

Edit 5 Точка останова всегда в методе OnReceive() моего AppWidget. Для других намерений, как android.appwidget.action.APPWIDGET_ENABLED это занимает больше, прежде чем отладчик останавливается, но мое приложение по-прежнему умирает

01-09 22:28:20.861 3881-3881/com.gdbd.geedeebeedee D/GdbdWidget: Received intent: android.appwidget.action.APPWIDGET_ENABLED 
01-09 22:29:20.854 3881-3886/com.gdbd.geedeebeedee I/art: Thread[2,tid=3886,WaitingInMainSignalCatcherLoop,Thread*=0x7fbcebe06000,peer=0x2ac070a0,"Signal Catcher"]: reacting to signal 3 
01-09 22:29:21.013 3881-3886/com.gdbd.geedeebeedee I/art: Wrote stack traces to '/data/anr/traces.txt' 

В то время как для моего собственного намерения, посылаемые при нажатии кнопки в виджете он принимает 10 секунд.

01-09 22:34:25.353 4314-4314/com.gdbd.geedeebeedee D/GdbdWidget: Received intent: change_day_staus 
01-09 22:34:35.362 4314-4319/com.gdbd.geedeebeedee I/art: Thread[2,tid=4319,WaitingInMainSignalCatcherLoop,Thread*=0x7fbcebe06000,peer=0x2ac070a0,"Signal Catcher"]: reacting to signal 3 
01-09 22:34:35.549 4314-4319/com.gdbd.geedeebeedee I/art: Wrote stack traces to '/data/anr/traces.txt' 
+0

Благодарим за редактирование – Para

+0

Просьба предоставить ваш AndroidManifest.xml, работает ли ваш AppWidget в том же процессе, что и приложение? –

+0

Я добавил AndroidManifest. Как проверить, работает ли приложение AppWidget в том же процессе, что и приложение? Я новичок в разработке Android. Спасибо – Para

ответ

6

Я пошел в настройки эмулируемая устройства -> Параметры разработчика и включен «Показать все ошибках ANR» и теперь появляется предупреждение «Приложение не отвечает», и я могу нажать «WAIT» и, кажется, Работа.

-2

Возможно, это может вам помочь. Пожалуйста, когда вы проверяете ниже предложение

вы выбираете устройство и следующим выбрать имя пакета в правой стороне вы можете видеть рядом с Regex выбрать из выпадающего списка показывает только slected применения enter image description here

+0

Я сделал то, что вы предложили. См. Изменение выше. Видимо, процесс умирает. Но я не знаю почему. – Para

3

Это не решение для остановки отсоединения. Но вы можете снова подключить отладчик сразу после этого.Вы можете присоединить отладчик к запущенных процессов с помощью кнопки на панели инструментов:

enter image description here

Я знаю, что это не является идеальным, но, возможно, уже достаточно, чтобы продолжить отладку для вас.

+0

Процесс моих приложений убит, и я больше не могу его прикреплять, я должен перезапустить его. – Para

3

Вы пробовали отключить мгновенный запуск на Android Studio. Возможно, это противоречиво во время отладки.

+0

Я пробовал, и это не сработало. Тем не менее, я заметил что-то. В моем пользовательском намерении change_day_status отладчик падает через 10 секунд, а в других случаях, таких как android.appwidget.action.APPWIDGET_ENABLED, требуется минута. – Para

+0

Не могли бы вы сообщить мне, где все вы используете свои отладочные очки. Я думаю, что вы используете точки отладки в строках, которые должны выполнять огромную работу в потоке пользовательского интерфейса, из-за чего отладчик отделяется. – ChaitanyaAtkuri

+0

У меня есть класс GdbdWidget расширяет AppWidgetProvider, и я установил точку останова в методе onReceive() в этом классе – Para

1

Используйте этот плагин студии Android. ADB WIFI

Подключите оба устройства 1) PC/Laptop 2) Mobile в той же сети, и сделать это Tools -> Android -> WIFI ADB -> ADB USB к Wi-Fi.

Thanks

+0

появляется сообщение, в котором говорится: «Не удается подключиться к беспроводной сети или получить действительный IP-адрес» – Para

+0

оба устройства (ПК/ноутбук и мобильный телефон)) должна быть в той же сети Wi-Fi, она должна работать. сначала подключитесь к USB, а затем запустите эту процедуру после подключения, вы можете отсоединить кабель. –