私たちのアプリは、クラッシュ レポート ソフトウェアからさまざまなSecurityException
レポートを受け取っています。クラッシュのスタック トレースは次のとおりです。
java.lang.SecurityException: Unable to find app for caller android.app.ApplicationThreadProxy@43fda840 (pid=17925) when registering receiver android.content.IIntentReceiver$Stub$Proxy@43fd9458
at android.os.Parcel.readException(Parcel.java:1431)
at android.os.Parcel.readException(Parcel.java:1385)
at android.app.ActivityManagerProxy.registerReceiver(ActivityManagerNative.java:2466)
at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1717)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1685)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1679)
at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:453)
at com.google.android.gms.analytics.q.v(Unknown Source)
at com.google.android.gms.analytics.r.cF(Unknown Source)
at com.google.android.gms.analytics.r.cH(Unknown Source)
at com.google.android.gms.analytics.s.cO(Unknown Source)
at com.google.android.gms.analytics.s.cP(Unknown Source)
at com.google.android.gms.analytics.s.d(Unknown Source)
at com.google.android.gms.analytics.s$e.run(Unknown Source)
at java.util.Timer$TimerImpl.run(Timer.java:284)
スタック トレースは常に同じですが、唯一変更されていると思われるのはandroid.app.ApplicationThreadProxy@41da9030 (pid=9103)
、android.content.IIntentReceiver$Stub$Proxy@41ee0688
スタック トレースの番号が異なることです (これはスレッド ID か何かでしょうか)。
この例外はインテントサイズに関連しているようです(次のリンクを参照)
これが唯一の原因でしょうか? もしそうなら、google analytics
コードからのみ発生しているように見えるのに、私のコードがどのようにしてこれを引き起こしているのでしょうか? GA の使い方が間違っていますか? トラッカーを作成する以外にはあまり何もしていないようです。
編集
これが私のトラッカーの作成方法です。singleton
アプリケーションオブジェクトにトラッカーがあります
Tracker appTracker;
synchronized Tracker getTracker()
{
GoogleAnalytics analytics = GoogleAnalytics.getInstance(this);
if (appTracker == null)
{
appTracker = analytics.newTracker([some key]);
appTracker.enableAdvertisingIdCollection(true);
analytics.getLogger().setLogLevel(Logger.LogLevel.VERBOSE);
}
return appTracker;
}
次に、BaseActivity に次のコードを追加します。
public void initAnalytics() {
if (Global.TRACKING_ENABLED) {
mTracker = app.getTracker();
}
}
public void sendCommerceData(Map<String, String> params)
{
mTracker.send(params);
}
public void sendTrackViewData(String _path)
{
mTracker.setScreenName(_path);
mTracker.send(new HitBuilders.AppViewBuilder().build());
}
public void sendEventData(String category, String action, String label, long value)
{
mTracker.send(new HitBuilders.EventBuilder()
.setCategory(category)
.setAction(action)
.setLabel(label)
.setValue(value).build());
}
編集2
では、sendCommerceData の使用方法は次のとおりです。
sendCommerceData(new HitBuilders.ItemBuilder()
.setTransactionId(Integer.toString(order.orderId))
.setName(orderItem.tradeTitle)
.setSku(orderItem.tradeId)
.setCategory(orderItem.categoryFullname)
.setPrice(price)
.setQuantity(orderItem.quantity)
.build());
う_う
ベストアンサー1
これは SecurityException であり、これは私たち自身の関数が原因で発生しているのではないことを意味します (ほとんどの場合、システム コードがこれらの例外をスローします)。
システムは (android.app.ApplicationThread) を使用してブロードキャストを登録します。
すべてのデバイスで発生している場合を除き、GMS 構成 (Google Play サービス) が間違っていることが原因であると言えます。
実行できることは、すべての分析呼び出しを try catch (セキュリティ例外のみをキャッチ) でラップすることです。
100% 確信はありませんが、自分で試してみてからさらに情報を追加します。