Использование Firebase в многомодульном проекте - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть многомодульный Android-проект с несколькими вкусами, модули следующие:

  1. core модуль, который представляет собой библиотеку Android, в которой хранятся обычные вещи, в том числе библиотечные зависимости. *Модуль 1005 *
  2. authentication, который, как следует из названия, является модулем, который содержит множество действий пользовательского интерфейса и отвечает за аутентификацию пользователей.Это также модуль с активностью запуска.
  3. user модуль, который является еще одним модулем библиотеки Android.Он отвечает за обработку пользовательского интерфейса профиля пользователя, пользовательских данных, а также базы данных Firebase.Но он также должен иметь дело с аутентификацией Firebase, чтобы получить Uid, поскольку он используется в качестве ключа в базе данных.
  4. Другие модули, которые сейчас не имеют отношения к делу

Модуль core делаетничего в отношении Firebase, кроме как просто включить его в качестве зависимости для других модулей.Так что у меня есть это в моем проекте build.gradle:

dependencies {
    classpath 'com.android.tools.build:gradle:3.2.0'
    classpath 'com.google.gms:google-services:4.1.0'
}

, и у меня также это есть в моем ядре build.gradle:

apply plugin: 'com.android.library'
apply plugin: 'com.google.gms.google-services'

android {
    compileSdkVersion 28
    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        otherstuff
    }
    otherStuff
}

dependencies {
    otherStuff
    api 'com.google.android.gms:play-services-base:16.1.0'
    api 'com.google.firebase:firebase-core:16.0.6'
    api 'com.google.firebase:firebase-auth:16.1.0'
    api 'com.google.firebase:firebase-database:16.0.6'
    api 'com.google.firebase:firebase-storage:16.0.5'
    api 'com.hbb20:ccp:2.2.3'
    api 'com.google.android.libraries.places:places:1.0.0'
}

Модуль user ничего не делает, кроме импорта библиотеки core и немедленного использования аутентификации.Итак, у моего пользователя build.gradle есть следующее:

dependencies {
    otherStuff
    implementation project(':core')
}

, а затем я продолжаю использовать его в своих классах следующим образом:

FirebaseAuth auth = FirebaseAuth.getInstance();

boolean isLoggedIn()
{
    assert(auth != null);
    return (auth.getCurrentUser() != null);
}

void uploadUserImpl()
{
    assert(isLoggedIn());
    db.getReference("users").child(auth.getCurrentUser().getUid()).setValue(this);
}

etc

Модуль authentication - это тот, который определяет имя приложения, активность средства запуска и т. Д. Так что, по моему мнению, по крайней мере, это также тот, который должен иметь файл google-services.json.Так что он находится в папке authentication.

Он включает в себя библиотеки core и user, поэтому в моей аутентификации build.gradle у меня есть следующее:

dependencies {
    otherStuff
    implementation project(':core')
    implementation project(':user')
}

Он также продолжает использовать проверку подлинности Firebase для входа в систему и регистрации пользователей.

Теперь с проблемой:

При попытке построить проект я получаю следующую ошибку:

File google-services.json is missing. The Google Services Plugin cannot function without it. 
 Searched Location: 
/work/mewais/CompanyName/ProjectName/core/src/FlavorName/debug/google-services.json
/work/mewais/CompanyName/ProjectName/core/google-services.json

и если я пытаюсь скопировать google-services.json в core, я получаю следующую ошибку:

No matching client found for package name 'com.companyname.projectname.core'

в файле google-services.json определено имя приложениявнутри него:

"package_name": "com.companyname.projectname.appname"

, который, очевидно, ожидает имя приложения, а не core.

Так как включить Firebase в этот параметр?Я хочу сохранить зависимости firebase, определенные внутри core, потому что несколько модулей будут использовать его.В то же время, authentication - это тот, который на самом деле определяет appname, а также тот, у которого есть активность запуска, в которой я начинаю использовать Firebase.Я также ожидаю, что user и любые другие модули смогут использовать Firebase после этого.Мне не имеет смысла регистрировать все модули в Firebase (даже не уверен, возможно ли это, поскольку Firebase ожидает приложение, а не библиотеку ?!).Так есть ли способ исправить эту проблему?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

вы можете поместить файл google-services.json в кодировку аромата, чтобы использовать: -

отметьте эту ссылку

android {
 // set build flavor here to get the right gcm configuration.
    //def myFlavor = "flavor1"
    def myFlavor = "flavor2"

    if (myFlavor.equals("flavor1")) {
        println "--> flavor1 copy!"
        copy {
            from 'src/flavor1/'
            include '*.json'
            into '.'
        }
    } else {
        println "--> flavor2 copy!"
        copy {
            from 'src/flavor2/'
            include '*.json'
            into '.'
        }
    }

    // other stuff
    }
0 голосов
/ 01 февраля 2019

Мне удалось обернуть зависимости Firebase в модуль библиотеки, не загрязняя основной модуль.Вот что я сделал: плагин

google-play-services требует, чтобы модуль, который включает его, имел applicationId и его файл JSON (или он не будет компилироваться).

Если вы уверены, что не используете специальные функции, которые предоставляет плагин google-play-services, вы можете удалить их.

https://developers.google.com/android/guides/google-services-plugin

Тогда вы можете следовать этомуИнструкция статьи:

https://medium.com/@samstern_58566/how-to-use-firebase-on-android-without-the-google-services-plugin-93ecc7dc6c4

...