android 안드로이드 - SecurityException:Google Analytics 코드에서 파생 된 Parcel.readException




스튜디오 play (2)

내 생각 엔 응용 프로그램에서 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;
}

우리의 응용 프로그램은 충돌 보고서 소프트웨어에서 상당히 다른 SecurityException 보고서를 받고 있습니다. 다음은 충돌의 스택 추적입니다.

java.lang.SecurityException: Unable to find app for caller [email protected] (pid=17925) when registering receiver [email protected]
     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)

스택 추적은 항상 동일하지만, [email protected] (pid=9103)[email protected] 이 다른 숫자로 변경된 것만 다릅니다 (이 스레드는 이드가 뭐니?)

이제이 예외는 의도 크기와 관련이있는 것 같습니다 (다음 링크 참조)

이것이 유일한 원인입니까? 그렇다면 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


저는 Gson을 매우 강력하고 간단한 api로 사용하여 활동간에 목표를 전송합니다.

// This is the object to be sent, can be any object
public class AndroidPacket {

    public String CustomerName;

   //constructor
   public AndroidPacket(String cName){
       CustomerName = cName;
   }   
   // other fields ....


    // You can add those functions as LiveTemplate !
    public String toJson() {
        Gson gson = new Gson();
        return gson.toJson(this);
    }

    public static AndroidPacket fromJson(String json) {
        Gson gson = new Gson();
        return gson.fromJson(json, AndroidPacket.class);
    }
}

2 함수를 보내려는 객체에 추가합니다.

용법

개체를 A에서 B로 보내기

    // Convert the object to string using Gson
    AndroidPacket androidPacket = new AndroidPacket("Ahmad");
    String objAsJson = androidPacket.toJson();

    Intent intent = new Intent(A.this, B.class);
    intent.putExtra("my_obj", objAsJson);
    startActivity(intent);

B에서 수신

@Override
protected void onCreate(Bundle savedInstanceState) {        
    Bundle bundle = getIntent().getExtras();
    String objAsJson = bundle.getString("my_obj");
    AndroidPacket androidPacket = AndroidPacket.fromJson(objAsJson);

    // Here you can use your Object
    Log.d("Gson", androidPacket.CustomerName);
}

내가하는 모든 프로젝트에서 거의 그것을 사용하고 성능에 문제가 없습니다.





android android-intent google-analytics google-play-services