webentwicklung-frage-antwort-db.com.de

Die Aktivitätsklasse kann nicht in der AAR-Datei Java.lang.NoClassDefFoundError gefunden werden

Ich habe eine Android-Bibliothek erstellt, die eine Aktivitätsklasse enthält, die zum Öffnen der Kameraabsicht verwendet wird. Die Bibliothek funktioniert perfekt, wenn der Teil, der die Aktivität aufruft, über dem Bildschirm angezeigt wird, und die App stürzt ab und wirft folgende Fehler auf

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

Nachfolgend meine build.gradle-Datei eines anderen Projekts, das diese Bibliothek verwenden wird 

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:[email protected]'
    compile ('com.me.app:[email protected]'){ transitive = true; }
    testCompile 'junit:junit:4.12'
}

Bitte beachten Sie:

  • Diese Bibliothek funktioniert perfekt als Modulprojekt.

    compile project(':scannercontrol')
    

    aber nicht bei der Verwendung als aar im Projekt

  • Ich habe es mit und ohne { transitive = true; } versucht, keine Änderung

  • Ich habe meine AAR-Datei in scanner.aar umbenannt. 
  • Ich habe das AAR-Dateiformat /[library-project]/build/outputs/aar/scanner-release.aar genommen

Update1 - 2017-09-14

Die Aktivität ScannerViewActivity ist Teil meiner Bibliothek. So wird sie von einer der Bibliotheksklassen aufgerufen

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);

diese context ist die Instanz von Android.app.Application und nicht von Activity

Update2 - 2017-09-14

Glücklicherweise stieß ich nach 2 Tagen überall auf google auf die Antwort der Frage Klasse, die nicht in aar gefunden wurde. Ich habe die Abhängigkeiten der Bibliothek zum Projekt hinzugefügt und kann sie mit aar ausführen, aber dies ist nicht die Lösung meines Problems.

Folgendes ist der Fluss und das Problem, mit dem ich gerade konfrontiert bin

  • Ich entwickle eine Sandbox-Version einer Bibliothek, die mit einer bestimmten Barcode-Scanner-Hardware kommuniziert, da der Entwickler nicht notwendigerweise über die Hardware verfügt, die die Sandbox-Version der Bibliothek verwendet, die es dem Entwickler ermöglicht, die Gerätekamera als Barcode zu verwenden Scanner, 

  • Wir möchten, dass der Entwickler die AAR-Dateien scanner.aar und scanner-sandbox.aar aus der angegebenen SDK extrahiert und eine der beiden verwendet

  • Wir möchten nicht, dass der Entwickler seiner .gradle-Datei zusätzliche Abhängigkeiten hinzufügt, wenn er die Sandbox-Version der Bibliothek ausführen möchte.

  • Es folgt die Abhängigkeit, mit der die Gerätekamera als Barcode-Scanner simuliert wird 

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

Die aktualisierte Frage ist

Wie kann eine aar-Datei verteilt werden, ohne sie in einem Repository wie maven repository und allen Abhängigkeiten der Bibliothek zu veröffentlichen, wenn der Entwickler die .gradle-Datei synchronisiert

15
riksof-zeeshan

zeeshan

Ich habe das gleiche Problem angetroffen, das ich viel recherchiert habe, und ich habe es hoffentlich behoben

Erstellen einer .aar-Datei für ein Projekt:

  1. Bei einem Bibliotheksmodul wird die .aar-Datei automatisch von Android Studio erstellt. Für ein Projekt mit einer beliebigen Ressourcendatei oder mit der Bibliotheken kann die .aar-Datei wie in den nächsten Schritten beschrieben generiert werden.
  2. Überprüfen Sie das Plugin. Es sollte wie folgt lauten. Wechseln Sie zur Bibliothek, wenn es sich in der Anwendung befindet, und wenden Sie das Plugin an:
  3. Öffnen Sie die offene rechte Begrenzungsleiste und gehen Sie zu "Ihr Projekt" -> Aufgaben-> Erstellen. Doppelklicken Sie dann auf die assembleRelease . Beim Erstellen des Projekts finden Sie die beiden .aar Dateien (app-debug.aar und app-release.aar) in app/build/output/aar / Verzeichnis. Verwenden der .aar-Datei in Ihrem Projekt:
  4. Laden Sie die Datei „app-release.aar“ herunter und fügen Sie sie in den libs-Ordner Ihres Projekts ein. Wenn der libs-Ordner nicht vorhanden ist, erstellen Sie ein Verzeichnis mit dem Namen "Libs" im App-Verzeichnis.

  5. Fügen Sie der App-Gradle-Datei Folgendes hinzu: Repositorys { flatDir { dir 'libs' }} Abhängigkeiten { kompilieren (Name: 'app-release', ext: 'aar')}

  6. Bei der Synchronisierung kann Ihr Projekt die Bibliotheksdateien verwenden. Hinweis: Abhängigkeiten von .aar Gradle müssen manuell in Ihrer Projekt-App hinzugefügt werden gradle Beispiel: unten

