首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NoClassDefFoundError: android.app.PictureInPictureParams

NoClassDefFoundError: android.app.PictureInPictureParams
EN

Stack Overflow用户
提问于 2017-12-11 14:15:48
回答 1查看 514关注 0票数 1

我使用的是EasyPermission库,当我想接受存储权限时,我的应用程序会崩溃,StackTrace如下:

代码语言:javascript
运行
复制
java.lang.NoClassDefFoundError: android.app.PictureInPictureParams
     at libcore.reflect.InternalNames.getClass(InternalNames.java:55)
     at java.lang.Class.getDexCacheType(Class.java:2551)
     at java.lang.reflect.AbstractMethod.getParameterTypes(AbstractMethod.java:169)
     at java.lang.reflect.Method.getParameterTypes(Method.java:193)
     at java.lang.Class.getDeclaredMethods(Class.java:1812)
     at pub.devrel.easypermissions.EasyPermissions.runAnnotatedMethods(EasyPermissions.java:368)
     at pub.devrel.easypermissions.EasyPermissions.onRequestPermissionsResult(EasyPermissions.java:240)
     at com.my.app.base.BaseActivity.onRequestPermissionsResult(BaseActivity.java:489)
     at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:7458)
     at android.app.Activity.dispatchActivityResult(Activity.java:7284)
     at android.app.ActivityThread.deliverResults(ActivityThread.java:4516)
     at android.app.ActivityThread.handleSendResult(ActivityThread.java:4563)
     at android.app.ActivityThread.-wrap22(ActivityThread.java)
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1698)
     at android.os.Handler.dispatchMessage(Handler.java:102)
     at android.os.Looper.loop(Looper.java:154)
     at android.app.ActivityThread.main(ActivityThread.java:6776)
     at java.lang.reflect.Method.invoke(Native Method)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)
  Caused by: java.lang.ClassNotFoundException: Didn't find class "android.app.PictureInPictureParams" on path: DexPathList[[zip file "/data/app/com.my.app.debug-2/base.apk"],nativeLibraryDirectories=[/data/app/com.my.app..debug-2/lib/arm, /data/app/com.my.app.debug-2/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib]]
     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
     at libcore.reflect.InternalNames.getClass(InternalNames.java:53)
     at java.lang.Class.getDexCacheType(Class.java:2551) 
     at java.lang.reflect.AbstractMethod.getParameterTypes(AbstractMethod.java:169) 
     at java.lang.reflect.Method.getParameterTypes(Method.java:193) 
     at java.lang.Class.getDeclaredMethods(Class.java:1812) 
     at pub.devrel.easypermissions.EasyPermissions.runAnnotatedMethods(EasyPermissions.java:368) 
     at pub.devrel.easypermissions.EasyPermissions.onRequestPermissionsResult(EasyPermissions.java:240) 
     at com.my.app.base.BaseActivity.onRequestPermissionsResult(BaseActivity.java:489) 
     at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:7458) 
     at android.app.Activity.dispatchActivityResult(Activity.java:7284) 
     at android.app.ActivityThread.deliverResults(ActivityThread.java:4516) 
     at android.app.ActivityThread.handleSendResult(ActivityThread.java:4563) 
     at android.app.ActivityThread.-wrap22(ActivityThread.java) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1698) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:154) 
     at android.app.ActivityThread.main(ActivityThread.java:6776) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386) 

您应该注意的是,这种情况发生在版本调试版本上。

这是我的分级文件:

代码语言:javascript
运行
复制
buildscript {
    repositories {
        maven { url 'https://maven.fabric.io/public' }
    }

    dependencies {
        classpath 'io.fabric.tools:gradle:1.22.2'
    }
}
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'

repositories {
    maven { url 'https://maven.fabric.io/public' }
}

android {

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    dexOptions {
        javaMaxHeapSize "4g"
    }

    signingConfigs {
        release_config {
            [not showing it here]
        }
    }

    compileSdkVersion 27
    buildToolsVersion '26.0.2'
    defaultConfig {
        applicationId "com.my.app"
        minSdkVersion 21
        targetSdkVersion 27
        versionCode 1
        versionName "x"
        vectorDrawables.useSupportLibrary = true
        multiDexEnabled true

    }

    dataBinding {
        enabled = true
    }

    // workaround for "duplicate files during packaging of APK" issue
    // see https://groups.google.com/d/msg/adt-dev/bl5Rc4Szpzg/wC8cylTWuIEJ
    packagingOptions {
        exclude 'META-INF/ASL2.0'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'

        //Workaround to an issue due to google play-services 11.0.0 + rxJava
        exclude 'META-INF/rxjava.properties'
    }

    buildTypes {
        release {
            debuggable false
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release_config
        }
        debug {
            applicationIdSuffix ".debug"
            versionNameSuffix " - debug"
            debuggable true
        }
    }

    flavorDimensions "public"

    productFlavors {
        dev {
            dimension "public"
        }

        prod {

            dimension "public"
        }
    }
}

