Андроид Multidex К RuntimeException


Я пытаюсь решить проблему с запуском приложения для Android, которое имеет более 65 тысяч методов.
я следил за Google docs о поддержке Multidex, однако я все еще не могу запустить его успешно. Похоже, что проблема появляется только на SDK меньше 21, потому что когда я указываю 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

Logcat перед фатальным исключением

W/art: Failed execv(/system/bin/dex2oat --runtime-arg -classpath --runtime-arg  --instruction-set=arm --instruction-set-features=smp,div,atomic_ldrd_strd --runtime-arg -Xrelocate --boot-image=/system/framework/boot.art --runtime-arg -Xms64m --runtime-arg -Xmx512m --instruction-set-variant=krait --instruction-set-features=default --dex-file=/data/app/custom.package.name-2/base.apk --oat-file=/data/dalvik-cache/arm/data@app@custom.package.name-2-2@base.apk@classes.dex) because non-0 exit status
W/art: Failure to verify dex file '/data/app/ccustom.package.name-2-2/base.apk': Invalid method name: '_clinit@1433781298707#0'
W/System: ClassLoader referenced unknown path: /data/app/custom.package.name-2-2/lib/arm

Вот что я сделал. далеко:

  • Создал класс MyApplication, который расширяет приложение и задал его в AndroidManifest.xml-файл

  • Добавлена зависимость для построения.gradle file

    compile 'com.android.support:multidex:1.0.1'

  • Включен multidex в сборке.gradle

    multiDexEnabled true

  • Включен multidex в классе MyApplication @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); }

Заранее спасибо за любую помощь!

3 6

3 ответа:

Попробуйте это, это работает для меня, в значительной степени скопировано с текущего проекта....

Строить.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" >

...

Стоит отметить, что у меня была аналогичная проблема, пока я не добавил разрешение на чтение и не расширил MultiDexApplication

Проблема из-за этого обфускатора:

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

Через 3 дня ее решили, удалив одну из зависимостей, которая ее вызвала.

EDIT : Как указал @Asprelis, lib, который вызывал проблемы, является net.java.truelicense