Annahme von Fehlern: System.err: Java.lang.NoClassDefFoundError:

Lösung:

 

Abhängigkeiten von .aar Gradle müssen in Ihrer Projekt-App manuell hinzugefügt werden gradle

3
madhu sudhan

Die Antwort für Ihr "Update2 - 2017-09-14" - kann einfach eine fette AAR-Datei erstellen. die alle Abhängigkeiten enthalten wird, eine Sache, die Sie möglicherweise behandeln müssen, ist ein Konflikt in Abhängigkeiten, der manchmal ein Problem verursachen kann. Auch die Größe des fetten Aars kann sehr groß sein. also versuch es. 

3
roronoa_zoro

Es gibt drei Möglichkeiten, Ihre Bibliothek zu verteilen:

  1. Erstellen Sie eine lokale Maven-Bibliothek, und verteilen Sie dann den generierten Aar.
    Sie können ein lokales Fenster erstellen, indem Sie Gradle Android Maven-Plugin verwenden. Wie man es macht: 

    ein. Fügen Sie den Plugin-Klassenpfad zu rootbuild.gradle hinzu:

    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. Legen Sie das Maven-Plugin fest und fügen Sie der Bibliothek build.gradle den Gruppen- und Versionsnamen hinzu:

    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. Legen Sie fest, dass die artifactId in settings.gradle festgelegt ist: 

    rootProject.name = 'yourlibraryname'
    

    d. Erstellen und installieren Sie die Bibliothek in Ihrem lokalen Ordner.
    Sie können ./gradlew install im Projektordner ausführen oder verwenden

    Gradle -> YourLibrary -> Other -> Von Android Studio installieren (auf der rechten Seite von Android Studio)

    e. Verwenden Sie die installierte Bibliothek direkt für Ihr Projekt.
    Sie können die Bibliothek verwenden, indem Sie mavenLocal() zu Ihrem root build.gradle hinzufügen

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

    Fügen Sie dann die Abhängigkeit zum Projekt hinzu:

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

    Oder Sie können die generierte .aar-Datei aus dem lokalen Pfad kopieren. Unter Linux können Sie es von /your/userpath/.m2/repository/ oder ~/.m2/repository/ erhalten.

  2. Verwenden Sie dasselbe Verfahren wie in Nummer 1, stellen Sie jedoch den lokalen Maven-Pfad für jeden Entwicklercomputer auf die ~/.m2/repository/-Zentrale.

  3. Verwenden Sie ein privates Maven-Repository . Sie können JFrog Artifactory oss oder Nexus Repository OSS verwenden.

Die Ursache des Problems ist, dass die Klasse ScannerViewActivity in einem Ihrer AAR als Abhängigkeit aufgerufen wird: 

apply plugin: 'com.Android.library'
Android{...}
dependencies {
    compile 'com.me.scanner:[email protected]' //library which contains ScannerViewActivity
}

wenn Sie jedoch einen Aar verwenden (Transitive fügt diese Aar-Abhängigkeiten nicht hinzu!), müssen Sie die andere Abhängigkeit hinzufügen, wie:

dependencies {
...
compile ('com.me.app:[email protected]')// remove{ transitive = true; }
compile ('com.me.scanner:[email protected]')
...
}
2
xiaomi

Obwohl ich die Ursache nicht kenne, können Sie diese Lösung ausprobieren: Definieren Sie in Ihrem App-Projekt eine Aktivität, die sich von ScannerViewActivity erstreckt, und deklarieren Sie sie in AndroidManifest.xml.

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

Dann sollten Sie MyScannerViewActivity anstelle von ScannerViewActivity absichtlich starten.

0
Spark.Bao

Kannst du es wie unten versuchen?

  1. Deaktivieren Sie Instant Run und erstellen Sie Ihren AAR sauber.
  2. Stellen Sie es erneut bereit, wo immer Sie Ihren AAR hosten.
  3. Testen Sie die App erneut mit AAR als Abhängigkeit. 

Sofortige Läufe verursachen manchmal ein Problem aufgrund des Caching.

Edit: Zum Hinzufügen von lokalem AAR. Sie können die Antwort wie folgt verfolgen: hier

0
mthakuri