2017-09-12 49 views
16

Utworzyłem bibliotekę androidów, zawiera ona klasę aktywności, która służy do otwierania intencji kamery, biblioteka działa idealnie z wyjątkiem części, która wywołuje działanie w celu wyświetlenia. ekran i rzucanie awarii aplikacji następujące błędyKlasa aktywności nie może zostać znaleziona w pliku AAR java.lang.NoClassDefFoundError

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 

Obserwuje jest mój plik build.gradle z innego projektu, które będą korzystać z tej biblioteki

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' 
} 

Uwaga:

  • Ta biblioteka działa doskonale jako projekt modułu

    compile project(':scannercontrol') 
    

    ale nie podczas używania go jako aar w projekcie

  • próbowałem zi bez { transitive = true; }, bez zmian

  • Zmieniam nazwę pliku AAR na scanner.aar
  • Brałem postać pliku AAR /[library-project]/build/outputs/aar/scanner-release.aar

Update1 - 2017-09-14

Aktywność ScannerViewActivity jest częścią mojej bibliotece, to jak to jest nazywany od jednej klasy biblioteki

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

to context jest wystąpienie android.app.Application nie któregokolwiek Activity

Update2 - 2017-09-14

szczęście po 2 dni w roamingu na całym Google I natknąć na odpowiedź z pytaniem Class not found in aar.Dodałem zależności biblioteki do projektu i jest w stanie uruchomić go z aar ale to nie jest rozwiązanie mojego problemu,

Poniżej przepływ i problem mam obecnie przed

  • Zajmuję się wersją piaskownicy biblioteki, która komunikuje się z konkretnym sprzętem do skanowania kodów kreskowych, ponieważ programista niekoniecznie musi mieć sprzęt, z którego będzie korzystać w wersji biblioteki piaskownicy, która umożliwi programistom korzystanie z ich kamery urządzenia jako skaner kodów kreskowych,

  • Chcemy deweloper, aby wyodrębnić pliki scanner.aarAAR i scanner-sandbox.aar od przewidzianego SDK i użyć jednej z nich

  • Nie chcemy się z deweloperem, aby dodać dodatkową zależność ich pliku .gradle jeśli chcą uruchomić wersję piaskownicy biblioteki,

  • Poniżej zależność, który jest używany do symulacji kamery urządzenia jako skanera kodów kreskowych

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

Zaktualizowane pytanie jest

Jaki jest możliwy sposób rozpowszechniać plik AAR bez publikowania ich na dowolnym repozytorium jak maven repozytorium i wszystkimi zależnościami biblioteki zainstalowane kiedy deweloper synchronizuje plik .gradle

+0

sprawdź zależności w ustawieniach modułu projektu. musisz ponownie dołączyć tę zależność. – james

+0

Kliknij prawym przyciskiem myszy na swój projekt> Otwórz ustawienie modułu. I widać kartę zależności. załóż tam swój plik/bibliotekę. – james

+0

możesz znaleźć folder com.me.app:scanner w folderze ~ \ .gradle \ caches \ modules-2 \ files-2.1 – sanemars

Odpowiedz

1

przyczyną problemu jest to, że klasa ScannerViewActivity nazywa się wewnątrz jednego swojego AAR jako zależność jak:

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

ale podczas korzystania z AAR (przechodnia nie doda th Jest zależności AAR), trzeba dodać inne uzależnienia, takie jak:

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

działanie nie jest częścią żadnej innej biblioteki, należy do tej samej biblioteki –

+0

@ riksof-zeeshan Czy możesz rozpakować plik aar, a następnie rozpakować plik 'classes.jar' i sprawdzić, czy jest tam' ScannerViewActivity.class'? – xiaomi

+0

tak to prezentuje –

0

Chociaż nie znam przyczyny, można spróbować tego rozwiązania: w projekcie aplikacji, definiować działalność rozciąga się od ScannerViewActivity i zadeklaruj go w AndroidManifest.xml.

Następnie należy uruchomić MyScannerViewActivity zamiast ScannerViewActivity według intencji.

