Ionic3 MainActivity ClassNotFoundException на Android 4.4 (Киткат) - PullRequest
0 голосов
/ 21 марта 2019

У меня есть приложение, использующее Ionic 3 и Cordova-Android 6.4.0. Приложение отлично работает на уровнях Android API> 19 (Kitkat). Но запуск приложения на Android 4.4 приводит к сбою приложения при запуске со следующим исключением:

03-21 14:07:40.513 2408-2408/com.xxx.app.xxx E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.xxx.app.xxx, PID: 2408
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.xxx.app.xxx/com.xxx.app.xxx.MainActivity}: java.lang.ClassNotFoundException: Didn't find class "com.xxx.app.xxx.MainActivity" on path: DexPathList[[zip file "/data/app/com.xxx.app.xxx-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.xxx.app.xxx-2, /system/lib]]
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2121)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
        at android.app.ActivityThread.access$800(ActivityThread.java:135)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5017)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "com.xxx.app.xxx.MainActivity" on path: DexPathList[[zip file "/data/app/com.xxx.app.xxx-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.xxx.app.xxx-2, /system/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2112)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 
        at android.app.ActivityThread.access$800(ActivityThread.java:135) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:136) 
        at android.app.ActivityThread.main(ActivityThread.java:5017) 
        at java.lang.reflect.Method.invokeNative(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:515) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
        at dalvik.system.NativeStart.main(Native Method) 

Я читал об исправлении multidex , но я не могу применить его к своему приложению Ionic, потому что не могу изменить сгенерированный код Java для добавления MultiDex.install(this);.

У кого-нибудь есть решение для этого?

1 Ответ

0 голосов
/ 25 марта 2019

Проблема и решение описаны здесь .

java.lang.ClassNotFoundException происходит из-за того, что приложение и его библиотеки превышают 65 536 методов, и в результате классы Java распределяются по нескольким файлам DEX (Dalvik EXecutable) в APK приложения, то есть classes.dex, classes2.dex и т. д. Java-классы, необходимые для запуска приложения, могут в конечном итоге оказаться в Class2.dex в APK приложения (в отличие от classes.dex), которые затем не могут быть загружены средой выполнения Dalvik в версиях Android менее 5. От веб-сайт Android:

При сборке каждого файла DEX для мультидексного приложения инструменты сборки выполняют сложный процесс принятия решений, чтобы определить, какие классы необходимы в основном файле DEX, чтобы ваше приложение могло успешно запускаться. Если какой-либо класс, который требуется при запуске, не указан в основном файле DEX, то ваше приложение вылетает с ошибкой java.lang.NoClassDefFoundError.

Решение состоит в том, чтобы идентифицировать каждый класс, на который ссылаются при запуске приложения, в текстовом файле, как описано в ссылке в начале моего сообщения.

Однако список обязательных классов длинный и сложный. Я добрался до классов ниже, но есть еще несколько классов запуска, чтобы обнаружить. Мое решение состоит в том, чтобы сказать: «Извините, это приложение доступно только для Android 5 и более поздних версий».

com/mycompany/app/myapp/MainActivity.class
org/apache/cordova/CallbackMap.class
org/apache/cordova/ConfigXmlParser.class
org/apache/cordova/CordovaActivity$1.class
org/apache/cordova/CordovaActivity.class
org/apache/cordova/CordovaInterface.class
org/apache/cordova/CordovaInterfaceImpl.class
org/apache/cordova/CordovaPreferences.class
org/apache/cordova/CordovaWebViewEngine.class
org/apache/cordova/engine/SystemWebViewEngine.class
org/apache/cordova/LOG.class
org/apache/cordova/PluginEntry.class
org/json/JSONException.class
org/json/JSONObject.class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...