TL;DR
Est-il possible de compiler Google Analytics dans le module de bibliothèque sans l'aide du module d'application ?
Cela fait plus d'une semaine que je me demande comment compiler et utiliser GoogleAnalytics dans ma bibliothèque.
Les objectifs sont les suivants 1. Compiler et exécuter GoogleAnalytics dans la bibliothèque Android 2. Maintenir un contexte d'application (Singletone ? )
Voici comment j'essaie de compiler GoogleAnalytics dans le fichier build.gradle de ma bibliothèque
buildscript {
ext {
support = '27.0.2' // https://developer.android.com/topic/libraries/support-library/revisions.html
kotlin = '1.2.20' // https://kotlinlang.org/docs/reference/using-gradle.html
playServices = '11.8.0'
}
repositories {
google()
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin"
classpath 'com.google.gms:google-services:3.1.0'
}
}
Et le code qui gère toutes les analyses :
class GenericSettingsAnalytics private constructor(context : Context) {
private val tracker = GoogleAnalytics.getInstance(context).newTracker(R.xml.global_tracker)
companion object {
private var instance : GenericSettingsAnalytics? = null
fun getInstance(context: Context) : GenericSettingsAnalytics {
if (instance == null) {
instance = GenericSettingsAnalytics(context)
instance!!.sendInitAnalytics(context)
}
return instance!!
}
}
fun sendEvent(category: String, action: String) {
tracker.send(HitBuilders.EventBuilder().setCategory(category).setAction(action).build())
}
fun sendInitAnalytics(context: Context) {
tracker.send(HitBuilders.EventBuilder()
.setCategory(ANALYTICS_CATEGORIES.CATEGORY_APP_INFO.categoryName)
.setAction(ANALYTICS_ACTIONS.ACTION_APP_INIT.actionName)
.setLabel(context.packageName)
.build())
}
}
Très simple. Tout fonctionne parfaitement en debug, mais lors de l'upload de la librairie vers bintray (pour utiliser la compilation officielle) j'obtiens l'exception suivante :
FATAL EXCEPTION: main
Process: com.udioshi85.genericsettings, PID: 12398
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/analytics/GoogleAnalytics;
at com.oshi.libgenericsettings.GenericSettingsAnalytics.<init>(GenericSettingsAnalytics.kt:14)
at com.oshi.libgenericsettings.GenericSettingsAnalytics.<init>(GenericSettingsAnalytics.kt:12)
at com.oshi.libgenericsettings.GenericSettingsAnalytics$Companion.getInstance(GenericSettingsAnalytics.kt:22)
at com.oshi.libgenericsettings.GenericSettingsLib$Companion.initAnalytics(GenericSettingsLib.kt:20)
at com.oshi.libgenericsettings.GenericSettingsLib$Companion.init(GenericSettingsLib.kt:16)
at com.oshi.genericsettings.GenericSettingsApp.onCreate(GenericSettingsApp.kt:10)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1119)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5827)
at android.app.ActivityThread.-wrap1(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1673)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:172)
at android.app.ActivityThread.main(ActivityThread.java:6637)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.analytics.GoogleAnalytics"
Quelques réflexions :
Dans ma bibliothèque build.gradle, j'ajoute le classpath suivant :
buildscript {
....
dependencies {
classpath 'com.google.gms:google-services:3.1.0'
}
}
Est-ce correct ?
La plupart des bibliothèques courantes demandent à leurs utilisateurs d'utiliser la bibliothèque à partir d'une classe d'application. Quelque chose comme
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
MyLibrary.init(this)
}
}
J'ai déjà essayé, mais j'obtiens toujours la même exception. Peut-être que je fais quelque chose de mal ?
Enfin, j'ai vu et lu beaucoup d'exemples sur la façon d'intégrer GoogleAnalytics. L'important est que mes utilisateurs ne doivent rien ajouter dans leur build.gradle à part ma bibliothèque de compilation/implémentation.
J'apprécierais que quelqu'un puisse m'aider à ce sujet.
Merci beaucoup !