widgets tipos studio programacion móviles diseño desarrollo curso aplicaciones aparece android debugging android-studio android-sdk-tools

tipos - programacion android pdf 2018



El depurador se desconecta en Android Studio al depurar un widget de la pantalla de inicio (5)

¿Has intentado desactivar la ejecución instantánea en Android Studio? Puede ser que esté en conflicto durante la depuración.

Estoy tratando de depurar una aplicación de widget de la pantalla de inicio de Android que hice. Al presionar un botón en el widget, el depurador se inicia y luego simplemente se desconecta de la máquina virtual. No se da ninguna razón. Estoy usando Windows 10.

Esto es lo que dicen los registros:

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''

También extraje traces.txt, pero no he encontrado ningún mensaje de error obvio. Tal vez no sé qué buscar. Al colocar por primera vez el widget en la pantalla, el depurador no se desconecta. Esto sucede tanto con el emulador oficial como con GenyMotion. El emulador es Google Nexus 5 5.1.0 API 22.

Estos son los ajustes de compilación de 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'' }

¿Alguien sabe qué está pasando y por qué no puedo depurar? Gracias.

Edición 1:

Aparentemente el proceso muere.

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''

Editar 2 archivo de manifiesto de Android agregado

`

<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>

`

Editar 3 traces.txt https://ufile.io/c41eb

Editar 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); } }

Editar 5 El punto de interrupción siempre está en el método onReceive () de mi AppWidget. Para otros intentos, como android.appwidget.action.APPWIDGET_ENABLED, se necesita más antes de que el depurador se detenga, pero mi aplicación aún muere.

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''

Mientras que para mi propia intención, esto se envía cuando se presiona un botón dentro del widget, toma 10 segundos.

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''


Esta no es una solución para detener el desprendimiento. Pero puede volver a adjuntar el depurador directamente después. Puede adjuntar el depurador a los procesos en ejecución con el botón en la barra de herramientas:

Sé que no es lo ideal, pero tal vez ya sea suficiente para continuar la depuración para usted.


Fui a Configuración del dispositivo emulado -> Opciones del desarrollador y habilité "Mostrar todas las ANR" y ahora aparece una advertencia "Su aplicación no responde" y puedo presionar "ESPERAR" y parece que funciona.


Puede ser que esto pueda ser de ayuda. Por favor, una vez que compruebe la sugerencia de abajo

elige su dispositivo y, a continuación, elige el nombre de su paquete en el lado derecho que puede ver al lado de regex.


Utilice este plugin de Android studio. ADB WIFI

Conecte ambos dispositivos 1) PC / portátil 2) Móvil en la misma red y haga lo siguiente Herramientas -> Android -> ADB WIFI -> ADB USB a WIFI.

Gracias