Das sind alle irgendwie hacky oder zu viel Arbeit, hier ist ein schönes n einfaches Beispiel (ironisch, denn es ist ein langer Post - aber es lohnt sich).
Es ist möglich, FireBase
Code in Ihrem Bibliotheksprojekt zu verwenden, natürlich muss die verbrauchende Anwendung die App registrieren und die App ID/google-services.json
Datei erhalten.
Aber Ihre Bibliothek ist nicht, und sollte nicht darum kümmern, es ist die aufwendige Anwendungen Job, nicht Ihre Bibliothek.
Hier ist ein kurzes Beispiel mit dem firebase-messaging
Modul in einem Bibliotheksprojekt.
Yourlibrary Moduls build.gradle:
// Other typical library set up
apply plugin: 'com.android.library'
android {
compileSdkVersion 27
defaultConfig {
minSdkVersion 16
targetSdkVersion 27
versionCode 1
versionName '1.0'
// Don’t for get your library’s proguard file!
consumerProguardFiles 'proguard-rules.pro'
}
}
ext {
currentFirebaseVersion = "11.8.0"
}
dependencies {
/*
Here we depend on the firebase messaging dependency (via compileOnly),
allowing us to use the FireBase API within our library module.
I exclude that org.json module because it may cause build warnings, this
step isn’t totally necessary.
NOTE: You should use `compileOnly` here so the dependency is
not added to the build output You will be allowed to use the
dependency in your library. If the consuming app wants to use firebase
they’ll need to depend on it (using `implementation`).
*/
compileOnly("com.google.firebase:firebase-messaging:$currentFirebaseVersion") {
exclude group: 'org.json', module: 'json'
}
}
// Other typical library set up. But nothing else relating Firebase.
Das ist alles, was Sie brauchen in Ihrer Bibliothek Projekt zu tun. NICHT wenden Sie das Gms-Plug-In hier an, und nicht Fügen Sie den Klassenpfad google-services zu den Bibliotheken build.gradle
hinzu.
Jetzt ist hier, wie Sie Ihre raubend App einrichten:
MyClientApp Top-Level-build.gradle:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google() // You know the drill...
}
// Any other set up you might have...
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
/*
Here in your client app’s top-level build.gradle you add the
google-services to the app’s classpath.
*/
classpath 'com.google.gms:google-services:3.2.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
// Other basic stuff...
allprojects {
apply plugin: 'maven'
apply plugin: 'maven-publish'
repositories {
jcenter()
google()
}
}
Jetzt müssen wir die nutzenden Anwendungen Modul build.gradle
einzurichten, es ist einfach. Wir müssen lediglich das Plug-in anwenden und hängen von dem von uns erstellten Bibliotheksmodul ab, das den gesamten FireBase
-Code enthält.
MyClientApp der Modulebene build.gradle:
buildscript {
repositories {
google()
mavenLocal()
}
}
apply plugin: 'com.android.application'
android {
compileSdkVersion 27
defaultConfig {
applicationId "com.your.application.that.can.use.firebase"
minSdkVersion 16
targetSdkVersion 27
versionCode 1
versionName '1.0'
}
//other typical set up
}
ext {
currentFirebaseVersion = "11.8.0"
}
dependencies {
implementation('com.your.library:YourLibrary:[email protected]') {
transitive = true
// Use the consuming application's FireBase module, so exclude it
// from the dependency. (not totally necessary if you use compileOnly
// when declaring the dependency in the library project).
exclude group: 'com.google.firebase'
// Exclude the "plain java" json module to fix build warnings.
exclude group: 'org.json', module: 'json'
}
implementation("com.google.firebase:firebase-messaging:$currentFirebaseVersion") {
// Exclude the "plain java" json module to fix build warnings.
exclude group: 'org.json', module: 'json'
}
}
// Needs to be at the bottom of file.
apply plugin: 'com.google.gms.google-services'
Einige Dinge zu beachten:
- Muss Google-Dienste Plugin am Boden gilt (nur im Client-Modul
build.gradle
).
- Abhängig von dem Bibliotheksmodul, das den Code
FireBase
enthält, aber es ist die Version des Moduls FireBase
zugunsten Ihrer eigenen Abhängigkeitsversion auszuschließen.
- App hängt von der eigenen
FireBase
Version ab.
classpath 'com.google.gms:google-services:3.1.1’
geht nur in der obersten Ebene der Client-App build.gradle
.
- Natürlich müssen Sie die Client-App registrieren und die
google-services.json
in das Projekt Ihrer Client-App einfügen.
- definieren die notwendigen
Firebase
Service
s in Manifest Ihrer App (oder manifest Fusion sie von Ihrem Bibliotheksprojekt in verwenden und fusionieren)
- Fügen Sie den
google_play_services_version
Meta-Daten-Tag auf Ihren Client App-Manifest.
- Die Bibliothek kann/sollte
compileOnly
bei der Deklaration der FireBase
Abhängigkeit verwenden.
Jetzt werden Sie in der Lage sein FireBase
Code in Ihrer Anwendung zu verwenden, die Sie in Ihrer Bibliothek definiert, die FireBase
verwendet. Oder Sie könnten Ihr Bibliotheksmodul alle FireBase
arbeiten lassen!
Natürlich wird dies normalerweise für interne Bibliotheken verwendet, da Frameworks wie Firebase
nicht entworfen wurden, um in Bibliotheksmodulen implementiert zu werden, aber manchmal müssen Sie dies tun, also ist dies eine einfache nicht-hacky/vernünftige Lösung für das Problem. Es kann auf Projekten verwendet werden, die über Maven verteilt werden - meine Bibliothek verwendet dies und es hat nie irgendwelche Probleme verursacht.
Update:
sollten Sie compileOnly
verwenden, wenn die Bibliothek des Moduls Firebase
Abhängigkeit deklarieren. Dadurch wird die Abhängigkeit nicht zur Build-Ausgabe hinzugefügt. Aber Sie können die Abhängigkeit in Ihrer Bibliothek verwenden. Wenn die konsumierende App firebase verwenden möchte, muss sie sich manuell darauf verlassen (unter Verwendung von implementation
). Dies wird helfen, unnötige Abhängigkeiten/Aufblähungen in Anwendungen zu reduzieren und den "richtigen" Weg, eine Abhängigkeit wie diese zu deklarieren. Hinweis: Sie müssen möglicherweise Laufzeitprüfungen durchführen, um sicherzustellen, dass die Bibliothek verfügbar ist, bevor Sie den Code in Ihrem Modul verwenden.
Ich würde dies denken, indem Sie die App-ID in die Bibliothek über eine Initialisierung der Bibliothek von Ihrem Haupt-App übergeben. –
Hey @Sekai, wenn meine Antwort Ihr Problem gelöst hat, bitte markieren Sie es als akzeptiert (SO-Richtlinie) –