Ответ 1
Я не нашел идеального решения для своей проблемы. Но когда я загружаю свой apk в игру Google и загружаю оттуда, приложение работает нормально. Это самое странное решение, которое я когда-либо нашел.
Мое приложение отлично работает, когда я тестирую на реальном устройстве с помощью USB в студии android. Но когда я отправляю apk на другое устройство и устанавливаю там, он не работает. Аpp get crashed. Я не нашел правильного пути для решить проблему. Ниже приведены ошибки:
FATAL EXCEPTION: main Process: com.w3xplorers.cmch,PID: 17715 java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.w3xplorers.cmch/com.w3xplorers.cmch.MainActivity}: java.lang.ClassNotFoundException: Didn't find class "com.w3xplorers.cmch.MainActivity" on path: DexPathList[[zip file "/data/app/com.w3xplorers.cmch-1/base.apk"],nativeLibraryDirectories=[/data/app/com.w3xplorers.cmch-1/lib/arm, /system/lib, /vendor/lib, system/vendor/lib, system/vendor/lib/egl, system/lib/hw]]
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2395)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2544)
at android.app.ActivityThread.access$900(ActivityThread.java:150)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1394)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:168)
at android.app.ActivityThread.main(ActivityThread.java:5845)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:797)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.w3xplorers.cmch.MainActivity" on path: DexPathList[[zip file "/data/app/com.w3xplorers.cmch-1/base.apk"],nativeLibraryDirectories=[/data/app/com.w3xplorers.cmch-1/lib/arm, /system/lib, /vendor/lib, system/vendor/lib, system/vendor/lib/egl, system/lib/hw]]
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.newActivity(Instrumentation.java:1085)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2385)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2544)
at android.app.ActivityThread.access$900(ActivityThread.java:150)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1394)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:168)
at android.app.ActivityThread.main(ActivityThread.java:5845)
at java.lang.reflect.Method.invoke(Native Method)
atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687) Suppressed: java.lang.ClassNotFoundException: com.w3xplorers.cmch.MainActivity
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
Мои манифесты ниже:
`<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.w3xplorers.cmch">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<application
android:name="com.w3xplorers.cmch.EnableMultiDex"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme" >
<activity
android:name="com.w3xplorers.cmch.MainActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.w3xplorers.cmch.HomeActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="com.w3xplorers.cmch.QuickSms"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="com.w3xplorers.cmch.GroupSms"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="com.w3xplorers.cmch.SelfSms"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="com.w3xplorers.cmch.Contact"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="com.w3xplorers.cmch.Favourite"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="com.w3xplorers.cmch.Info"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity android:name="com.w3xplorers.cmch.Dialog" />
</application>
</manifest>`
Gradle ниже:
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.w3xplorers.cmch"
minSdkVersion 13
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2',
{
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.0'
compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha5'
compile 'com.android.support:design:25.3.0'
compile 'com.andreabaccega:android-form-edittext:1.0.3'
compile 'com.android.volley:volley:1.0.0'
compile 'com.squareup.okhttp3:okhttp:3.3.1'
compile 'com.android.support:multidex:1.0.1'
testCompile 'junit:junit:4.12'
}
Я не нашел идеального решения для своей проблемы. Но когда я загружаю свой apk в игру Google и загружаю оттуда, приложение работает нормально. Это самое странное решение, которое я когда-либо нашел.
Перейдите в файл на уровне проекта build.gradle и уменьшите версию зависимостей gradle до уровня ниже 2.3.0, скажем, используйте 2.2. 3
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
....
}
Затем clean → build → установить debug apk на другое устройство → это может быть ОК, тогда!
Я думаю, что проблема заключается в том, что AndroidStudio привязывается к использованию "Instant Run" вместо компиляции и установки нового APK.
Отключите "Instant Run" из "Файл" → "Настройки" → "Сборка", "Выполнение", "Развертывание" → "Мгновенный запуск".
в теге приложения измените
android:name="com.w3xplorers.cmch.EnableMultiDex"
с
android:name="android.support.multidex.MultiDexApplication"
Надеюсь, это поможет :)
больше информации на:
Вы должны следовать официальной документации: https://developer.android.com/studio/build/multidex.html#mdex-gradle
build.gradle:
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
android {
defaultConfig {
...
minSdkVersion 21
targetSdkVersion 26
multiDexEnabled true
}
...
}
Класс YourApp
public class MyApplication extends SomeOtherApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
defaultConfig {
minSdkVersion 14
targetSdkVersion 21
multiDexEnabled true
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
У меня также возникла аналогичная проблема. В моем случае я решил проблему, добавив это ниже buildTypes
dexOptions {
javaMaxHeapSize "4g"
}
также используется
defaultConfig {
multiDexEnabled true
}
и
dependencies {
compile 'com.android.support:multidex:1.0.0'
}
Как вы сказали, вы создаете приложение и нажимаете на свой телефон через USB, я считаю, что вы скопировали apk из своего каталога сборки и попытались нажать и запустить на другом устройстве. Попробуйте построить свой apk без таргетинга или подключения какого-либо устройства или эмулятора, что я имею в виду, чтобы построить ваш apk с терминала без подключения вашего устройства. Либо это сработает, либо покажет что-то.
android {
defaultConfig {
...
minSdkVersion 15
targetSdkVersion 26
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
public class MyApplication extends SomeOtherApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
Может быть, вы не делаете свое приложение Multidex.install (это);
В файле build.gradle добавьте
defaultConfig {
multiDexEnabled true
}
Также добавьте зависимость как
dependencies {
compile 'com.android.support:multidex:1.0.0'}
Возможно, это связано с тем, что у вас есть функция мгновенного запуска, поэтому просто попробуйте Отключить мгновенный запуск.
Файл → Настройки → Сборка, выполнение, развертывание → Мгновенный запуск → Снимите флажок для мгновенного запуска
Это сработало как шарм для меня :)
Мне пришлось включить поддержку Java 8 после обновления до Android Studio 3.5
Добавьте следующие строки в файл build.gradle:
android {
defaultConfig {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
Вы можете проверить документацию здесь:https://developer.android.com/studio/write/java8-support
Мне кажется случайным решить эту проблему. Я просто меняю андроид: имя на MultiDex из Android, запускаю его, а затем меняю его на свое приложение.
Сбросьте свой проект и отмените кеши/перезагрузите его в разделе раздела "Студийные файлы Android", он работает для меня.
Для тех, кто работает с этим и использует Kotlin для своих контрольных тестов:
Имейте в виду, что пробелы в именах методов работают только для тестов JVM, а не для тестов на инструментальные средства Android (как отмеченные Джейком Уортоном, он также сказал, что это может быть исправлено в будущем)
В настоящий момент, когда я пытаюсь запустить тест, например:
@Test
fun `spaces should work in names`() {
}
Выход теста говорит:
Никаких тестов не было найдено
И в журнале говорится:
Запуск прогона
Не удалось выполнить тестовый запуск: прорыв инструментария произошел из-за сбоя процесса.
Пустой набор тестов.
Пока Logcat выводит это исключение:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example, PID: 5424
java.lang.RuntimeException: Unable to instantiate instrumentation
ComponentInfo{com.example.test/android.support.test.runner.AndroidJUnitRunner}:
java.lang.ClassNotFoundException: Didn't find class
"android.support.test.runner.AndroidJUnitRunner"
on path: DexPathList[[],nativeLibraryDirectories=[/system/lib, /vendor/lib]]
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5730)
at android.app.ActivityThread.-wrap1(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1661)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.ClassNotFoundException: Didn't find class
"android.support.test.runner.AndroidJUnitRunner" on path:
DexPathList[[],nativeLibraryDirectories=[/system/lib, /vendor/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:93)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5728)
at android.app.ActivityThread.-wrap1(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1661)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Как вы можете видеть, ошибки здесь не очень полезны, поэтому я надеюсь, что люди найдут этот ответ сейчас. Решение прост, используйте допустимые имена, например:
@Test
fun spaces_dontWorkInNames() {
}
очистить кеш вашего мобильного устройства
Вы можете обратиться к ответу Mohaimanul Chowdhury. Если вы используете пользовательский класс Application, измените его с расширения Application на MultiDexApplication
например
class YourApplication : Application()
в
class YourApplication : MultiDexApplication()
это исправило мою проблему
Можете ли вы проверить, что ваша MainActivity написана с использованием Kotlin, а не Java?
Я отключил Kotlin и написал Activity с Kotlin, и это вызвало эту ошибку.
Измените расширенный класс своего класса приложения
из public class MyApplication extends Application { ... }
на public class MyApplication extends MultiDexApplication { ... }
Для более подробного объяснения просто следуйте официальной документации: https://developer.android.com/studio/build/multidex.html#mdex-gradle
меня устраивает