Firebase 2.0 - 如何处理Android应用程序的多种风格(环境)?

时间:2016-05-26 14:01:18

标签: android firebase google-cloud-platform

我的应用程序有多种口味。我应该如何设置这个服务器端?我的包名是:

com.example.app(制作) com.example.app.staging(分期) com.example.app.fake(假)

这应该是firebase控制台中的3个独立项目吗?

3 个答案:

答案 0 :(得分:24)

很大程度上,这取决于您希望项目的工作方式。您可以在同一控制台中设置所有三个,也可以设置为两个或更多不同的项目。这两个选项都有效。

同一项目的好处:

  • 共享相同的结算,配额,权限和服务(数据库,存储,FCM等)。
  • 与生产相同的环境。

不同项目的好处:

  • 没有覆盖生产数据或影响生产用户的风险。

如果使用多个项目,您可以利用build types支持,这将允许您为不同版本提供不同的google-services.json文件。如果使用一个项目,相同的google-services.json将适用于所有品种。

注意:正如CodyMace在评论中所说的那样 - 每次添加应用时都要记得重新下载JSON文件!

在任何一种情况下,您都可以采取一些措施来降低风险(例如,在您的数据库中使用dev / stage / prod / keys,并在下面有类似的结构),但对您来说有意义的主要是权衡。

如果您刚刚开始,我建议您在开发过程中从一个项目开始,一旦启动,请考虑将开发环境转移到单独的项目中。分期可以是两种方式。

答案 1 :(得分:3)

注意我还没有完全尝试这个,但是在此记录它是为了在我达到它之前不会丢失它。

实际上并没有强制使用gradle插件,这会强制您为所有风格和构建类型创建一个firebase项目。

这个文档记录很少,但可以在FirebaseApp的文档顶部找到提示,在https://firebase.google.com/docs/configure/处找到更多提示

  

或者,initializeApp(Context,FirebaseOptions)初始化默认的app实例。应该从Application调用此方法。如果在应用程序的主要过程之外使用它,这也是必要的。

因此,像往常一样抓取google-services.json,然后从mobilesdk_app_idcurrent_keyapi_key下)获取,这应该是Google Analytics跟踪所需的全部内容。使用该信息在您的应用程序的Application子类中运行以下内容,以获取您需要的变体:

FirebaseOptions options = new FirebaseOptions.Builder()
  .setApplicationId("<mobilesdk_app_id>")
  .setApiKey("<current_key>")
  .build();
FirebaseApp.initializeApp(this, options);

答案 2 :(得分:0)

如果您想知道如何将 google-services.json 用于不同的 Firebase 后端。 首先将所有相关的 json 文件放在单独的文件夹中,例如:

...src/dev/google-services.json ...src/prod/google-services.json

当构建任务运行到根目录时,您需要根据应用级 gradle 文件中的风格将文件移动

像这样:

android{
...
    def flavourName = getCurrentFlavor()
        delete 'google-services.json'
        clean
        if (flavourName == "development") {
            copy {
                from 'src/dev/'
                include '*.json'
                into '.'
            }
        } else if (flavourName == "stagging") {
            copy {
                from 'src/dev/'
                include '*.json'
                into '.'
            }
        } else if (flavourName == "production") {
            copy {
                from 'src/prod/'
                include '*.json'
                into '.'
            }
        } else {
            println("NA")
        }

}

这里的 getCurrentFlavor() 定义为->

def getCurrentFlavor() {
    Gradle gradle = getGradle()
    String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()

    Pattern pattern
    println tskReqStr

    if (tskReqStr.contains("assemble"))
        pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
    else
        pattern = Pattern.compile("generate(\\w+)(Release|Debug)")

    Matcher matcher = pattern.matcher(tskReqStr)

    if (matcher.find())
        return matcher.group(1).toLowerCase()
    else {
        println "NO MATCH FOUND"
        return ""
    }
}