在运行时为android dex错误构建新的应用程序包

在运行时为android dex错误构建新的应用程序包,android,android-app-bundle,Android,Android App Bundle,我正在按照上的说明构建新的android应用程序包,但从play store安装时出错 2018-06-04 11:06:09.397 10595-10595/? E/AndroidRuntime: Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: io.org.app.ui.loading.LoadingFragment at androidx.navigation.fragment.b$a

我正在按照上的说明构建新的android应用程序包,但从play store安装时出错

2018-06-04 11:06:09.397 10595-10595/? E/AndroidRuntime: Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: io.org.app.ui.loading.LoadingFragment
    at androidx.navigation.fragment.b$a.a(FragmentNavigator.java:219)
    at androidx.navigation.fragment.b$a.a(FragmentNavigator.java:202)
    at androidx.navigation.k.a(NavInflater.java:140)
    at androidx.navigation.k.a(NavInflater.java:169)
    at androidx.navigation.k.a(NavInflater.java:120)
        ... 36 more
 Caused by: java.lang.ClassNotFoundException: io.org.app.ui.loading.LoadingFragment
    at java.lang.Class.classForName(Native Method)
    at java.lang.Class.forName(Class.java:453)
    at androidx.navigation.fragment.b$a.a(FragmentNavigator.java:215)
        ... 40 more
 Caused by: java.lang.ClassNotFoundException: Didn't find class "io.org.app.ui.loading.LoadingFragment" on path: DexPathList[[zip file "/system/framework/org.apache.http.legacy.boot.jar", zip file "/data/app/io.org.app-2KUWPMF_QJ31_iG8kGu1rA==/base.apk", zip file "/data/app/io.org.app-2KUWPMF_QJ31_iG8kGu1rA==/split_config.arm64_v8a.apk", zip file "/data/app/io.org.app-2KUWPMF_QJ31_iG8kGu1rA==/split_config.en.apk", zip file "/data/app/io.prg.app-2KUWPMF_QJ31_iG8kGu1rA==/split_config.iw.apk", zip file "/data/app/io.org.app-2KUWPMF_QJ31_iG8kGu1rA==/split_config.xxhdpi.apk"],nativeLibraryDirectories=[/data/app/io.org.app-2KUWPMF_QJ31_iG8kGu1rA==/lib/arm64, /data/app/io.org.app-2KUWPMF_QJ31_iG8kGu1rA==/base.apk!/lib/arm64-v8a, /data/app/io.org.app-2KUWPMF_QJ31_iG8kGu1rA==/split_config.arm64_v8a.apk!/lib/arm64-v8a, /data/app/io.org.app-2KUWPMF_QJ31_iG8kGu1rA==/split_config.en.apk!/lib/arm64-v8a, /data/app/io.org.app-2KUWPMF_QJ31_iG8kGu1rA==/split_config.iw.apk!/lib/arm64-v8a, /data/app/io.org.app-2KUWPMF_QJ31_iG8kGu1rA==/split_config.xxhdpi.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:125)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        ... 43 more
    Suppressed: java.io.IOException: No original dex files found for dex location /data/app/io.org.app-2KUWPMF_QJ31_iG8kGu1rA==/split_config.arm64_v8a.apk
    at dalvik.system.DexFile.openDexFileNative(Native Method)
    at dalvik.system.DexFile.openDexFile(DexFile.java:354)
    at dalvik.system.DexFile.<init>(DexFile.java:101)
    at dalvik.system.DexFile.<init>(DexFile.java:75)
    at dalvik.system.DexPathList.loadDexFile(DexPathList.java:374)
    at dalvik.system.DexPathList.makeDexElements(DexPathList.java:337)
    at dalvik.system.DexPathList.<init>(DexPathList.java:157)
    at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:65)
    at dalvik.system.PathClassLoader.<init>(PathClassLoader.java:64)
    at com.android.internal.os.ClassLoaderFactory.createClassLoader(ClassLoaderFactory.java:73)
    at com.android.internal.os.ClassLoaderFactory.createClassLoader(ClassLoaderFactory.java:88)
    at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:72)
    at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:38)
    at android.app.LoadedApk.createOrUpdateClassLoaderLocked(LoadedApk.java:715)
    at android.app.LoadedApk.getClassLoader(LoadedApk.java:750)
    at android.app.LoadedApk.getResources(LoadedApk.java:972)
    at android.app.ContextImpl.createAppContext(ContextImpl.java:2329)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5743)
    at android.app.ActivityThread.access$1000(ActivityThread.java:198)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1637)
            ... 6 more
    Suppressed: java.io.IOException: No original dex files found for dex location /data/app/io.org.app-2KUWPMF_QJ31_iG8kGu1rA==/split_config.en.apk
    at dalvik.system.DexFile.openDexFileNative(Native Method)
    at dalvik.system.DexFile.openDexFile(DexFile.java:354)
    at dalvik.system.DexFile.<init>(DexFile.java:101)
    at dalvik.system.DexFile.<init>(DexFile.java:75)
    at dalvik.system.DexPathList.loadDexFile(DexPathList.java:374)
