web-dev-qa-db-fra.com

La classe d'activité est introuvable dans le fichier AAR Java.lang.NoClassDefFoundError

J'ai créé une bibliothèque Android, elle contient une classe d'activité qui utilise pour ouvrir l'intention de la caméra, la bibliothèque fonctionne parfaitement pour la partie qui appelle l'activité apparaissant à l'écran et l'application se bloque en lançant les erreurs suivantes.

Suppressed: Java.lang.ClassNotFoundException: com.me.scanner.ScannerViewActivity
            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)
                    ... 14 more
         Caused by: Java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available

Voici mon fichier build.gradle d'un autre projet qui utilisera cette bibliothèque. 

repositories {
    flatDir {
        dirs 'libs'
    }
}
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.2'
    compile 'com.me.app:gpio_lib@aar'
    compile ('com.me.app:scanner@aar'){ transitive = true; }
    testCompile 'junit:junit:4.12'
}

Notez s'il vous plaît:

  • Cette bibliothèque fonctionne parfaitement comme projet de module,

    compile project(':scannercontrol')
    

    mais pas quand on l'utilise comme aar dans le projet

  • J'ai essayé avec et sans { transitive = true; }, pas de changement

  • J'ai renommé mon fichier aar en scanner.aar 
  • J'ai pris la forme du fichier aar /[library-project]/build/outputs/aar/scanner-release.aar

Update1 - 2017-09-14

L'activité ScannerViewActivity fait partie de ma bibliothèque, voici comment elle est appelée depuis l'une des classes de la bibliothèque

Intent scannerView = new Intent();
scannerView.putExtra(MESSAGE_RECEIVER, new MessageReceiver());
scannerView.setClass(context, ScannerViewActivity.class);
scannerView.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(scannerView);

this context est l'instance de Android.app.Application et non de Activity

Update2 - 2017-09-14

Heureusement, après avoir erré deux jours dans google, je tombe sur la réponse à la question Classe non trouvée dans aar . J'ai ajouté les dépendances de la bibliothèque au projet et capable de l'exécuter avec aar mais ce n'est pas la solution à mon problème,

Voici le flux et le problème auxquels je suis actuellement confronté

  • Je développe une version en sandbox d'une bibliothèque qui communique avec un matériel spécifique de scanner de codes à barres, car le développeur ne dispose pas nécessairement du matériel nécessaire pour utiliser la version en sandbox de la bibliothèque qui lui permettra d'utiliser son appareil photo comme code à barres. scanner, 

  • Nous souhaitons que le développeur extrait les fichiers AARscanner.aar et scanner-sandbox.aar de SDK fourni et utilise l'un ou l'autre.

  • Nous ne voulons pas que le développeur ajoute une dépendance supplémentaire à son fichier .gradle s’il veut exécuter la version en sandbox de la bibliothèque,

  • Vous trouverez ci-dessous la dépendance utilisée pour simuler l'appareil photo d'un périphérique en tant que lecteur de code à barres. 

    compile 'me.dm7.barcodescanner:zxing:1.9.8'
    

La question mise à jour est

Quel est le moyen possible de distribuer un fichier aar sans le publier dans un référentiel tel que maven repository et toutes les dépendances de la bibliothèque installée lorsque le développeur synchronise le fichier .gradle

15
riksof-zeeshan

zeeshan

J'ai fait face au même problème que j'ai fait beaucoup de recherche et j'ai résolu espérons que cela vous aide

Créer un fichier .aar pour un projet:

  1. Pour un module de bibliothèque, le fichier .aar est automatiquement créé par Android Studio. Pour un projet avec n'importe quel fichier de ressources ou avec le bibliothèques, le fichier .aar peut être généré comme indiqué dans les étapes suivantes.
  2. Vérifiez le plugin. Il devrait être dans comme suit, passer à la bibliothèque si elle est dans l'application, appliquer le plugin: 'com.Android.library'
  3. Ouvrez la barre de niveau de la bordure droite ouverte et allez dans «votre projet» -> Tâches-> Construire, puis double-cliquez sur AssembleRelease ..__ Sur Construction du projet, vous trouverez les deux .aar fichiers (app-debug.aar et app-release.aar) dans app/build/output/aar / annuaire. Utilisation du fichier .aar dans votre projet:
  4. Récupérez le fichier “app-release.aar” et collez-le dans le dossier libs de votre projet. Si le dossier libs n'est pas présent, créez un répertoire nommé “Libs” dans le répertoire de l'application.

  5. Ajoutez les éléments suivants au fichier de graduation d’application, aux référentiels { flatDir { dirs 'libs' }} dépendances { compiler (nom: 'app-release', ext: 'aar')}

  6. Lors de la synchronisation, votre projet est prêt à utiliser les fichiers de bibliothèque. Remarque: les dépendances .aar gradle doivent être ajoutées manuellement dans votre application de projet grade Exemple: ci-dessous

