代码之家  ›  专栏  ›  技术社区  ›  alexm

无法将firebase与具有口味和维度的即时应用程序连接[重复]

  •  2
  • alexm  · 技术社区  · 6 年前

    我刚刚将我的应用程序转换为即时应用程序,问题是它的设置有点复杂,因为我有3个维度:

    1. 经验

        - instant
        - installed
      
    2. 类型

        - demo
        - controlled
        - user
      
    3. 调整

        - normal
        - perf
      

    因此,到instant app的转换过程并非一帆风顺,必须添加一些渐变代码来忽略一些口味的排列,为构建变体设置源代码和清单位置,处理不同清单中活动的深层链接,以及我设法解决的一系列问题。除了firebase之外,一切似乎都很好。

    我想了解firebase是如何路由google服务的。json文件,如何设置不同的位置或如何使其重复文件或其他内容。

    当我添加firebase和google服务时。json文件到安装目录,我得到以下错误:

    文件谷歌服务。缺少json。Google服务插件无法

    function without it. 
     Searched Location: 
    myapp_project/base/src/feature/instant/user/normal/release/google-services.json
    ... and so on with other flavors and combinations
    

    这对我来说没有太大意义,因为目录树结构的格式不好。我的目录树如下:

    - myapp_project
       - base
          - src
              - controlled
              - demo
              - main
              - user
              - userNormal
              - userPerf
       - installed
       - instant 
    

    我尝试创建所需的目录,并将文件添加到所有目录中。然后它可以完美地编译,但它没有连接到firebase。 使现代化 在这件事上,我意识到gradle在许多目录中搜索了该文件,但其中有我的“基本”目录,所以只添加了google服务。json文件现在可以编译,无需为每个目录创建文件。我还将文件中的包字符串更改为。使其不会抛出包未找到错误。但是,它仍然编译得很好,但无法连接到firebase服务器。

    基本渐变文件

    apply plugin: 'com.android.feature'
    apply plugin: 'kotlin-android'
    
    import org.apache.tools.ant.taskdefs.condition.Os
    
    android {
    
        baseFeature true
    
        compileSdkVersion 28
        buildToolsVersion '28.0.3'
        defaultConfig {
            minSdkVersion 21
            targetSdkVersion 28
            testInstrumentationRunner 
            "android.support.test.runner.AndroidJUnitRunner"
        }
    
        def keystoreProperties = Os.isFamily(Os.FAMILY_WINDOWS) ?
            "KeyStoreWin.properties" : "KeyStore.properties"
        Properties props = new Properties()
        props.load(new FileInputStream(file(project.property(keystoreProperties))))
    
        signingConfigs {
            storeSignature {
                storeFile file(props['KEYSTORE'])
                storePassword props['KEYSTORE_PASSWD']
                keyAlias props['KEYSTORE1']
                keyPassword props['KEYSTORE_PASSWD1']
            }
        }
    
        buildTypes {
            debug {
                debuggable true
            }
            release {
                signingConfig signingConfigs.storeSignature
                debuggable false
                shrinkResources true
                minifyEnabled true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                renderscriptDebuggable false
            }
         }
    
         flavorDimensions "experience", "type", "adjustment"
         productFlavors {
             instant {
                 dimension "experience"
                 versionCode 1
             }
             installed {
                 dimension "experience"
                 versionCode 2
             }
             user {
                 dimension "type"
             }
             demo {
                 dimension "type"
             }
             controlled {
                 dimension "type"
             }
             normal {
                 dimension "adjustment"
             }
             perf {
                 dimension "adjustment"
             }
         }
    
         variantFilter { variant -> def names = variant.flavors*.name
             if (names.contains("controlled") && names.contains("perf")) {
                 setIgnore(true)
             }
             if (names.contains("demo") && names.contains("perf")) {           
                 setIgnore(true)
             }
             if (names.contains("user") && names.contains("perf") &&
                variant.buildType.name == 'debug') {       
                 setIgnore(true)
             }
             if (names.contains("instant") && names.contains("perf")) {
                 setIgnore(true)
             }
             if (names.contains("instant") && names.contains("demo")) {           
                 setIgnore(true)
             }
             if (names.contains("instant") && names.contains("controlled")) {
                 setIgnore(true)
             }
        }
    
        sourceSets {
            instantUserNormal {
                java.srcDirs = ['src/userNormal/java', 'src/userNormal/java/']
                res.srcDirs = ['src/userNormal/res', 'src/userNormal/res/']
                manifest.srcFile 'src/userNormal/AndroidManifest.xml'
            }
            installedUserNormal {
                java.srcDirs = ['src/userNormal/java', 'src/userNormal/java/']
                res.srcDirs = ['src/userNormal/res', 'src/userNormal/res/']
                manifest.srcFile 'src/userNormal/AndroidManifest.xml'
            }
            installedUserPerf {
                java.srcDirs = ['src/userPerf/java', 'src/userPerf/java/']
                res.srcDirs = ['src/userPerf/res', 'src/userPerf/res/']
                manifest.srcFile 'src/userPerf/AndroidManifest.xml'
            }
        }
        defaultConfig {
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
    
        packagingOptions {
            exclude 'META-INF/proguard/androidx-annotations.pro'
        }
    }
    
    repositories {
        google()
        maven { url "https://jitpack.io" }
        mavenCentral()
    }
    
    
    dependencies {
       implementation fileTree(include: ['*.jar'], dir: 'libs')
       ... all dependencies here
    }
    
    apply plugin: 'kotlin-android-extensions'
    apply plugin: 'com.google.gms.google-services'
    

    已安装梯度:

    import org.apache.tools.ant.taskdefs.condition.Os
    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 28
        buildToolsVersion '28.0.3'
    
        defaultConfig {
             applicationId "com.domain.myapp"
             minSdkVersion 21
             targetSdkVersion 28
             testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
    
        def keystoreProperties = Os.isFamily(Os.FAMILY_WINDOWS) ?
            "KeyStoreWin.properties" : "KeyStore.properties"
        Properties props = new Properties()
        props.load(new 
        FileInputStream(file(project.property(keystoreProperties))))
    
        signingConfigs {
            storeSignature {
                storeFile file(props['KEYSTORE'])
                storePassword props['KEYSTORE_PASSWD']
                keyAlias props['KEYSTORE_UPS']
                keyPassword props['KEYSTORE_UPS_PASSWD']
            }
        }
    
        buildTypes {
            debug {
                debuggable true
                versionNameSuffix "v1d"
            }
            release {
                signingConfig signingConfigs.storeSignature
                debuggable false
                versionNameSuffix "v1r"
                shrinkResources true
                minifyEnabled true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                renderscriptDebuggable false
            }
        }
    
        flavorDimensions "experience", "type", "adjustment"
        productFlavors {
            instant {
               dimension "experience"
            }
            installed {
               dimension "experience"
            }
            user {
               dimension "type"
            }
            demo {
               dimension "type"
               applicationIdSuffix ".demo"
            }
            controlled {
               dimension "type"
               applicationIdSuffix ".controlled"
            }
            normal {
               dimension "adjustment"
            }
            perf {
               dimension "adjustment"
            }
        }
    
        variantFilter { variant -> def names = variant.flavors*.name
             if (names.contains("controlled") && names.contains("perf") {
                 setIgnore(true)
             }
             if (names.contains("demo") && names.contains("perf")) {            
                 setIgnore(true)
             }
             if (names.contains("user") && names.contains("perf") && variant.buildType.name == 'debug') {
                 setIgnore(true)
             }
             if (names.contains("instant") && names.contains("perf")) {
                 setIgnore(true)
             }
             if (names.contains("instant") && names.contains("demo")) {         
                 setIgnore(true)
             }
             if (names.contains("instant") && names.contains("controlled")) {
                 setIgnore(true)
             }
        }
    
        packagingOptions {
                exclude 'META-INF/proguard/androidx-annotations.pro'
        }
    }
    
    repositories {
        google()
        maven { url "https://jitpack.io" }
        mavenCentral()
    }
    
    dependencies {
         implementation project(':base')
    }
    

    更新2 我的日志显示以下错误:

    E/FA: GoogleService failed to initialize, status: 10, Missing google app id value from from string resources with name google_app_id.
    E/FA: Missing google_app_id. Firebase Analytics disabled. See https....
    

    但是,google\u app\u id存在于生成目录自动生成的值中。每个构建变量的xml文件

    如何解决此问题?

    已解决更新3 我不得不在基础上应用firebase插件两次,并安装了gradle文件。如其中一条评论中分享的帖子所示。

    apply plugin: 'com.google.gms.google-services'
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   dazza5000    6 年前

    这个插件告诉你它在哪里搜索谷歌服务。json文件。您是否能够在指定的位置放置正确的文件?拥有相同或不同的谷歌服务是可以的。json文件的不同变体。