multidex-keep.pro:

-keep class io.org.app.ui.main.** { *; }
-keep class io.org.app.ui.loading.** { *; }

看起来类
io.org.app.ui.loading.LoadingFragment
是通过反射加载的,但是您的proguard文件并不能防止该类被混淆,因此它被重命名,这解释了为什么找不到它

我想,当您在本地部署应用程序的发布版本时,也会出现同样的错误


尝试调整proguard文件以防止重命名该类。

看起来类
io.org.app.ui.loading.LoadingFragment
是通过反射加载的,但是你的proguard文件不能防止该类被混淆,因此它被重命名,这解释了为什么找不到它

我想,当您在本地部署应用程序的发布版本时,也会出现同样的错误

尝试调整proguard文件以防止重命名该类。

我也有同样的问题。 检查您是否添加了:

apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
在你的build.gradle文件中。

我也有同样的问题。 检查您是否添加了:

apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'

在您的build.gradle文件中。

下面我列出了可能的解决方案, 请逐一尝试以下步骤:

  • 1删除设备上的应用程序并清理项目
  • 2在调试模式下禁用minifyEnabled
转到调试块中的build.gradle(模块:app)并禁用minifyEnabled:

buildTypes {

    debug {
        minifyEnabled false

     }
}
  • 3在应用程序的gradle文件中将数据绑定设置为true
在我的例子中,我包含了另一个布局
我的活动的布局,这解决了它

    android {
    ...
    ...
    ...

    dataBinding {
        enabled = true
    }

    }
  • 4检查清单中活动的相对路径
例如:

  • 7禁用即时运行 转到文件->设置->构建、执行、部署->即时运行->取消选中即时运行复选框

  • 8尝试多索引应用程序
  • 还有这个内置的.gradle(模块:app)

    如果您使用的是应用程序类,则必须使用
    MultiDexApplication
    而不是
    application
    对其进行扩展,并将其添加到AndroidManifest.xml中的应用程序标记中

    <application
        android:name="com.myPackageName.MyApplication"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name">
    

    下面我列出了可能的解决方案, 请逐一尝试以下步骤:

    • 1删除设备上的应用程序并清理项目
    • 2在调试模式下禁用minifyEnabled
    转到调试块中的build.gradle(模块:app)并禁用minifyEnabled:

    buildTypes {
    
        debug {
            minifyEnabled false
    
         }
    }
    
    • 3在应用程序的gradle文件中将数据绑定设置为true
    在我的例子中,我包含了另一个布局
    我的活动的布局,这解决了它

        android {
        ...
        ...
        ...
    
        dataBinding {
            enabled = true
        }
    
        }
    
    • 4检查清单中活动的相对路径
    例如:

  • 7禁用即时运行 转到文件->设置->构建、执行、部署->即时运行->取消选中即时运行复选框

  • 8尝试多索引应用程序
  • 还有这个内置的.gradle(模块:app)

    如果您使用的是应用程序类,则必须使用
    MultiDexApplication
    而不是
    application
    对其进行扩展,并将其添加到AndroidManifest.xml中的应用程序标记中

    <application
        android:name="com.myPackageName.MyApplication"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name">
    

    解决了。以上这些都不起作用。因为它是编译器选项错误

      compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    

    解决了。以上这些都不起作用。因为它是编译器选项错误

      compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    

    有趣的是,我正在使用新的导航库,但我假设它是通过注释处理器生成代码的。你知道这是否是罪魁祸首吗?看起来你是对的,我在proguard中添加了
    -keep class*扩展了android.support.v4.app.Fragment{}
    ,它工作得很有趣,我正在使用新的导航库,但我假设它是通过注释处理器生成代码的。你知道这是否是罪魁祸首吗?看起来你是对的,我在我的proguard中添加了
    -keep class*扩展了android.support.v4.app.Fragment{}
    ,它工作了。你的片段是偶然用Kotlin编写的吗?是的,你为什么问这个问题?你是否
    在上述模块中应用了插件:“Kotlin android”
    ,Pierre的回答解决了这个问题你的片段是偶然用Kotlin写的吗?是的,你为什么要问?你是否
    在上述模块中应用了插件:“Kotlin android”
    ?是的,Pierre的回答解决了这个问题
      compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }