java - lollipop - Android 5.x ClassNotFoundException funciona bien en 6.0+
apis de android studio (11)
¿Necesita multidex habilitado? Siempre me he encontrado con problemas con él. Siempre entendí que multidex se usaría como último recurso si aún estás alcanzando el límite del método de 65k. Si no se está ejecutando en este límite de método, no necesita multidex. Si se está topando con este límite, sugeriría usar progaurd para solucionar el problema primero. Si aún está por encima del límite del método, incluso después de usar proguard, use multidex.
He actualizado minSdkVersion de mi proyecto de 19 a 21. Esto ha causado un problema en los dispositivos 5.0 / 5.1 donde no puedo ejecutar la aplicación. Sigo recibiendo una excepción ClassNotFoundException en mi clase de aplicación. El registro completo, la clase de aplicación y el archivo de gradle se encuentran a continuación. Si vuelvo mi proyecto a minSdkVersion 19, la aplicación se ejecutará en 4.4+ sin problemas.
Lo que he intentado
Limpieza / Reconstrucción
Actualizando y degradando la versión de las herramientas de construcción.
Todas las bibliotecas de soporte en todos los proyectos tienen el mismo número de versión
Haciendo todas mis clases manifiestas relativas y luego absolutas.
Actualización de todas las herramientas SDK y compilación.
Iniciar sesión
04-27 14:37:07.152 6278-6278/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.package.testapp, PID: 6278
java.lang.RuntimeException: Unable to instantiate application com.package.TestApplication: java.lang.ClassNotFoundException: Didn''t find class "com.package.Application" on path: DexPathList[[zip file "/data/app/com.package.testapp-1/base.apk"],nativeLibraryDirectories=[/data/app/com.package.testapp-1/lib/x86_64, /vendor/lib64, /system/lib64]]
at android.app.LoadedApk.makeApplication(LoadedApk.java:563)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4526)
at android.app.ActivityThread.access$1500(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: java.lang.ClassNotFoundException: Didn''t find class "com.package.TestApplication" on path: DexPathList[[zip file "/data/app/com.package.testapp-1/base.apk"],nativeLibraryDirectories=[/data/app/com.package.testapp-1/lib/x86_64, /vendor/lib64, /system/lib64]]
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:980)
at android.app.LoadedApk.makeApplication(LoadedApk.java:558)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4526)
at android.app.ActivityThread.access$1500(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Suppressed: java.lang.ClassNotFoundException: com.package.testapp.welcome.TestClaimApplication
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)
... 13 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
Gradle
buildscript {
repositories {
maven { url ''https://maven.fabric.io/public'' }
}
dependencies {
classpath ''io.fabric.tools:gradle:1.+''
}
}
apply plugin: ''com.android.application''
apply plugin: ''io.fabric''
repositories {
maven { url ''https://maven.fabric.io/public'' }
}
android {
compileSdkVersion 25
buildToolsVersion ''25.0.3''
defaultConfig {
applicationId "com.package.testapp"
minSdkVersion 21
multiDexEnabled = true
targetSdkVersion 25
versionCode 2
versionName "0.7"
renderscriptTargetApi 18 // support mode not supported 21+
renderscriptSupportModeEnabled true
testInstrumentationRunner
"android.support.test.runner.AndroidJUnitRunner"
}
dexOptions {
javaMaxHeapSize "4g"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-rules.pro''
}
}
lintOptions {
checkReleaseBuilds false
abortOnError false
}
productFlavors {
companylocal
companymaven
}
}
dependencies {
def ext = rootProject.ext;
compile fileTree(include: [''*.jar''], dir: ''libs'')
compile "com.android.support:appcompat-v7:${ext.supportLibraryVersion}"
compile "com.android.support:design:${ext.supportLibraryVersion}"
compile ''com.romandanylyk:pageindicatorview:0.0.9''
compile "com.jakewharton:butterknife:${ext.butterknifeLibraryVersion}"
annotationProcessor "com.jakewharton:butterknife-compiler:${ext.butterknifeLibraryVersion}"
compile "uk.co.chrisjenx:calligraphy:2.2.0"
compile ''com.android.support:multidex:1.0.1''
// Crashlytics Kit - for crash handling
compile(''com.crashlytics.sdk.android:crashlytics:2.5.2@aar'') {
transitive = true
}
androidTestCompile(''com.android.support.test.espresso:espresso-core:2.2.2'', {
exclude group: ''com.android.support'', module: ''support-annotations''
})
testCompile ''junit:junit:4.12''
testCompile ''org.robolectric:robolectric:3.0''
testCompile "com.squareup.okhttp3:mockwebserver:${ext.okHttp3LibraryVersion}"
testCompile(''com.squareup.assertj:assertj-android:1.1.1'') {
exclude module: ''support-annotations''
}
}
Solicitud
public class TestApplication extends Application {
Engine engine;
@Override
public void onCreate() {
super.onCreate();
String privateServerUrlLocal = getString(R.string.server_url);
ProfileLauncher profileLauncher = getProfileLauncher();
LoginLauncher loginLauncher = getLoginLauncher();
// Set up Crash Analytics
final CrashlyticsCore crashlyticsCore = new CrashlyticsCore.Builder().disabled(DEBUG).build();
Fabric.with(this, new Crashlytics.Builder().core(crashlyticsCore).build());
Intent intent = new Intent(this, LogoutService.class);
startService(intent);
CertificatePinner certificatePinner = new CertificatePinner.Builder()
.add("")
.add("")
.build();
engine = new Engine.Builder(privateServerUrlLocal, getString(R.string.other_server_url))
.setCertificatePinner(certificatePinner)
.setSDKPartnerSetupManager(getSdkPartnerManager())
.setLogoutActionHandler(getLogoutActionHandler())
.setVLocationManager(new VLocationManagerImp())
.setDebug(DEBUG)
.addDeepLinkHandler(new ClaimDeepLinkHandler(loginLauncher, profileLauncher))
.addDeepLinkHandler(new LinkGiftCodeDeeplinkHandler(loginLauncher, profileLauncher))
.addDeepLinkHandler(new OpenLinkDeepLinkHandler())
.addDeepLinkHandler(new DetailsDeepLinkHandler())
.addClaimConfig(new ClaimConfig(false, false, false, false, true))
.build();
engine.startup(this);
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(base);
}
}
Manifiesto
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.package.testapp">
<uses-feature
android:name="android.hardware.camera"
android:required="true" />
<uses-feature
android:name="android.hardware.camera.autofocus"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.flash"
android:required="false" />
<!-- Required for g+ login -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:name=".TestApplication"
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<service
android:name="com.package.companycommon.ui.LogoutService"
android:stopWithTask="true" />
<activity
android:name=".LaunchActivity"
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=".welcome.WelcomeActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar.ClearStatus" />
<activity
android:name=".RegisterActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar.ClearStatus"
android:windowSoftInputMode="adjustResize" />
<activity
android:name=".LoginActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar.ClearStatus"
android:windowSoftInputMode="adjustResize" />
<activity
android:name=".ActivationActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar.ClearStatus"
android:windowSoftInputMode="adjustResize" />
<activity
android:name=".AddPhoneNumberActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar.ClearStatus"
android:windowSoftInputMode="adjustResize" />
<activity
android:name=".ForgotPasswordActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar.ClearStatus"
android:windowSoftInputMode="adjustResize" />
<activity
android:name=".GiftHistoryActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar.ClearStatus" />
<activity
android:name="com.package.PartnerLoginHiddenActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar.ClearStatus" />
<activity
android:name=".tutorial.TutorialActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar.ClearStatus" />
<activity
android:name=".CreateNewPasswordActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar.ClearStatus" />
<activity
android:name=".settings.SettingsActivity"
android:screenOrientation="portrait">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".GiftHistoryActivity" />
</activity>
<activity
android:name=".settings.ExtraSettingsActivity"
android:label="@string/settings"
android:screenOrientation="portrait">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".settings.SettingsActivity" />
</activity>
<activity
android:name="companyapp.company.NewsActivity"
android:label="@string/notifications"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" />
<activity
android:name=".termsandconditions.CompanyTermsAndConditionsActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" />
<activity
android:name="com.package.companycommon.ui.PhotoViewerActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" />
<activity
android:name="com.package.company.details.CompanyDetailActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" />
<activity
android:name="com.package.company.details.CompanyDetailActivityLocation"
android:screenOrientation="portrait"
android:theme="@style/AppTheme">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.package.company.details.CompanyDetailActivity" />
</activity>
<activity
android:name="com.package.company.ClaimActivity"
android:theme="@style/AppTheme.NoActionBar"
tools:replace="android:theme" />
</application>
</manifest>
Cree multidex-config.txt para mantener estas clases en el archivo DEX primario:
com/package/Application.class
com/package/TestApplication.class
com/package/testapp/welcome/TestClaimApplication.class
Agregue multiDexKeepFile a la sección android.buildTypes.release de su build.gradle como esto:
android {
buildTypes {
release {
multiDexKeepFile file ''multidex-config.txt''
}
}
}
Cuando se dirige a la api 21, el compilador tiene un límite de 100 archivos dex que leerá. Entonces, una solución simple que encontré fue agregar esto a sus descripciones en su archivo de gradle. Esto fusionará todos sus archivos dex en la menor cantidad posible.
En su archivo build.gradle agregue lo siguiente
android {
...
dexOptions {
preDexLibraries = false
}
}
Esto significa que su multiDex no funciona correctamente, por lo que faltan algunos archivos. Creo que Android 5.0 tiene una forma diferente de usar el multiDex. ¿Anulaste algo en tu clase de aplicación?
He hecho una demo de su código y configuración y está funcionando en el siguiente malvavisco
Descárgalo y compruébalo y compara con tu código. Y una cosa más, cómo ha creado el proyecto con el nombre del paquete com.package.testapp. No puedo crear un proyecto con el mismo nombre de paquete
Intenta dar el camino completo en manifiesto.
<application
android:name=".TestApplication"
También elimine la carpeta de compilación manualmente; a veces la limpieza no funciona. También desinstale la aplicación manualmente y comience.
Intenta eliminar la compile ''com.android.support:multidex:1.0.1''
. El documento de Google says
Por lo tanto, si su minSdkVersion es 21 o superior, no necesita la biblioteca de soporte multidex.
No estoy seguro de si esto ayuda, pero vale la pena intentarlo.
Intente habilitar Progaud y deshabilitar multidex.
No solo resolverá este problema, sino que también tendrá una apk más pequeña con tiempos de instalación y ejecución más rápidos.
Nota: si necesita ayuda con esto, simplemente deje un comentario y podemos resolverlo.
- Ok, entonces no es Progaurd o MultiDex
El error es que com.package.Application no se encuentra. Ninguno de los códigos que publicaste (o el manifiesto) contiene una referencia a esa clase. ¿Dónde estás definiendo com.package.Application? y si no estás en tu proyecto, ¿se está haciendo referencia? (Haría una búsqueda en todo el proyecto para "com.package.Application" para desentrañar esto).
Necesita agregar su nombre de android: con una ruta completa como esta.
android:name="android.support.multidex.MultiDexApplication"
Y su aplicación de prueba debería extender la aplicación MultiDex.
De acuerdo con la documentación, por favor refiérase si necesita más detalles. says
Por alguna razón, esta clase ya no está en su principal dex.
Declare la clase en la lista de clases principales , usando multiDexKeepFile (listando las clases en gradle) o multiDexKeepFile (apuntando a un archivo de programa específico para las clases principales).