jjzjj

java - 安全异常 : Binder invocation to an incorrect interface on signed APK

coder 2023-11-23 原文

我正在开发一个位置感知应用程序。我将 Google Play 位置服务和 Google map 集成到我的应用程序中。我的应用程序在 Debug模式下运行没有问题。当我在 Release模式下生成签名的 APK 并运行应用程序时,它在启动时崩溃并出现以下异常:

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) 

通过跟踪每个生命周期方法的日志,我注意到这种情况发生在我的 fragment 的 onResume 方法中,我在其中检查 Google Play 服务的可用性,如下所示:

@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();
}

我的 gradle 文件如下所示:

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'
}

我根据我的包名 com.example.akif.testcom.example.akif 设置了两个 Google Maps API key ,分别用于调试和 Release模式.所以,我不认为它与包名称有关,但话又说回来,它很可能与此有关,因为我从错误中没有理解任何内容。

知道发生了什么吗?

最佳答案

在做了很多几乎没有结果的研究之后,我能够通过以下 Proguard 规则解决这个问题:

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

我仍然不知道我遇到这个问题的真正原因,但它似乎已经解决了。

希望这对您有所帮助。

关于java - 安全异常 : Binder invocation to an incorrect interface on signed APK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39412412/

有关java - 安全异常 : Binder invocation to an incorrect interface on signed APK的更多相关文章

  1. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  2. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  3. ruby-on-rails - Rails - 乐观锁定总是触发 StaleObjectError 异常 - 2

    我正在学习Rails,并阅读了关于乐观锁的内容。我已将类型为integer的lock_version列添加到我的articles表中。但现在每当我第一次尝试更新记录时,我都会收到StaleObjectError异常。这是我的迁移:classAddLockVersionToArticle当我尝试通过Rails控制台更新文章时:article=Article.first=>#我这样做:article.title="newtitle"article.save我明白了:(0.3ms)begintransaction(0.3ms)UPDATE"articles"SET"title"='dwdwd

  4. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  5. ruby - 在 Ruby 中重新分配常量时抛出异常? - 2

    我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案

  6. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  7. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

  8. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  9. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  10. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

随机推荐