Android作成したホーム画面ウィジェットアプリケーションをデバッグしようとしています。ウィジェットのボタンを押すと、デバッガーが起動し、VMから切断されます。理由はありません。私は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'
Traces.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' }
誰かが何が起こっているのか、なぜ私がデバッグできないのか知っていますか?ありがとう。
編集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>
`
編集3traces.txt https://ufile.io/c41eb
編集4GdbdWidgetBase
@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ブレークポイントは常にAppWidgetのonReceive()メソッドにあります。 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'
エミュレートされたデバイスの[設定]-> [開発者向けオプション]に移動して[すべてのANRを表示する]を有効にすると、「アプリケーションが応答していません」という警告が表示され、[待機]をタップすると機能するようです。
Android Studioでインスタント実行を無効にしてみました。デバッグ中に競合している可能性があります。
Android studio。 ADB WIFI のこのプラグインを使用します
両方のデバイスを接続する1)PC /ラップトップ2)モバイルを同じネットワークに接続して、このツールを実行します-> Android-> ADB WIFI-> ADB USB to WIFI。
ありがとう