【问题标题】:Building the new app-bundle for android dex errors at runtime在运行时为 android dex 错误构建新的应用程序包
【发布时间】:2018-06-04 15:28:10
【问题描述】:

我正在按照https://developer.android.com/guide/app-bundle/build 的说明构建新的 android app-bundle,但从 Play 商店安装时出现错误。

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)

我在构建中包含以下内容:

android {
    buildTypes {
        release {
            multiDexKeepProguard file ('multidex-keep.pro')
        }
    }
}

multidex-keep.pro:

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

【问题讨论】:

  • 你的片段是用 Kotlin 写的吗?
  • 是的,你为什么这么问?
  • 你在上述模块中apply plugin: 'kotlin-android' 了吗?
  • 是的,皮埃尔的回答解决了这个问题

标签: android android-app-bundle


【解决方案1】:

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

我想当您在本地部署应用的发布版本时应该会遇到同样的错误。

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

【讨论】:

  • 有趣,我正在使用新的导航库,但我认为它是通过注释处理器生成代码。你知道这是否是罪魁祸首吗?
  • 看来你是对的,我将 -keep class * extends android.support.v4.app.Fragment {} 添加到我的 proguard 中,它起作用了
【解决方案2】:

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

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

在您的 build.gradle 文件中。

【讨论】:

    【解决方案3】:

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

      compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    

    【讨论】:

      【解决方案4】:

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

      • 1 删除设备上的应用并清理项目

      • 2 在调试模式下禁用 minifyEnabled

      转到调试块中的 build.gradle(Module: app) 并禁用 minifyEnabled:

      buildTypes {
      
          debug {
              minifyEnabled false
      
           }
      }
      
      • 3 在应用程序的 gradle 文件中将 dataBinding 设置为 true

      就我而言,我包含了另一个布局 &lt;include layout="@layout/attached_layout" /&gt; 到我的活动布局,这解决了它。

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

      例如:

      <activity android:name="com.myExactPackageName.MyActivity"
      
      • 5 检查自定义视图中的包名称

        <com.myExactPackageName.MyCustomView
            android:id="@+id/myview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp" />
        
      • 6 尝试在 app build.gradle 中禁用 pre-dexing:

        dexOptions {
         preDexLibraries false
        }
        
      • 7 禁用即时运行

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

      • 8 试试 MultiDexApplication

      这在 build.gradle(Module:app) 中

      android { 
      
      defaultConfig {
            ...
            multiDexEnabled true
      }
      
      dependencies {
           ... 
          implementation 'androidx.multidex:multidex:2.0.1'
      }
      
      
      }
      

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

      中的应用程序标签中
      <application
          android:name="com.myPackageName.MyApplication"
          android:icon="@mipmap/ic_launcher"
          android:label="@string/app_name">
      

      否则将库中的MultiDexApplication类路径添加为名称

      <application
          android:name="androidx.multidex.MultiDexApplication"
          android:icon="@mipmap/ic_launcher"
          android:label="@string/app_name">
      

      【讨论】:

        猜你喜欢
        • 2018-08-12
        • 2021-03-01
        • 2018-06-21
        • 1970-01-01
        • 2020-08-04
        • 1970-01-01
        • 1970-01-01
        • 2011-11-26
        • 1970-01-01
        相关资源
        最近更新 更多