認証済みのクラウド エンドポイントを呼び出すと、多数の強制終了/強制終了を受け取るアプリケーションが本番環境にあります。最もわかりやすいメッセージは" java.lang.IllegalArgumentException: Service not registered: com.google.android.gms.internal.es@4481e6a8"です。ロジックは 95% の確率で正しく機能します。障害のスタック トレースは次のとおりです。
java.lang.RuntimeException: java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) で android.os.AsyncTask$3.done(AsyncTask.java:200) で doInBackground() を実行中にエラーが発生しましたjava.util.concurrent.FutureTask.setException(FutureTask.java:124) で java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) で java.util.concurrent.FutureTask.run(FutureTask.java: 137) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) で java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) で java.lang.Thread.run(Thread.java) :1096) 原因: java.lang.IllegalArgumentException: サービスが登録されていません: com.google.android.gms.internal.es@4481e6a8 at android.app.ActivityThread$PackageInfo.forgetServiceDispatcher(ActivityThread.java:1074) at android.android.content.ContextWrapper.unbindService(ContextWrapper.java:352) の app.ContextImpl.unbindService(ContextImpl.java:886) .Context,java.lang.String,java.lang.String)(不明なソース) java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) で java.util.concurrent.FutureTask$Sync.innerRun で(FutureTask.java:305) で java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) で java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) で com.google. android.gms.auth.GoogleAuthUtil.java.lang.String getToken(android.content.Context,java.lang.String,java.lang.String)(ソース不明) java.util.concurrent.FutureTask$Sync.innerRun( FutureTask.java:305) で java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) で java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) で java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) で com.google.api.client.googleapis .extensions.android.gms.auth.GoogleAccountCredential.java.lang.String getToken()(SourceFile:192) at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.void interrupt( com.google.api.client.http.HttpRequest)(SourceFile:217) at com.google.api.client.http.HttpRequest.com.google.api.client.http.HttpResponse execute()(SourceFile:836) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.com.google.api.client.http.HttpResponse executeUnparsed(boolean)(SourceFile:412) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.com .google.api.client.http.HttpResponse executeUnparsed()(SourceFile:345) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.java.lang.Object execute()(SourceFile:463) at com.jdub.empiretracker.EmpireTrackerActivity$QueryMarketStats.com. google.api.services.marketendpoint.model.Market doInBackground(com.google.api.services.marketendpoint.model.Market[])(SourceFile:355) com.jdub.empiretracker.EmpireTrackerActivity$QueryMarketStats.java.lang.Object でdoInBackground(java.lang.Object[])(SourceFile:1) で android.os.AsyncTask$2.call(AsyncTask.java:185) で java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) で... 4 つ以上EmpireTrackerActivity$QueryMarketStats.com.google.api.services.marketendpoint.model.Market doInBackground(com.google.api.services.marketendpoint.model.Market[])(SourceFile:355) com.jdub.empiretracker.EmpireTrackerActivity$QueryMarketStats で.java.lang.Object doInBackground(java.lang.Object[])(SourceFile:1) で android.os.AsyncTask$2.call(AsyncTask.java:185) で java.util.concurrent.FutureTask$Sync.innerRun( FutureTask.java:305) ... 4 つ以上EmpireTrackerActivity$QueryMarketStats.com.google.api.services.marketendpoint.model.Market doInBackground(com.google.api.services.marketendpoint.model.Market[])(SourceFile:355) com.jdub.empiretracker.EmpireTrackerActivity$QueryMarketStats で.java.lang.Object doInBackground(java.lang.Object[])(SourceFile:1) で android.os.AsyncTask$2.call(AsyncTask.java:185) で java.util.concurrent.FutureTask$Sync.innerRun( FutureTask.java:305) ... 4 つ以上さらに4さらに4
私の実装は、Google のサンプルと非常に一致しています。たとえば、私の Android アクティビティでは、次のように AsyncTask を使用して呼び出しを行っています。
private class QueryMarketStats extends AsyncTask<com.google.api.services.marketendpoint.model.Market, com.google.api.services.marketendpoint.model.Market, com.google.api.services.marketendpoint.model.Market> {
/* (non-Javadoc)
* @see android.os.AsyncTask#doInBackground(Params[])
*/
@Override
protected com.google.api.services.marketendpoint.model.Market doInBackground(com.google.api.services.marketendpoint.model.Market...markets) {
com.google.api.services.marketendpoint.model.Market result = null;
try {
result = service.market().latest(state.getServerID()).execute();
}
catch (SSLException e) {
PrimeDataStore();
Log.d("app", e.getMessage(), e);
}
catch (GoogleAuthIOException e) {
Log.d("app", e.getMessage(), e);
}
catch (IOException e) {
Log.d("app", e.getMessage(), e);
}
return result;
}
/* (non-Javadoc)
* @see android.os.AsyncTask#onPostExecute(java.lang.Object)
*/
@Override
protected void onPostExecute(com.google.api.services.marketendpoint.model.Market result) {
// Process result...
}
}
エラーが発生する行は次のとおりです。 result = service.market().latest(state.getServerID()).execute();
getServerID() のパラメーターが許容できる値を返していることを確認しました。この時点での私の理論は、Google Play Services はまだ認証されているアカウントを提供できないというものです。再現できませんでしたが、アプリケーションがスリープ状態になったときに問題が発生する可能性があると思います。したがって、次のように onResume() ロジックを確認しました。
@Override
protected void onResume() {
super.onResume();
checkPlayServices();
isInFront = true;
}
他に何がこの断続的な障害を引き起こす可能性がありますか? これは既知の問題ですか?