4 votes

Bibliothèque Android indépendante avec Google Analytics

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 !

0voto

Dmitry Zaitsev Points 7119

buildscript sont les dépendances de votre script de construction lui-même, et non les dépendances de votre bibliothèque. C'est pourquoi il n'est pas inclus dans votre version finale.

Vous pouvez résoudre ce problème en ajoutant votre classpath à l'application également.

buildscript {
    dependencies {
        classpath 'com.google.gms:google-services:3.1.0'
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X