- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我曾经有以下项目风格:
最初唯一的区别是 applicationId/packageName
。现在有一个不同的 java 文件。确切地说,是一个自定义的 ArrayAdapter。解决方案是创建 src/Apple
和 src/Orange
并且都继承自 src/main
。我从 src/main
中删除了 java 文件,并将副本放入 src/Apple
和 src/Orange
并进行了适当的修改。世界上一切都很好。
快进几周,现在 Apple 和 Orange 之间大约有 10 个 java 文件不同。再次......没什么大不了的。易于处理。将 src/Apple
和 src/Orange
中的 java 文件分开。
快进到今天。我需要稍微修改一下,因为我想拥有每个版本的免费和高级版本。免费版和高级版仅在 URL 上有所不同。我打算简单地创建新类型,称为:
但我有一个难题。从现在开始 src/Apple
和 src/Orange
有 10 个不同的文件已更改...如果我更改 AppleFree
中的任何 java 文件,我必须确保我在 ApplePremium
中也这样做。我有点处于十字路口,希望我的问题在这一点上是有道理的。我提出了三种可能的解决方案,但我不确定我将如何实现它们/正确的方法是什么/解决方案不是我想要的。
使用 if 语句if (BuildConfig.FLAVOR==appleFree) {//使用免费网址} else {//使用高级网址}
问题: 两个 Url 在技术上都编译到 apk 中。我不想要这个。
让 src/AppleFree 和 src/ApplePremium 以某种方式从 src/Apple 父目录继承。
问题:不知道该怎么做。
像这样在 build.gradle 中添加免费和高级网址吗?
productFlavors {
appleFree {
applicationId "com.example.apple.free"
versionName "1.0"
url "http://freeurl.com"
versionCode 1
}
applePremium {
applicationId "com.example.apple.premium"
versionName "1.0"
url "http://premiumurl.com"
versionCode 1
}
orangeFree {
applicationId "com.example.orange.free"
versionName "1.0"
versionCode 1
url "http://freeurl.com"
}
orangePremium {
applicationId "com.example.orange.premium"
url "http://premiumurl.com"
versionName "1.0"
versionCode 1
}
}
问题:不确定如何实现。
任何提示都是有帮助的。
编辑:
flavorGroups 'fruit', 'paid'
productFlavors {
apple {
flavorGroup 'fruit'
}
orange {
flavorGroup 'fruit'
}
free {
flavorGroup 'paid'
}
premium {
flavorGroup 'paid'
}
appleFree {
applicationId "com.example.apple.free"
versionName "1.0"
buildConfigField 'String', 'BASE_URL', 'http://freeurl.com'
versionCode 1
}
applePremium {
applicationId "com.example.apple.premium"
versionName "1.0"
buildConfigField 'String', 'BASE_URL', 'http://premiumurl.com'
versionCode 1
}
orangeFree {
applicationId "com.example.orange.free"
versionName "1.0"
versionCode 1
buildConfigField 'String', 'BASE_URL', 'http://freeurl.com'
}
orangePremium {
applicationId "com.example.orange.premium"
buildConfigField 'String', 'BASE_URL', 'http://premiumurl.com'
versionName "1.0"
versionCode 1
}
}
最佳答案
您的问题有很多可能的解决方案。最原生的 Gradle 解决方案是使用 Flavor Dimensions,如 http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Multi-flavor-variants 中所述。
这也与您对解决方案 2 的想法类似。
它会像这样工作:
flavorDimensions 'fruit', 'paid'
productFlavors {
apple {
dimension 'fruit'
}
orange {
dimension 'fruit'
}
free {
dimension 'paid'
}
premium {
dimension 'paid'
}
}
这将为您提供构建变体(和源文件夹),在其中组合每个 flavor 维度的所有可能性,保持与您在 flavorDimensions
语句中指定组的顺序相同的顺序(即它是 appleFree
,而不是 freeApple
),因此:
* appleFree
* applePremium
* orangeFree
* orangePremium
在您的 src/ 文件夹中,您可以有以下可能性:
* src/main
* src/apple
* src/orange
* src/free
* src/premium
* src/appleFree
* src/applePremium
* src/orangeFree
* src/orangePremium
解决方案 3
您可以使用 buildConfigField
来指定进入 BuildConfig
类的常量:
productFlavors {
appleFree {
buildConfigField 'String', 'MY_URL', 'value1'
}
applePremium {
buildConfigField 'String', 'MY_URL', 'value2'
}
orangeFree {
buildConfigField 'String', 'MY_URL', 'value3'
}
orangePremium {
buildConfigField 'String', 'MY_URL', 'value4'
}
解决方案 1
我试图按照解决方案 1 的方式进行一些工作,但它不适用于您的确切用例。如果您在 Java 中有一个 if
条件来测试声明为 static final
的 bool 值,那么编译器可以静态确定代码是否可访问,并将其剥离如果不是。因此:
static final boolean DEBUG = false;
...
if (DEBUG) {
// do something
}
//do something
中的代码根本不会被编译。这是 Java 编译器有意并记录在案的行为,允许您编写不会编译到发布二进制文件中的昂贵调试代码。正是出于这个原因,BuildConfig.DEBUG
被声明为 static final
。
有一个BuildConfig.FLAVOR
,但它被定义为String
,你不会得到同样的好处:
static final String FLAVOR = "orange";
...
if (FLAVOR.equals("apple")) {
// do something
}
编译器不够聪明,无法进行静态分析,看到 //do something
无法访问,就不编译了。 请注意,它在运行时可以正常工作,但死代码将包含在您的二进制文件中。
不过,如果它适合您,您可以从上面窃取 buildConfigField
方法,并在某些变体中定义一个额外的 bool 变量,以允许有条件地编译代码。这比定义更复杂像 Solution 3 中那样直接使用字符串,但是如果您发现自己想要区分行为而不费心制作特定于 flavor 的子类,您可以走这条路。
关于android - 如何让两种构建风格继承自 Android Studio 中的根风格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26636282/
我在使用 gradle 构建一个特定应用程序时遇到问题。该应用程序可以用 eclipse 编译和构建,它在平板电脑上运行良好。当我尝试使用 Gradle 构建它时,“compileDebugJava”
我有一个 C 程序,是一位离开的开发人员留给我的。我试图弄清楚他到底在做什么,并将软件重新安排成更合乎逻辑的东西,这样我就可以更轻松地构建它。我正在使用 CMake 构建,而他使用的是 Make。 有
我刚开始阅读“Pro Spring MVC with web flow”,它附带了一个我想遵循的代码示例。 我要什么 - 我想像书中那样构建应用程序,使用 Gradle 有什么问题 - 我没用过 Gr
我希望有人已经这样做了。我正在尝试为我的一个 angular 2 项目在 teamcity 中建立一个连续的构建。在做了一些研究之后,我按照以下步骤操作: 构建步骤 1:为 teamcity 安装 j
我有一个旧的 ASP.Net 网站解决方案,看起来像: 当我在 Visual Studio 中构建解决方案时,我得到以下输出: ------ Build started: Project: C:\..
我使用 gulp-usref、gulp-if、gulp-uglify、gulp-csso 和 gulp-file-include 来构建我的应用程序。除了 HTML 保持原样外,构建中的一切都运行良好
我正在使用 ionic2 开发内部移动应用程序。我可以通过以下方式成功构建 ios: ionic build ios and ionic build ios --prod 但当我这样做时,它一直失败
我是一位经验丰富的 .NET/C# 开发人员,但对这里的几乎所有技术/库(包括 SQL/DB 工作)都是新手。 我正在开发一个具有 Azure/Entity Framework .NET 后端和可移植
我正在使用 VS 2008。我可以使用 IDE 成功编译我的解决方案。但是,当我尝试使用 devenv.com 构建它时,它失败并提示“错误:找不到项目输出组'(无法确定名称)的输出”。该组、其配置或
版本: ember.js 2.7,ember-data 2.7 ember-cli 2.9.1//同样适用于 ember-cli 2.7 node 6.9.1, npm 3.10.9//也适用于 no
我第一次修补 AzureDevops,设置一些 CI 任务。 我有一个公共(public)存储库(开源)和一个包含 3 个 F# 项目的解决方案(.sln)。该解决方案在 Windows/Mac/Li
目前 5.1.5 版本或 STLPort CVS 存储库似乎仍不支持 VS2008。如果有人已经完成了这项工作,那么如果可能的话,分享会很有用:) 同样,了解 VS2005 或 2008 x64 构建
我有一个 Python 2.7 项目,到目前为止一直使用 gfortran 和 MinGW 来构建扩展。我使用 MinGW,因为它似乎支持 Fortran 代码中的写入语句和可分配数组,而 MSVC
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
我想知道为什么在 Zimbra Wiki 中只列出了构建过程的特定平台。这意味着不可能在其他 Linux 发行版上构建 Zimbra? Zimbra 社区选择一个特殊的 Linux 发行版来构建 Zi
我将在 Swift 中构建一个 CLI 工具。我用这个命令创建了项目 swift package init --type executable当我构建我的项目并解析 时读取别名 Xcode 中的参数并
我想为添加到 docker 镜像的文件设置文件权限。我有这个简单的 Dockerfile: FROM ubuntu:utopic WORKDIR /app RUN groupadd -g 1000 b
当我使用 clBuildProgram在我的 OpenCl 代码中,它失败并显示错误代码 -11,没有任何日志信息。 这是我的代码的样子: ret = clBuildProgram(program
我有一个底部导航栏,它有一个列表页面,该页面使用状态块。 class _MainPageState extends State { int _index = 0; @override Wi
我在本地计算机上使用Jenkins(Jenkins URL未通过Internet公开,但该计算机上已启用Internet。) 我进行了以下配置更改: 在Jenkins工具上安装了Git和Github插
我是一名优秀的程序员,十分优秀!