2017-05-24 5 views
1

J'essaie de faire quelques expériences avec la documentation d'applications instantanées: Android Instant Apps Native Android apps, without the installation. J'ai suivi les étapes qui sont couvertes sur les documents officiels. J'ai créé l'émulateur Nexus 5X pour tester les fonctionnalités des applications instantanées. J'ai donc créé deux fonctionnalités dans mon projet, qui est très similaire à la démo pour voir comment fonctionnent les applications instantanées. Il fonctionnait bien sur une fonctionnalité, maintenant après que j'ai créé une fonctionnalité supplémentaire, maintenant j'ai deux fonctionnalités qui à leur tour s'écraser mon application.Causée par: java.lang.ClassNotFoundException: Impossible de trouver dans un chargeur de classe atome ou un chargeur de classe parent

05-24 12:07:12.259 12020-12028/? E/art: Failed writing handshake bytes (-1 of 14): Broken pipe 
05-24 12:07:15.952 12020-12020/com.williams.instantappdemo E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.williams.instantappdemo, PID: 12020 
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.williams.instantappdemo/com.williams.instantappdemo.feature.MainActivity}: java.lang.ClassNotFoundException: could not find com.williams.instantappdemo.feature.MainActivity in any atom class loader or parent class loader 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2567) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
    at android.app.ActivityThread.-wrap12(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6119) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
Caused by: java.lang.ClassNotFoundException: could not find com.williams.instantappdemo.feature.MainActivity in any atom class loader or parent class loader 
    at com.google.android.instantapps.supervisor.loader.WhAppClassLoader.loadClass(WhAppClassLoader.java:100) 
    at android.app.Instrumentation.newActivity(Instrumentation.java:1078) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2557) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)  
    at android.app.ActivityThread.-wrap12(ActivityThread.java)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:154)  
    at android.app.ActivityThread.main(ActivityThread.java:6119)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)  
    Suppressed: java.lang.ClassNotFoundException: Didn't find class "com.williams.instantappdemo.feature.MainActivity" on path: DexPathList[[directory "."],nativeLibraryDirectories=[/system/lib, /vendor/lib, /system/lib, /vendor/lib]] 
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:380) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:312) 
    at com.google.android.instantapps.supervisor.loader.WhAppClassLoader.loadClass(WhAppClassLoader.java:85) 
      ... 11 more 
    Suppressed: java.lang.ClassNotFoundException: Didn't find class "com.williams.instantappdemo.feature.MainActivity" on path: DexPathList[[zip file "/data/user/0/com.google.android.instantapps.supervisor/files/atom-cache/com.williams.instantappdemo/atom-download--base-1495607829279/base.jar"],nativeLibraryDirectories=[/data/user/0/com.google.android.instantapps.supervisor/files/native-lib/com.williams.instantappdemo, /system/lib, /vendor/lib]] 
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) 
    at com.google.android.instantapps.supervisor.loader.DexFirstClassLoader.doLoadClass(DexFirstClassLoader.java:50) 
    at com.google.android.instantapps.supervisor.loader.WhAppClassLoader.loadClass(WhAppClassLoader.java:92) 
      ... 11 more 
    Suppressed: java.lang.ClassNotFoundException: Didn't find class "com.williams.instantappdemo.feature.MainActivity" on path: DexPathList[[zip file "/data/user/0/com.google.android.instantapps.supervisor/files/atom-cache/com.williams.instantappdemo/atom-download--feature-1495607829279/feature.jar"],nativeLibraryDirectories=[/data/user/0/com.google.android.instantapps.supervisor/files/native-lib/com.williams.instantappdemo, /system/lib, /vendor/lib]] 
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) 
    at com.google.android.instantapps.supervisor.loader.DexFirstClassLoader.doLoadClass(DexFirstClassLoader.java:50) 
    at com.google.android.instantapps.supervisor.loader.WhAppClassLoader.loadClass(WhAppClassLoader.java:92) 
      ... 11 more 

est ici build.gradle du module de fonction:

apply plugin: 'com.android.feature' 

android { 
    compileSdkVersion 25 
    buildToolsVersion rootProject.buildToolsVersion 
    defaultConfig { 
     minSdkVersion 23 
     targetSdkVersion 25 
     versionCode 1 
     versionName "1.0" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    } 
    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' 
    }) 
    implementation project(':base') 
    testCompile 'junit:junit:4.12' 

} 

