安全异常:来自Google Analytics代码的Parcel.readException

46

我们的应用程序从我们的崩溃报告软件中收到了相当多的不同的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());

u_u


@zaventh,请查看我编辑后的问题,了解我发送请求的方式。虽然我对代码不是非常满意,但它应该可以工作... - Jason Ridge
@JeffMixon Google Play服务版本为6.1.11,compileSdkVersion为19。至于Map,它似乎并不过分,请参阅__Edit 2__问题以获取更多详细信息。 - Jason Ridge
sendCommerceData 看起来不错。 但是,您的 Play Services 相当旧了。 我认为最新版本现在是 6.1.71 版本。我建议您获取该版本并查看问题是否仍然存在,特别是当面向 19+ 时。 - Jeffrey Mixon
遇到了同样的问题。你找到解决方法了吗?谢谢。 - Goran Horia Mihail
@GoranHoriaMihail 恐怕不行。这是一个我不再参与的项目。希望你能解决它。如果你解决了,请在这里添加,以便其他人得到所需的帮助。 - Jason Ridge
显示剩余4条评论
2个回答

1
这是一个SecurityException,意味着这不是因为我们自己的功能而发生的。 (大多数情况下是系统代码抛出这些异常)。
系统使用(android.app.ApplicationThread)来注册广播。
除非在所有设备上都发生了这种情况,否则我可以说这是由于糟糕的GMS配置(Google Play服务)引起的。
您可以将所有分析调用包装在try catch中(仅捕获Security异常)。
我不确定100%,但在我自己尝试后,我会添加更多信息。

0

我猜测您正在对应用程序运行ProGuard,但尚未将以下异常添加到您的proguard-rules.txt文件中:

-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
    public static final *** NULL;
}

-keepnames @com.google.android.gms.common.annotation.KeepName class *
-keepclassmembernames class * {
    @com.google.android.gms.common.annotation.KeepName *;
}

-keepnames class * implements android.os.Parcelable {
    public static final ** CREATOR;
}

2
很遗憾,我在proguard-project.txt中确实有这些异常。 - Jason Ridge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接