2016-09-09 19 views
9

Tôi đang phát triển một ứng dụng nhận biết vị trí. Tôi đã tích hợp Dịch vụ vị trí của Google Play và Google Maps vào ứng dụng của mình. Ứng dụng của tôi chạy mà không có sự cố trong chế độ gỡ lỗi. Khi tôi tạo ra một APK được ký trong chế độ phát hành và chạy ứng dụng, nó bị treo khi khởi động với ngoại lệ sau đây:SecurityException: Binder invocation đến một giao diện không chính xác trên APK đã ký

Process: com.example.akif, PID: 4233 
    java.lang.RuntimeException: Unable to resume activity {com.example.akif/com.example.akif.activities.MainActivity}: java.lang.SecurityException: Binder invocation to an incorrect interface 
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3400) 
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3440) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2713) 
    at android.app.ActivityThread.-wrap12(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6077) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 
Caused by: java.lang.SecurityException: Binder invocation to an incorrect interface 
    at android.os.Parcel.nativeEnforceInterface(Native Method) 
    at android.os.Parcel.enforceInterface(Parcel.java:482) 
    at vz.onTransact(:com.google.android.gms.DynamiteModulesB:81) 
    at android.os.Binder.transact(Binder.java:499) 
    at com.google.android.gms.maps.a.bt.c(Unknown) 
    at com.google.android.gms.maps.i.b(Unknown) 
    at com.google.android.gms.b.d.b(Unknown) 
    at com.google.android.gms.b.j.a(Unknown) 
    at com.google.android.gms.maps.h.b(Unknown) 
    at com.google.android.gms.maps.h.a(Unknown) 
    at com.google.android.gms.b.a.c(Unknown) 
    at com.google.android.gms.b.a.e(Unknown) 
    at com.google.android.gms.maps.g.f(Unknown) 
    at android.support.v4.app.k.ay(Unknown) 
    at android.support.v4.app.x.l(Unknown) 
    at android.support.v4.app.ax.h(Unknown) 
    at android.support.v4.app.ax.i(Unknown) 
    at android.support.v4.app.ax.run(Unknown) 
    at android.support.v4.app.x.ae(Unknown) 
    at android.support.v4.app.i.aa(Unknown) 
    at android.support.v4.app.a.onPostResume(Unknown) 
    at android.support.v7.app.a.onPostResume(Unknown) 
    at android.app.Activity.performResume(Activity.java:6792) 
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3377) 
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3440)  
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2713)  
    at android.app.ActivityThread.-wrap12(ActivityThread.java)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:154)  
    at android.app.ActivityThread.main(ActivityThread.java:6077)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)  

tôi nhận thấy bởi các bản ghi sau đối với mỗi phương pháp vòng đời rằng điều này xảy ra trong phương pháp onResume đoạn của tôi, nơi tôi kiểm tra cho Dịch vụ Google play sẵn có như sau:

@Override public void onResume() { 
    Log.debug(getClass(), "onResume()"); 

    GoogleApiAvailability googleApiAvailability = GoogleApiAvailability.getInstance(); 

    int googlePlayServicesAvailabilityResult = googleApiAvailability.isGooglePlayServicesAvailable(getContext()); 

    if (googlePlayServicesAvailabilityResult != ConnectionResult.SUCCESS) { 
     if (!googleApiAvailability.isUserResolvableError(googlePlayServicesAvailabilityResult)) { 
      Toast.makeText(getContext(), "Your device doesn't support Google Play location services. This application cannot run without it!", Toast.LENGTH_LONG).show(); 

      getActivity().finish(); 

      return; 
     } 

     Dialog errorDialog = googleApiAvailability.getErrorDialog(getActivity(), googlePlayServicesAvailabilityResult, GOOGLE_PLAY_SERVICES_REQUEST_CODE); 

     if (errorDialog != null) { 
      errorDialog.setCancelable(false); 
      errorDialog.setCanceledOnTouchOutside(false); 
      errorDialog.setOnDismissListener((DialogInterface dialogInterface) -> { 
       Toast.makeText(getContext(), "You need Google Play location services to run this application!", Toast.LENGTH_LONG).show(); 

       getActivity().finish(); 
      }); 

      errorDialog.show(); 
     } 
    } else if (googleApiClient.isConnected() && !isUpdatingLocation) { 
     startLocationUpdates(); 
    } 

    super.onResume(); 
} 

tập tin gradle tôi trông giống như sau:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 24 
    buildToolsVersion "24.0.1" 

    defaultConfig { 
     applicationId "com.example.akif" 
     minSdkVersion 15 
     targetSdkVersion 24 
     versionCode 1 
     versionName "0.1" 

     jackOptions { 
      enabled true 
     } 
    } 

    compileOptions { 
     sourceCompatibility JavaVersion.VERSION_1_8 
     targetCompatibility JavaVersion.VERSION_1_8 
    } 

    buildTypes { 
     debug { 
      applicationIdSuffix '.test' 
     } 

     release { 
      minifyEnabled true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    compile 'com.android.support:appcompat-v7:24.2.0' 
    compile 'com.android.support:cardview-v7:24.2.0' 
    compile 'com.android.support:design:24.2.0' 
    compile 'com.android.support:preference-v7:24.2.0' 
    compile 'com.google.android.gms:play-services-location:9.4.0' 
    compile 'com.google.android.gms:play-services-maps:9.4.0' 
    compile 'com.github.mehmetakiftutuncu:toolbelt:1.1.0' 
    compile 'com.squareup.okhttp3:okhttp:3.4.1' 
    compile 'joda-time:joda-time:2.9.4' 
} 

tôi có hai Google Maps API k eys được thiết lập theo tên gói của tôi com.example.akif.testcom.example.akif tương ứng cho chế độ gỡ lỗi và phát hành. Vì vậy, tôi không nghĩ rằng nó liên quan đến tên gói nhưng sau đó một lần nữa, nó có thể rất tốt về điều đó như tôi đã không hiểu bất cứ điều gì từ lỗi.

Bất kỳ ý tưởng nào đang xảy ra?

+0

Điều này tương tự như [chủ đề này] (http://stackoverflow.com/questions/24591282/securityexception-binder-invocation-to-an-incorrect-interface-using-in-app-bill). – noogui

+0

@noogui Nhưng nó không phải là. Tôi không sử dụng dịch vụ thanh toán. Tôi cũng không có bất kỳ tệp AIDL nào. –

Trả lời

2

Sau khi thực hiện rất nhiều nghiên cứu với hầu như không có kết quả, tôi đã có thể khắc phục vấn đề với các quy tắc Proguard sau:

-keep public class com.google.android.gms.* { public *; } 
-dontwarn com.google.android.gms.** 

tôi vẫn không biết lý do thực sự tại sao tôi có vấn đề này nhưng nó dường như cố định với điều này.

Hy vọng điều này sẽ hữu ích.

+1

Bạn đang giữ quá nhiều. Xem http://stackoverflow.com/a/39701449/94363 – rds

Các vấn đề liên quan