3

Zeeshan

mam do czynienia sam problem zrobiłem wiele badań & Naprawiłem miejmy nadzieję, że pomaga

Creating .aar file for a project:

  1. For a library module, .aar file is automatically created by Android Studio. For a project with the any resource file or with the libraries, .aar file can be generated as mentioned in next steps.
  2. Check the plugin. It should be in as follows, change to library if it is in application, apply plugin: 'com.android.library'
  3. Open the open right border gradle bar and go to “your project”->Tasks->build and then double click on the assembleRelease. On Building the project, You will find the two .aar files(app-debug.aar and app-release.aar) inside app/build/outputs/aar/ directory. Using .aar file in your project:
  4. Get the “app-release.aar” file and paste it in the libs folder of your project. If libs folder is not present, create a directory named “libs” inside app directory.

  5. Add the following to the app gradle file, repositories { flatDir { dirs 'libs' } } dependencies { compile(name:'app-release', ext:'aar') }

  6. On sync, your project is ready to use the library files. Note : .aar gradle dependencies has to be added manually in your project app gradle Example:below

Wniebowzięcie błędów: System.err: java.lang.NoClassDefFoundError:

Rozwiązanie:

.aar gradle dependencies has to be added manually in your project app gradle

1

Odpowiedź dla "Update2 - 2017-09-14" - można po prostu zbudować plik tłuszcz AAR. który będzie zawierał wszystkie zależności, jedną rzeczą, którą będziesz musiał obsłużyć, jest konflikt w zależnościach, które mogą powodować problemy. również rozmiar tłuszczu może być ogromny. więc spróbuj.

0

Czy możesz spróbować jak poniżej?

  1. Wyłącz Instant Run i wyczyść kompilację swojego AAR.
  2. Zainstaluj go ponownie, gdziekolwiek jesteś gospodarzem swojego rocznego sprawozdania z działalności.
  3. Sprawdź ponownie aplikację, korzystając z AAR jako zależności.

Natychmiastowe uruchamianie czasami powoduje problem z powodu buforowania.

Edytuj: Do dodawania lokalnego AAR. Możesz śledzić odpowiedzi jak wspomniano here

1

Istnieją 3 sposoby, aby rozpowszechniać swoją bibliotekę:

  1. Tworzenie lokalnej biblioteki maven następnie rozprowadzić wygenerowany AAR.
    Możesz utworzyć lokalny dźwięk za pomocą Gradle Android Maven plugin. Jak to zrobić:

    a. Dodaj ścieżkę klasy wtyczki do korzeniabuild.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. Ustaw wtyczkę maven i dodaj nazwę grupy i wersji do biblioteki 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. Ustaw ID artefaktu jest ustawiony w settings.gradle:

    rootProject.name = 'yourlibraryname' 
    

    d. Zbuduj i zainstaluj bibliotekę w swoim lokalnym maven.
    można uruchomić ./gradlew zainstalować w folderze projektu lub użyj

    Gradle -> YourLibrary -> Pozostałe -> Zainstaluj z Androidem Studio (po prawej stronie Android Studio)

    e. Użyj zainstalowanej biblioteki bezpośrednio do swojego projektu.
    Można użyć biblioteki dodając mavenLocal() do korzenia build.gradle

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

    Następnie dodać zależność do projektu:

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

    Albo można skopiować wygenerowany .aar od lokalnego ścieżka maven.W Linuksie, można je dostać od /your/userpath/.m2/repository/ lub ~/.m2/repository/

  2. użyć tej samej techniki w liczbie 1, ale zrobić ścieżkę lokalną maven dla każdego komputera deweloper skierowaną do ~/.m2/repository/ centralnego.

  3. Użyj prywatnego repozytorium maven. Można użyć JFrog Artifactory oss lub Nexus Repository OSS

0

Spróbuj tego,

Wyłącz Natychmiastowa Run

Plik -> Ustawienia -> Build, Wykonanie, Deployment -> Błyskawiczne Run

jeśli tego nie robi Działaj, daj mi znać.