Android Google Play Store免费版和完整版应用程序在不同的软件包中;如何避免重复将来的更改?

Android Google Play Store免费版和完整版应用程序在不同的软件包中;如何避免重复将来的更改?,android,android-studio,google-play,Android,Android Studio,Google Play,我的情况是,我想要同一个Google Play Store(GPS)应用程序的免费版和完整版。为了满足全球定位系统的需求,我可以选择为应用程序内购买制定全球定位系统API,或者创建第二个软件包。我选择了后一种方法,因为前一种方法很难遵循(在尝试了3天的部分时间后无法实现) 在意识到需要第二个包之前,我设计了这个应用程序,这样只要更改两个导入(包名)、一个布尔赋值(FREE:true或false)和几行AndroidManifest.xml(图标和应用程序名),我就可以轻松地将代码从FREE更改为

我的情况是,我想要同一个Google Play Store(GPS)应用程序的免费版和完整版。为了满足全球定位系统的需求,我可以选择为应用程序内购买制定全球定位系统API,或者创建第二个软件包。我选择了后一种方法,因为前一种方法很难遵循(在尝试了3天的部分时间后无法实现)

在意识到需要第二个包之前,我设计了这个应用程序,这样只要更改两个导入(包名)、一个布尔赋值(FREE:true或false)和几行
AndroidManifest.xml
(图标和应用程序名),我就可以轻松地将代码从FREE更改为full,然后再重新更改

一切都很好。然后是第一个bug:actionbar溢出的“破折号”并没有出现在平板电脑上

所以我有两大块99%相同的java和xml代码。当我发现将来需要更改代码时,我不想做两个可能相同的更改。弄清楚GPS API不太可能很快进入我的大脑

在发帖前尝试回答我自己的问题时,我只是遇到了这个问题,没有进一步解释:

我使用Android库构建我的应用程序的免费/付费版本。[使用]新的渐变构建变体概念。。。现在,您可以使用同一代码自动构建不同的已签名APK

它获得了一张赞成票,但这并不意味着它可信

是吗

如果是,我也不确定它是否适用于我。当我在同一个软件包中进行前面提到的更改时,GPS发出的信息是,我需要为免费和完整版本提供不同的软件包名称,这句话没有提到软件包,尽管这可能是针对不同软件包的一种方式。我希望我知道

如果这句话适用于让一个软件包将一个应用程序的两个版本上传到GPS,我该怎么做才能让gradle这么做呢

编辑--


在我找到之前,我确信没有办法。这是一种避免几乎重复的应用程序和软件包的方法吗?

是的,构建变体可以解决您的问题

首先,我建议阅读Android工具网站上的

你最终想要的是两种产品口味。在每个产品风味闭包中,您可以为该风味指定
applicationId
(以前是
packageName
)。您的build.gradle将如下所示:

productFlavors {
    paid {
        applicationId "com.example.paid"
    }

    free {
        applicationId "com.example.free"
    }
}
当您构建应用程序时,您现在将获得一个APK,其中包含产品风格和构建类型的所有可能组合。这些称为构建变体。对于您的应用程序,您可能会得到类似于
debugFree
debugPaid
releaseFree
releasepayed
变体的结果

当你想发布时,你只需将
releaseFree
releasepayed
apk上传到Google Play(作为单独的应用程序)

关于您的代码重复问题: 当您创建一个新的产品风格或构建类型时,您可以创建一组源文件(资源、Java类等)来配合该风格

默认情况下,所有代码都进入
main
源代码集中(这是项目中的
main
文件夹)

如果您想添加一些为
free
变体提供不同功能的Java类,可以将这些类放在
/app/src/free/Java
而不是
/app/src/main/Java


例如,您可以在免费和付费文件夹中放置一个包含布尔标志的
类。每当您在代码中引用
风味常数
时,对于当前在您的设备上运行的任何一种风味,它都将是正确的
风味常数。

是的,构建变体是您问题的答案

首先,我建议阅读Android工具网站上的

你最终想要的是两种产品口味。在每个产品风味闭包中,您可以为该风味指定
applicationId
(以前是
packageName
)。您的build.gradle将如下所示:

productFlavors {
    paid {
        applicationId "com.example.paid"
    }

    free {
        applicationId "com.example.free"
    }
}
当您构建应用程序时,您现在将获得一个APK,其中包含产品风格和构建类型的所有可能组合。这些称为构建变体。对于您的应用程序,您可能会得到类似于
debugFree
debugPaid
releaseFree
releasepayed
变体的结果

当你想发布时,你只需将
releaseFree
releasepayed
apk上传到Google Play(作为单独的应用程序)

关于您的代码重复问题: 当您创建一个新的产品风格或构建类型时,您可以创建一组源文件(资源、Java类等)来配合该风格

默认情况下,所有代码都进入
main
源代码集中(这是项目中的
main
文件夹)

如果您想添加一些为
free
变体提供不同功能的Java类,可以将这些类放在
/app/src/free/Java
而不是
/app/src/main/Java


例如,您可以在免费和付费文件夹中放置一个包含布尔标志的
类。每当您在代码中引用
FlavorConstants
时,对于当前在您的设备上运行的任何一种口味,它都是正确的
FlavorConstants

是的,这个答案是可信的。如果Gradle对你来说像是黑魔法,那就学一点“Groovy”。这就是Gradle用于脚本的语言。听起来你的谷歌搜索正在为你提供你需要的答案。你有没有尝试过实现你发现的任何东西?@ianhanniballake——我正在研究下面的答案,并阅读我发布的链接。我会得到这个,但可能不得不