Отключение отладчика в Android Studio при отладке виджета главного экрана
Я пытаюсь отладить приложение Android Home screen widget, которое я сделал. При нажатии кнопки на виджете запускается отладчик, а затем он просто отключается от виртуальной машины. Причины не приводятся. Я использую Windows 10.
вот что говорят журналы:
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'
Я также вытащил следы.txt, но не нашли никакого очевидного сообщения об ошибке. Может, я не знаю, что искать. При первом размещении виджета на экране отладчик не отключается. Этот происходит как с официальным эмулятором, так и с GenyMotion. Эмулятор Google Nexus 5 5.1.0 API 22.
это настройка сборки 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:
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'
Изменить 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 следы.txt https://ufile.io/c41eb
изменить 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);
}
}
изменить 5 Точка останова всегда находится в методе onReceive () моего AppWidget. Для других целей, таких как Android.appwidget.действие.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'
5 ответов
Я пошел в Настройки эмулируемого устройства - > Параметры разработчика и включил "показать все ANRs", и теперь появляется предупреждение" ваше приложение не отвечает", и я могу нажать" ждать", и это, кажется, работает.
Это не решение, чтобы остановить отсоединения. Но вы можете повторно подключить отладчик непосредственно после этого. Вы можете прикрепить отладчик к запущенным процессам с помощью кнопки на панели инструментов:
Я знаю, что это не идеально, но, возможно, это уже достаточно, чтобы продолжить отладку для вас.
используйте этот плагин Android studio. ADB WIFI
подключите оба устройства 1) ПК / ноутбук 2) мобильный телефон в той же сети и сделайте это Инструменты - > Android - > ADB WIFI - > ADB USB для WIFI.
спасибо