//Define gradle variables
ext {
    supportLibVersion = '27.0.2'
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'

    compile 'org.jetbrains:annotations-java5:15.0'

    //Support Libraries
    compile "com.android.support:appcompat-v7:${supportLibVersion}"
    compile "com.android.support:support-v4:${supportLibVersion}"
    compile "com.android.support:support-v13:${supportLibVersion}"
    compile "com.android.support:design:${supportLibVersion}"
    compile "com.android.support:recyclerview-v7:${supportLibVersion}"
    compile "com.android.support:cardview-v7:${supportLibVersion}"

    compile 'com.google.android.gms:play-services-auth:11.6.2'

    compile 'com.android.support.constraint:constraint-layout:1.1.0-beta3'

    //Google Collections -> Known as Guava. Provides tools to work with collections.
    compile 'com.google.guava:guava:22.0-android'

    //Google FlexBox -> Flexible layout to handle unknown number of children.
    compile 'com.google.android:flexbox:0.2.3'

    //Fragment Args -> Library using annotation to simplify the process of passing arguments to a fragment
    compile 'com.hannesdorfmann.fragmentargs:annotation:3.0.2'
    annotationProcessor 'com.hannesdorfmann.fragmentargs:processor:3.0.2'

    //Dart -> Library using annotation to simplify the process of passing arguments to an activity
    compile 'com.f2prateek.dart:dart:2.0.0'
    annotationProcessor 'com.f2prateek.dart:dart-processor:2.0.0'

    //Dagger -> Library used for dependencies injections
    compile 'com.google.dagger:dagger:2.2'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.2'

    //GSON -> Library to simplify Json parsing
    compile 'com.google.code.gson:gson:2.8.0'

    //Couchbase -> NoSQL Database Manager
    compile 'com.couchbase.lite:couchbase-lite-android:1.4.0'
    compile 'com.couchbase.lite:couchbase-lite-android-sqlcipher:1.4.0'

    //Retrofit -> Library developed by Square. Used to communicate with Restful API.
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'

    //AVLoading -> Provides multiple loaders.
    compile 'com.wang.avi:library:1.0.5'
    compile 'com.nineoldandroids:library:2.4.0'

    //Crashlytics -> Crash reporting library. Developed by Fabric.
    compile('com.crashlytics.sdk.android:crashlytics:2.6.7@aar') {
        transitive = true
    }

    //Faker -> Library to create fake data
    compile 'com.github.thiagokimo:faker:1.4.3'

    //MaterialSearchView -> Provides a styled material searchView.
    compile 'com.miguelcatalan:materialsearchview:1.4.0'

    //LovelyDialog -> Provide beautiful and easy to use dialogs
    compile 'com.yarolegovich:lovely-dialog:1.0.4'

    //TextDrawable -> Provides images with text, useful for profile avatar (eg: Gmail).
    compile 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'

    //2D ScrollView
    compile 'com.jaredrummler:twodscrollview:1.0.1'

    //RecyclerViewTools -> Tools for RecyclerView (Headers, Footers, Sections, etc).
    compile 'com.eyeem.recyclerviewtools:library:0.4.0'

    //RopeProgressBar -> A sweet animated progress bar
    compile 'com.github.cdeange:RopeProgressBar:0.1.2'

    //AsyncJob -> Simplify the use of AsyncTask.
    compile 'com.arasthel:asyncjob-library:1.0.3'

    //Simple -> Xml Parser
    compile ('org.simpleframework:simple-xml:2.7.1') {
        exclude group: 'xpp3', module: 'xpp3'
        exclude group: 'stax', module: 'stax-api'
        exclude group: 'stax', module: 'stax'
    }

    //RxAndroid -> Reactive Android. Library that implement Observable/Reactive pattern for Android.
    compile 'io.reactivex:rxandroid:1.2.1'
    // Because RxAndroid releases are few and far between, it is recommended to
    // explicitly depend on RxJava's latest version for bug fixes and new features.
    compile 'io.reactivex:rxjava:1.1.6'

    //Leak Canary -> Detect memory leaks.
    debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
    releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
    testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'

    //Material about -> Library to build neat about page
    compile 'com.github.daniel-stoneuk:material-about-library:2.2.1'

    //Stetho -> used to analyze application (database, shared-preferences, traffic network, etc)
    compile 'com.facebook.stetho:stetho:1.5.0'
    compile 'com.robotpajamas.stetho:stetho-couchbase:0.2.0'
    compile project(path: ':security')

    //Apache commons lang 3 -> contains utilities such as ClassUtils
    compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.4'

    //ExpandableRecyclerView -> Implementation of ExpandableListView for RecyclerView
    compile 'com.bignerdranch.android:expandablerecyclerview:3.0.0-RC1'

    //TextDecorator -> Easy to implements span etc.
    compile 'com.tuyenmonkey:text-decorator:1.0.0'

    //EasyPermission -> Helper for Android-M permissions
    compile 'pub.devrel:easypermissions:1.0.0'

    // CompositeAndroid -> Library that make uses of plugins to inject into Activities and Fragments
    // instead of using inheritance trees.
    // contains CompositeActivity
    compile "com.pascalwelsch.compositeandroid:activity:26.0.0"
    // contains CompositeFragment and CompositeDialogFragment
    compile "com.pascalwelsch.compositeandroid:fragment:26.0.0"
    // core module (not required, only abstract classes and utils)
    compile "com.pascalwelsch.compositeandroid:core:26.0.0"
}

