Java Android多索引运行时异常

Java Android多索引运行时异常,java,android,classnotfoundexception,android-multidex,Java,Android,Classnotfoundexception,Android Multidex,我正在尝试解决一个运行Android应用程序的问题,这个应用程序有超过65k个方法。 我一直在关注Google文档对Multidex的支持,但是我仍然无法成功运行它。这个问题似乎只出现在小于21的SDK上,因为当我指定minSdkVersion 21时,它工作得很好,但是一旦我将其设置为minSdkVersion 15,就会出现以下异常 FATAL EXCEPTION: main java.lang.RuntimeException: Unable to instantiate appli

我正在尝试解决一个运行Android应用程序的问题,这个应用程序有超过65k个方法。
我一直在关注Google文档对Multidex的支持,但是我仍然无法成功运行它。这个问题似乎只出现在小于21的SDK上,因为当我指定
minSdkVersion 21
时,它工作得很好,但是一旦我将其设置为
minSdkVersion 15
,就会出现以下异常

FATAL EXCEPTION: main
   java.lang.RuntimeException: Unable to instantiate application custom.package.name.MyApplication: java.lang.ClassNotFoundException: Didn't find class "custom.package.name.MyApplication" on path: DexPathList[[zip file "/data/app/custom.package.name-2/base.apk"],nativeLibraryDirectories=[/data/app/custom.package.name-2/lib/arm, /vendor/lib, /system/lib]]
      at android.app.LoadedApk.makeApplication(LoadedApk.java:578)
      at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4680)
      at android.app.ActivityThread.-wrap1(ActivityThread.java)
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405)
      at android.os.Handler.dispatchMessage(Handler.java:102)
      at android.os.Looper.loop(Looper.java:148)
      at android.app.ActivityThread.main(ActivityThread.java:5417)
      at java.lang.reflect.Method.invoke(Native Method)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

   Caused by: java.lang.ClassNotFoundException: Didn't find class "custom.package.name.MyApplication" on path: DexPathList[[zip file "/data/app/custom.package.name-2/base.apk"],nativeLibraryDirectories=[/data/app/custom.package.name-2/lib/arm, /vendor/lib, /system/lib]]
      at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
      at android.app.Instrumentation.newApplication(Instrumentation.java:981)
      at android.app.LoadedApk.makeApplication(LoadedApk.java:573)
      at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4680) 
      at android.app.ActivityThread.-wrap1(ActivityThread.java) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:148) 
      at android.app.ActivityThread.main(ActivityThread.java:5417) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
   Suppressed: java.io.IOException: Failed to open dex files from /data/app/custom.package.name-2/base.apk
      at dalvik.system.DexFile.openDexFileNative(Native Method)
      at dalvik.system.DexFile.openDexFile(DexFile.java:295)
      at dalvik.system.DexFile.<init>(DexFile.java:80)
      at dalvik.system.DexFile.<init>(DexFile.java:59)
      at dalvik.system.DexPathList.loadDexFile(DexPathList.java:279)
      at dalvik.system.DexPathList.makePathElements(DexPathList.java:248)
      at dalvik.system.DexPathList.<init>(DexPathList.java:120)
      at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:48)
      at dalvik.system.PathClassLoader.<init>(PathClassLoader.java:65)
      at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:58)
      at android.app.LoadedApk.getClassLoader(LoadedApk.java:376)
      at android.app.LoadedApk.makeApplication(LoadedApk.java:568)
            ... 9 more
   Suppressed: java.lang.ClassNotFoundException: custom.package.name.MyApplication
      at java.lang.Class.classForName(Native Method)
      at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
      at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
            ... 12 more
   Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
以下是我迄今为止所做的工作:

  • 创建了一个名为MyApplication的类,该类扩展了应用程序,并在AndroidManifest.xml文件中指定了它

  • android {
    compileSdkVersion 23
    buildToolsVersion "22.0.1"
    defaultConfig {
        applicationId "my.package.name"
        minSdkVersion 16
        targetSdkVersion 23
        multiDexEnabled = true
        versionCode 3
        versionName "0.1.2"
        renderscriptTargetApi 14
        renderscriptSupportModeEnabled true
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:appcompat-v7:23.1.1'
        compile 'com.android.support:multidex:1.0.1'
    }
    
  • 为build.gradle文件添加了依赖项

    android {
    compileSdkVersion 23
    buildToolsVersion "22.0.1"
    defaultConfig {
        applicationId "my.package.name"
        minSdkVersion 16
        targetSdkVersion 23
        multiDexEnabled = true
        versionCode 3
        versionName "0.1.2"
        renderscriptTargetApi 14
        renderscriptSupportModeEnabled true
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:appcompat-v7:23.1.1'
        compile 'com.android.support:multidex:1.0.1'
    }
    
    编译'com.android.support:multidex:1.0.1'

  • 在build.gradle中启用多索引

    android {
    compileSdkVersion 23
    buildToolsVersion "22.0.1"
    defaultConfig {
        applicationId "my.package.name"
        minSdkVersion 16
        targetSdkVersion 23
        multiDexEnabled = true
        versionCode 3
        versionName "0.1.2"
        renderscriptTargetApi 14
        renderscriptSupportModeEnabled true
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:appcompat-v7:23.1.1'
        compile 'com.android.support:multidex:1.0.1'
    }
    
    multiDexEnabled true

  • 在MyApplication类中启用多索引
    
    @凌驾
    受保护的void attachBaseContext(上下文基){
    super.attachBaseContext(base);
    多索引安装(本);
    }
    


提前感谢您的帮助

试试这个,这对我来说很有用,几乎是从当前项目复制过来的

build.gradle

android {
compileSdkVersion 23
buildToolsVersion "22.0.1"
defaultConfig {
    applicationId "my.package.name"
    minSdkVersion 16
    targetSdkVersion 23
    multiDexEnabled = true
    versionCode 3
    versionName "0.1.2"
    renderscriptTargetApi 14
    renderscriptSupportModeEnabled true
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:multidex:1.0.1'
}
应用程序类

public class MyApp extends MultiDexApplication {

    @Override
    public void onCreate() {
        super.onCreate();
    }
}
清单

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

...

   <application
    android:name=".MyApp"
    android:allowBackup="true"
    android:hardwareAccelerated="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

...

...
...

值得注意的是,在添加读取权限和扩展多索引应用程序之前,我也遇到过类似的问题

问题是因为这个混淆器:

    <dependency>
        <groupId>net.java.truelicense</groupId>
        <artifactId>truelicense-obfuscate</artifactId>
        <version>${truelicense.obfuscate.version}</version>
    </dependency>

net.java.truelicense
truelicense模糊
${truelicense.obfuscate.version}

您是否尝试过使用extends-MultiDexApplication而不是extends-Application?是的,我已经尝试过,但仍然有相同的问题需要回答!我也尝试过使用Multidexapplication,但问题是一样的。注意:我也在使用读取外部存储:/@Creck您也在使用写入外部权限吗?可能是最小版本号不匹配是的,我匹配。但从例外情况来看,它似乎与外部存储完全无关,因为apk存储在/data/app/…@Creck yea中,只是问了一下,因为我确实有同样的问题,同样的例外情况,出于这个原因。还可能需要从项目中清除生成的生成文件并重新生成。在致命异常发生之前,stacktrace中有什么有用的信息吗?我尝试过重建,但没有成功。另外,我之前用logcat的日志更新了我的问题,例外的是,这就是那个库。谢谢