5

Я пытаюсь решить проблему с запущенным Android-приложением, которое имеет более 65 тыс. Методов.
Я следил за документами Google о поддержке Multidex, однако я все еще не могу запустить его успешно. Похоже, что проблема возникает только на SDK меньше 21, потому что когда я укажу minSdkVersion 21, он работает хорошо, однако, как только я установил его в minSdkVersion 15, я получаю следующее исключение.Android Multidex RuntimeException

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/[email protected]@[email protected]@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: '[email protected]#0' 
W/System: ClassLoader referenced unknown path: /data/app/custom.package.name-2-2/lib/arm 

Вот что я сделал до сих пор:

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

  • добавлена ​​зависимость к build.gradle файлу

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

  • позволило multidex в build.gradle

    multiDexEnabled true

  • позволило multidex в классе MyApplication @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); }

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

+1

вы пробовали, используя расширяет MultiDexApplication, а распространяется приложение ? –

+0

Да, я пробовал, но все тот же вопрос – jpact

ответ

-2

Через 3 дня ее решить, убрав одну из зависимостей, вызвавших его.

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

+0

Не могли бы вы рассказать нам, какая зависимость вызвала это? – kientux

+0

Я не помню точного имени, но это была какая-то сторонняя библиотека для обфускации строковых литералов – jpact

2

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

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

Класс Application

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" > 

... 

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

+0

Спасибо за ответ! Ну, я уже пытался использовать MultiDexAppllication, но та же проблема. Примечание: я также использую read_external_storage:/ – jpact

+0

@ Вы также используете WRITE_EXTERNAL разрешение? может случиться так, что номера минут мин не совпадают –

+0

Да. Но из-за исключения кажется, что он вообще не имеет никакого отношения к внешнему хранилищу, поскольку apk хранится в/data/app/... – jpact

1

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

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

Точно так это lib. благодаря – jpact

Смежные вопросы