我已经尝试过几件事了:

  1. 清洁/重建
  2. 禁用即时运行
  3. 在GitHub的EasyPermission页面上被问到,但是导致了一个“不是由于库的错误”(这是正确的)
  4. 在"multiDexKeepFile“上添加文件
  5. 在"multiDexKeepProguard“上添加文件

关于第4点和第5点,我是如何创建文件的(也许我做错了):

MultiDexKeepFile

代码语言:javascript
运行
复制
android/app/PictureInPictureParams.class

MultiDexKeepProguard

代码语言:javascript
运行
复制
-keep class android.app.PictureInPictureParams

我在我的项目的根目录和'app‘目录下添加了它们(与gradle文件的级别相同)。显然,我也在gradle文件中添加了相应的multiDexKeepFilemultiDexKeepProguard行,但是它没有改变任何东西。

我检查了我的APK的dex文件,但没有找到android.app.PictureInPictureParams

我没什么办法解决我的问题。我应该怎样做呢?

EN

Stack Overflow用户

发布于 2019-07-16 09:27:52

让我用其他库(EventBus)解释一下,但是使用OP要求的相同上下文。在比奥利奥更少的android操作系统版本中,我得到了崩溃日志。

参考资料:https://github.com/greenrobot/EventBus/issues/595

关于同样的补充参考资料:

  1. https://github.com/greenrobot/EventBus/issues/149
  2. https://github.com/greenrobot/EventBus/issues/556

GreenBot的所有者也将FAQ更新为相同的:http://greenrobot.org/eventbus/documentation/faq/

导致错误的原因:如果类有一个参数不能用于设备的API级别的方法,则抛出异常。

示例:在APILevel21中添加了类PersistableBundle。随着新类的出现,在以PersistableBundle为参数的类活动中引入了一些新的生命周期方法,例如,onCreate (Bundle savedInstanceState, *PersistableBundle* persistentState)。现在,如果您覆盖此方法,并试图在旧设备上将此活动注册到EventBus,那么我们就有了所描述的导致错误的场景。

可能的建议:

  1. 也许您只是偶然地用PersistableBundle重写了一个生命周期方法。在这种情况下,只需更改为没有PersistableBundle的方法,例如onCreate (Bundle savedInstanceState)。
  2. 将EventBus 3与订阅服务器索引一起使用。这将避免反思,从而完全避免问题。作为一个积极的副作用,注册订阅者,从而应用程序启动时间将更快。
  3. 从订阅服务器类中删除违规方法。将事件处理程序方法提取到新的订阅服务器类中,或者将违规方法提取到非订阅服务器类中。
  4. 如果违规方法是公开的,则将其非公开。这是因为某些“计划b”逻辑EventBus应用的缘故: EventBus首先调用getDeclaredMethods,这将失败。接下来,EventBus将再次尝试使用getMethods (“计划b”)。后者将成功,因为getMethods只返回公共方法。但是,请记住,这是性能方面效率最低的方法(考虑到整个类的层次结构,在getMethods中使用2个反射调用而不是1个反射调用)。

对于我的问题建议#4,我使用了一个私有修饰符。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47754855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档