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
scanner.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 AAR
scanner.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'
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
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:
- 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.
- 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'
- 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:
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.
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')}
- 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
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.
Il y a 3 façons de distribuer votre bibliothèque:
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/
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/
.
Utilisez un référentiel Maven privé . Vous pouvez utiliser JFrog Artifactory oss ou Nexus Repository OSS
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')
...
}
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.
Pouvez-vous essayer comme ci-dessous?
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