Hypothèse des erreurs: System.err: Java.lang.NoClassDefFoundError:

Solution:

 

Les dépendances .aar gradle doivent être ajoutées manuellement dans votre application de projet graduer

3
madhu sudhan

La réponse pour votre "Update2 - 2017-09-14" - peut simplement créer un gros fichier aar. qui contiendra toutes les dépendances, une chose que vous pourriez avoir à gérer est un conflit dans les dépendances peut parfois créer un problème. aussi la taille de la graisse aar peut être énorme. alors essayez. 

3
roronoa_zoro

Il y a 3 façons de distribuer votre bibliothèque:

  1. La création d'une bibliothèque maven locale distribue ensuite l'arar généré.
    Vous pouvez créer un fichier AAR local à l’aide de plug-in Gradle Android Maven . Comment le faire: 

    une. Ajoutez le chemin d'accès aux classes du plugin dans rootbuild.gradle:

    buildscript {
      repositories {
        jcenter()
        mavenCentral()
      }
      dependencies {
        classpath 'com.Android.tools.build:gradle:2.2.3'
        classpath 'com.github.dcendents:Android-maven-gradle-plugin:1.5'
    
      }
    }
    
    allprojects {
      repositories {
        jcenter()
      }
    }
    

    b. Définissez le plug-in maven et ajoutez le nom du groupe et de la version à la bibliothèque build.gradle:

    apply plugin: 'com.Android.library'
    apply plugin: 'com.github.dcendents.Android-maven'
    
    group = 'com.your.packagename'
    version = '1.0.0'
    ext.versionCode = 1000
    
    Android {
      compileSdkVersion 25
      buildToolsVersion "25.0.3"
    
      defaultConfig {
        minSdkVersion 9
        targetSdkVersion 25
        versionCode versionCode
        versionName version
      }
      buildTypes {
        ...
      }
    
    }
    
    dependencies {
      ...
    }
    

    c. Définissez le artifactId est défini dans settings.gradle: 

    rootProject.name = 'yourlibraryname'
    

    ré. Construisez et installez la bibliothèque sur votre maven local.
    Vous pouvez exécuter ./gradlew install sur le dossier du projet ou utiliser

    Gradle -> YourLibrary -> Other -> Install from Android Studio (à droite d'Android Studio)

    e. Utilisez la bibliothèque installée directement dans votre projet.
    Vous pouvez utiliser la bibliothèque en ajoutant mavenLocal() à votre root build.gradle

    allprojects {
      repositories {
        jcenter()
        mavenLocal() // for local maven.
      }
    }
    

    Ajoutez ensuite la dépendance au projet:

    compile 'com.your.packagename:modulename:1.0.0'
    

    Vous pouvez également copier le fichier .aar généré à partir du chemin maven local. Sous Linux, vous pouvez l'obtenir à partir de /your/userpath/.m2/repository/ ou ~/.m2/repository/

  2. Utilisez la même technique pour le numéro 1, mais indiquez le chemin d'accès maven local pour chaque ordinateur de développeur pointant vers le centre ~/.m2/repository/.

  3. Utilisez un référentiel Maven privé . Vous pouvez utiliser JFrog Artifactory oss ou Nexus Repository OSS

2

La cause du problème est que la classe ScannerViewActivity est appelée dans l’un de vos AAR en tant que dépendance, par exemple: 

apply plugin: 'com.Android.library'
Android{...}
dependencies {
    compile 'com.me.scanner:otherscanner@aar' //library which contains ScannerViewActivity
}

mais lorsque vous utilisez aar (transitive ne va pas ajouter ces dépendances aar!), vous devez ajouter les autres dépendances telles que:

dependencies {
...
compile ('com.me.app:scanner@aar')// remove{ transitive = true; }
compile ('com.me.scanner:otherscanner@aar')
...
}
2
xiaomi

Bien que je n'en connaisse pas la cause, vous pouvez essayer cette solution: dans votre projet d'application, définissez une activité à partir de ScannerViewActivity et déclarez-la dans AndroidManifest.xml.

class MyScannerViewActivity extends ScannerViewActivity {
    // do nothing or something you want
}

Ensuite, vous devez démarrer MyScannerViewActivity au lieu de ScannerViewActivity par intention.

0
Spark.Bao

Pouvez-vous essayer comme ci-dessous?

  1. Désactivez Instant Run et nettoyez votre AAR.
  2. Déployez-le à nouveau, où que vous hébergiez votre AAR.
  3. Testez à nouveau l'application avec AAR comme dépendance. 

Les exécutions instantanées causent parfois un problème en raison de la mise en cache.

Edit: Pour ajouter un AAR local. Vous pouvez suivre la réponse comme mentionné ici

0
mthakuri