J'ai un projet Android développé avec AndroidStudio et Gradle qui embarque et démarre un petit projet OSGi basé sur felix. Pour déboguer j'utilise l'émulateur pour Nexus 5X avec Android 8.0, API 26. J'utilise le service déclaratif et donc mon projet repose sur felix.main, felix.scr et felix.configadmin. Tous les bundles sont dexifiés. L'installation des paquets fonctionne bien, mais si je démarre les paquets par bundle.start(), j'obtiens le message d'erreur suivant pour felix.scr et felix.configadmin (felix.main et mes propres paquets fonctionnent bien -> les états sont actifs):Intégrer OSGi Felix dans Android causes dans UnsupportedOperationException: ne peut pas charger ce type de fichier de classe
08-03 13:58:00.880 19745-19745/android.cit.tu_berlin.de.helloandroid W/zygote: Skipping duplicate class check due to unrecognized classloader
08-03 13:58:00.881 19745-19745/android.cit.tu_berlin.de.helloandroid E/OSGIService: catch exception while starting bundle:
08-03 13:58:00.881 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: org.osgi.framework.BundleException: Activator start error in bundle org.apache.felix.configadmin [2].
08-03 13:58:00.881 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at org.apache.felix.framework.Felix.activateBundle(Felix.java:2276)
08-03 13:58:00.881 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at org.apache.felix.framework.Felix.startBundle(Felix.java:2144)
08-03 13:58:00.881 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:998)
08-03 13:58:00.881 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:984)
08-03 13:58:00.881 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at android.cit.tu_berlin.de.helloandroid.OSGIService.startBundle(OSGIService.java:386)
08-03 13:58:00.882 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at android.cit.tu_berlin.de.helloandroid.OSGIService.runSensorVisualisationPlugin(OSGIService.java:248)
08-03 13:58:00.882 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at android.cit.tu_berlin.de.helloandroid.OSGIService.onStartCommand(OSGIService.java:158)
08-03 13:58:00.882 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3539)
08-03 13:58:00.882 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at android.app.ActivityThread.-wrap20(Unknown Source:0)
08-03 13:58:00.882 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1698)
08-03 13:58:00.882 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at android.os.Handler.dispatchMessage(Handler.java:105)
08-03 13:58:00.882 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at android.os.Looper.loop(Looper.java:164)
08-03 13:58:00.882 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6540)
08-03 13:58:00.882 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at java.lang.reflect.Method.invoke(Native Method)
08-03 13:58:00.882 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
08-03 13:58:00.882 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
08-03 13:58:00.882 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: Caused by: java.lang.UnsupportedOperationException: can't load this type of class file
08-03 13:58:00.882 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at java.lang.ClassLoader.defineClass(ClassLoader.java:591)
08-03 13:58:00.882 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.defineClass(BundleWiringImpl.java:2370)
08-03 13:58:00.882 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.findClass(BundleWiringImpl.java:2154)
08-03 13:58:00.882 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1542)
08-03 13:58:00.882 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:79)
08-03 13:58:00.882 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:2018)
08-03 13:58:00.882 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
08-03 13:58:00.882 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at org.apache.felix.framework.BundleWiringImpl.getClassByDelegation(BundleWiringImpl.java:1415)
08-03 13:58:00.882 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at org.apache.felix.framework.Felix.createBundleActivator(Felix.java:4468)
08-03 13:58:00.883 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: at org.apache.felix.framework.Felix.activateBundle(Felix.java:2221)
08-03 13:58:00.883 19745-19745/android.cit.tu_berlin.de.helloandroid W/System.err: ... 15 more
le script a gradle la déclaration suivante pour résoudre les dépendances aux pots felix:
provided fileTree(dir: 'src/main/assets/bundles/', include: ['*.jar'])
// for finding Felix.class
compile group: 'org.apache.felix', name: 'org.apache.felix.framework', version: '5.4.0'
Et je devais définir la propriété suivante à felix pour résoudre à condition manquante osgi.ee (sur la base réponse de Christian Schneider dans celle post):
configMap.put(Constants.FRAMEWORK_SYSTEMCAPABILITIES, "osgi.ee; osgi.ee=\"JavaSE\";version:List=\"1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8\"");
Je me demande si cette erreur est liée à celle post particulièrement à la partie « d'entrée Bibliothèque de référence au projet de construction Chemin » (basé sur la réponse de Alec B. Plumb dans ce post) parce que je ne savoir pourquoi la première ligne de "mon" rapport d'erreur indique
W/zygote: Skipping duplicate class check due to unrecognized classloader
Pourquoi une classe dupliquée? Chaque lib est là une fois et il n'y a pas d'autres paramètres de projet ou de liens de dépendance sauf dans Gradle.
J'ai trouvé un post similaire et il est résolu en suivant les étapes du tutoriel d'Apache Felix. Sympa, mais j'ai fait pareil et l'erreur s'est produite de plus.
J'ai beaucoup essayé les derniers jours, j'ai beaucoup lu les derniers jours mais ce que j'ai trouvé ne correspond pas à mon problème, je suppose. S'il vous plaît aider! Et merci beaucoup d'avance!
Mise à jour 08/08/17:
j'ai essayé de trouver l'exception originale basée sur la réponse de Balazs Zsoldos et que le résultat: L'exception est levée dans BundleWiringImpl.class en getClassByDelegation (String name):
public Class getClassByDelegation(String name) throws ClassNotFoundException {
if(name != null && name.length() > 0 && name.charAt(0) == 91) {
return Class.forName(name, false, this.getClassLoader());
} else if(this.isFiltered(name)) {
throw new ClassNotFoundException(name);
} else {
ClassLoader cl = this.getClassLoaderInternal();
if(cl == null) {
throw new ClassNotFoundException("Unable to load class \'" + name + "\' because the bundle wiring for " + this.m_revision.getSymbolicName() + " is no longer valid.");
} else {
return cl.loadClass(name);
}
}
}
La dernière ligne (cl.loadClass (name)) lève l'exception. Par souci d'exhaustivité ici les valeurs:
cl = org.apache.felix.configadmin
name = org.apache.felix.cm.impl.ConfigurationManager
Malheureusement je ne peux pas déboguer dans cette méthode, donc j'arrêté là et mis à attraper toutes Android Studio exceptions. L'arrêt suivant est provoqué par une exception lancée dans DexFile.class
cause = java.lang.ClassNotFoundException: java.lang.Object
detailedMessage = Failed resolution of: Ljava/lang/Object
Qu'est-ce que c'est que ça? Pourquoi dans DexFile.class et pourquoi il n'est pas possible de résoudre la classe d'objet? J'ai vérifié les fichiers dex et leur nom d'entrée (peut-être le problème de chemin absolu, Balazs Zsoldos mentionné) dans les bocaux de bundle. D'accord! Il n'y a pas d'addition cachée. Quelqu'un peut-il aider ou quelqu'un a-t-il eu un problème similaire et une idée de comment résoudre?
Mise à jour 10.08.17
Ce que je me demande c'est pourquoi seuls les paquets felix lancent des exceptions. Felix-Main Bundle et mon propre travail bien, ils sont en état actif. Et pourquoi est-il possible que mes propres paquets basés sur le service déclaratif soient actifs même si le paquet felix-scr ne démarre pas (l'état est résolu). Il semble que felix-scr ne soit pas en état actif pour résoudre la dépendance à felix-scr. Quoi qu'il en soit, pourquoi les librairies fixix dexified échouent-elles et mon propre travail? S'il vous plaît, aidez, je suis désespéré!
Mise à jour 11.08.2017
Aujourd'hui j'ai essayé mon projet pour exécuter et déboguer sur un appareil Android physique (Sony XPERIA Z2 avec Android 4.4.4, API 19) et cela fonctionne. Tous les bundles sont actifs dans l'état. Les derniers jours j'ai utilisé l'émulateur pour Nexus 5X avec Android 8.0, API 26, donc j'ai édité mon post pour ajouter cette information. Il semble dépendre fortement de l'appareil et/ou de la version Android et de l'API. Fou!
Merci beaucoup pour votre réponse. Je vais essayer demain et j'espère trouver la cause originale. Cependant, c'est vraiment bon de savoir où je peux commencer à trouver l'erreur! Cela aide beaucoup! – Computerwurm