如何在库模块中使用不同的软件包名称进行调试和发布?

时间:2018-10-04 05:01:35

标签: android firebase gradle

简短问题

如何更改库模块中 debug release 构建类型的软件包名称?

上下文

在具有MVP + Clean架构的Android项目中,我们在库模块中具有存储库模式。我们希望将Firebase包含在具有两个环境(开发和生产)的该库中。

我已经在Firebase中创建了项目(com.example.comcom.example.com.dev,然后将相应的google-services.json下载到src / main和src / debug文件夹中。

Gradle google-services 插件使用 google-services.json 中定义的客户端ID验证模块软件包名称,但Android限制更改{{1} }在图书馆中(我找不到技术原因)

我尝试过的事情

  • 具有两个具有不同包属性的AndroidManifest.xml。 src / main中的applicationId和src / debug /中的com.example.com,但是第二个只是被忽略
  • 在Gradle sourceSets中设置com.example.com.dev。我运行manifest.srcFile时文件在列表中,但包名称没有改变
  • 库模块中有两种不同的样式,并且为每种样式设置了不同的清单。该软件包仍然不会更改。

目前,我只有两种合适的解决方案: 1.将Firebase的设置和实施保留在资源库外部的app模块中。 2. Firebase只有一个环境。

非常感谢您的帮助或建议。

EDIT

请考虑我需要在模块(库)中而不是在应用程序中修改软件包。由于某些奇怪的原因,当我尝试在模块中使用./gradlew sourceSetsapplicationIdSuffix时,Gradle会显示此错误:

错误:库项目无法设置applicationIdSuffix。

3 个答案:

答案 0 :(得分:1)

图书馆项目无法设置applicationId。

这是Android Library项目的设计行为。

  

库模块中有两种不同的样式,并且设置不同   每个清单。该软件包仍然不会更改。

可能您需要将 Build Variants 更改为特定的口味/内部类型,然后才能看到更新的软件包名称生效。

请参见以下屏幕截图。

enter image description here

答案 1 :(得分:0)

另一个解决方案是使用applicationIdSuffix是productFlavors中的build.gradle文件。 像这样:

android {
    compileSdkVersion 27
    dataBinding.enabled = true
    defaultConfig {
        applicationId "com.iftalab.vista"
        minSdkVersion 19
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        flavorDimensions "default"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt')
        }
    }

    productFlavors {
        main {
            applicationIdSuffix ".main"
        }
        admin {
            applicationIdSuffix ".admin"
        }
    }
}

答案 2 :(得分:0)

我花了一些时间研究并尝试不同的替代方法,以在库模块中针对每种口味或构建类型获得两种不同的包名称,我的简短答案是:您不能,至少没有这样做棘手和肮脏的东西。

一些建议使用参数applicationIdSuffixapplicationId的人,该选项不起作用,因为库模块的设计将这些参数限制为app模块。在库中,必须在清单中定义包必须

该限制将选项限制为口味,但是清单中的package属性未合并,并且scr/main/AndroidManifest.xmlsrc/flavor/AndroidManifest.xml具有不同的包名称时,您会收到错误消息。

一个棘手的解决方案是从任务名称中获取当前选择的风味,然后更改sourceSets中的主清单。

sourceSets {
    main {
        manifest.srcFile "src/$flavor_name/AndroidManifest.xml"
    }
}

这种黑客手段行之有效,但总的来说是个坏主意,我更喜欢更改架构设计,并以不同的方式实现两个Firebase变体的存储库。

Gradle插件:3.2.0