Voici build.gradle pour feature2:

apply plugin: 'com.android.feature' 


android { 
    compileSdkVersion 25 
    buildToolsVersion rootProject.buildToolsVersion 


    defaultConfig { 
     minSdkVersion 23 
     targetSdkVersion 25 
     versionCode 1 
     versionName "1.0" 

     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 

    } 
    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' 
    }) 
    implementation project(':base') 

    testCompile 'junit:junit:4.12' 
} 

Voici le build.gradle pour module de base:

apply plugin: 'com.android.feature' 

android { 
    compileSdkVersion 25 
    buildToolsVersion rootProject.buildToolsVersion 
    baseFeature true 
    defaultConfig { 
     minSdkVersion 23 
     targetSdkVersion 25 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    feature project(':feature') 
    compile 'com.android.support:appcompat-v7:25.+' 
    compile 'com.android.support.constraint:constraint-layout:1.0.2' 
    feature project(":feature1") 
} 

Voici le build.gradle du module d'application:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 25 
    buildToolsVersion rootProject.buildToolsVersion 


    defaultConfig { 
     applicationId "com.nagarro.instantappdemo" 
     minSdkVersion 23 
     targetSdkVersion 25 
     versionCode 1 
     versionName "1.0" 


    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    implementation project(':feature') 
    implementation project(':feature1') 
    implementation project(':base') 
} 

Quelqu'un peut-il suggérer ce que je fais mal?

+0

Exception CNF signifie que la machine virtuelle Java ne peut pas trouver le fichier JAR contenant cette classe. C'est probablement un problème d'emballage. Vous supposez que vous avez tout fait correctement, mais la JVM vous dit que ce n'est pas vrai. Regardez dans le paquet et voyez si vous pouvez trouver cette classe. – duffymo

+0

Dans quel module se trouve MainActivity? Module d'application? – MatPag

+0

@MatPag 'MainActivity' est situé dans le module des deux fonctionnalités. Les deux fonctionnalités du module a un package différent –

Répondre

3

Il semble que le package d'activité réel ne corresponde pas à ce que vous avez dans votre fichier manifeste de la fonction contenant MainActivity. C'est une erreur fréquente lors de la refactorisation des activités dans de nouveaux paquets et de ne pas utiliser les chemins relatifs pour les activités dans le manifeste. qualifier complètement le chemin d'être absolument sûr

<activity android:name="com.williams.instantappdemo.feature.MainActivity"/> 

le fichier Effectuer un contrôle apk (build/sorties/APK) en utilisant Apk Analyzer pour voir si elle a com.williams.instantappdemo.feature.MainActivity dans ce paquet exact.

Vous pouvez également utiliser le Merged Manifest view pour inspecter votre manifeste final (module d'application) pour vérifier que tout est en ordre.

, ajoutez également projet d'application (": app") au module de fonction de base pour qu'il utilise applicationId défini dans votre module d'application pour emballer votre application/app instantanée

Mise à jour: En utilisant les techniques décrites ci-dessus, j'ai enquêté sur les manifestes fusionnés et trouvé un problème. Le plugin de construction a ignoré les numéros dans le nom du module (feature1) afin que les deux entités aient le même nom. Cela a causé un tas de problèmes, y compris l'erreur ActivityNotFound. Renommer le module feature1 à featureOne a résolu le problème.

+0

J'ai ajouté ceci "ajouter le projet d'application (": app ") au module de base afin qu'il utilise applicationId défini dans votre application module pour empaqueter votre application/application instantanée "et vérifié Fusionné Manifeste Voir ici, il est https://pastebin.com/qrFXSuxg –

+0

Je peux voir à partir des données du manifeste fusionné l'activité est emballée comme com.nagarro.instantappdemo.feature.MainActivity et pas com.williams.instantappdemo.feature.MainActivity AJOUTÉ à partir de [: base] C: \ Utilisateurs \ williams \ AndroidStudioProjects \ InstantAppDemo \ base \ build \ intermédiaires \ bundles \ débogage \ AndroidManifest.xml: 17: 9-40 activité # com .nagarro.instantappdemo.feature.MainActivity – Anirudh

+0

Ah, il y avait un problème dans ma dernière corbeille de collage. Cochez cette case https://pastebin.com/50jN9jXY –