代码之家  ›  专栏  ›  技术社区  ›  TheHebrewHammer

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

  •  0
  • TheHebrewHammer  · 技术社区  · 6 年前

    我正在按照 https://developer.android.com/guide/app-bundle/build 但我在游戏商店安装时出错了。

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

    多索引-keep.pro:

    -keep class io.org.app.ui.main.** { *; }
    -keep class io.org.app.ui.loading.** { *; }
    
    3 回复  |  直到 6 年前
        1
  •  2
  •   Pierre    6 年前

    看起来像是班级 io.org.app.ui.loading.LoadingFragment 是由反射加载的,但proguard文件不阻止对该类进行模糊处理,因此已重命名该类,这解释了找不到该类的原因。

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

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

        2
  •  1
  •   Ivan Andreyshev    6 年前

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

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

    在你 平地 文件夹.

        3
  •  0
  •   S.R    5 年前

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

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

    • 2禁用 已启用Minify 处于调试模式

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

    buildTypes {
    
        debug {
            minifyEnabled false
    
         }
    }
    
    • 3在应用程序的梯度文件中将数据绑定设置为true

    在我的例子中,我包括了另一个布局 <include layout="@layout/attached_layout" /> 我的活动的布局和这解决了它。

        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中的预索引:

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

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

    • 8尝试多索引应用程序

    这个在build.gradle中(模块: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">
    

    否则添加 多索引应用程序 从库中作为名称的类路径

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