问题
I'm building the new android app-bundle following the instructions at https://developer.android.com/guide/app-bundle/build but I'm getting an error when installing from the 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)
I've included the following in my build:
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.** { *; }
回答1:
It looks like the class io.org.app.ui.loading.LoadingFragment
is loaded by reflection, but your proguard file doesn't prevent that class from being obfuscated, so it has been renamed which explains why it can't be found.
I imagine you should get the same error when you deploy the release version of your app locally.
Try tweaking the proguard file to prevent the renaming of that class.
回答2:
I have same problem. Check that you add:
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
in your build.gradle files.
回答3:
Below I'm listing possible solutions, try this steps one by one:
1 Delete app on device and Clean Project
2 Disable minifyEnabled in debug mode
go to build.gradle(Module: app) in debug block and disable minifyEnabled:
buildTypes {
debug {
minifyEnabled false
}
}
3 Setting dataBinding to true in application's gradle file
In my case, I was including another layout
<include layout="@layout/attached_layout" />
to my activity's layout and this solved it.
android {
...
...
...
dataBinding {
enabled = true
}
}
4 Check the relative path of your activities in manifest
eg:
<activity android:name="com.myExactPackageName.MyActivity"
5 Check the package names in your custom views
<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 Try disabling pre-dexing in the app build.gradle:
dexOptions { preDexLibraries false }
7 Disable Instant Run
Go to File -> Settings -> Build,Execution, Deployment -> Instant Run -> Uncheck the checkbox for instant run
8 Try MultiDexApplication
And this in build.gradle(Module:app)
android {
defaultConfig {
...
multiDexEnabled true
}
dependencies {
...
implementation 'androidx.multidex:multidex:2.0.1'
}
}
if you are using application class you have to extend it with MultiDexApplication
instead of Application
and add it to application tag in AndroidManifest.xml
<application
android:name="com.myPackageName.MyApplication"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name">
else add MultiDexApplication
class path from library as name
<application
android:name="androidx.multidex.MultiDexApplication"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name">
来源:https://stackoverflow.com/questions/50684028/building-the-new-app-bundle-for-android-dex-errors-at-runtime