我想在 gradle 的帮助下构建 2-3 个不同的 APK,其中应用名称发生变化和一些代码行。我不想更改整个目录或整个文件,只更改代码片段,这可能吗?我试图了解Build variant 和 Product flavor。但无法弄清楚它是如何工作的。还有这个教程。
谢谢
我想在 gradle 的帮助下构建 2-3 个不同的 APK,其中应用名称发生变化和一些代码行。我不想更改整个目录或整个文件,只更改代码片段,这可能吗?我试图了解Build variant 和 Product flavor。但无法弄清楚它是如何工作的。还有这个教程。
谢谢
这只是一个建议。我们面临同样的事情,这就是我们如何让它发挥作用的方式。在我看来,它非常干净,是的,它确实使用了产品口味。
因此,假设您有一个类地址,其格式因国家/地区而异,但当然有很多通用代码。为简单起见,假设您只有street_number
and street_name
,但在国家/地区A
,地址应格式化为street_number street_name
,在国家/地区,地址应B
格式化为street_name, street_number
。
我们这样做的方式是有一个像这样的项目结构:
src
|
|\ main
|\ countryA
|\ countryB
所以该项目有 2 种口味 -countryA
和countryB
. 这是相关build.gradle
部分:
productFlavors {
countryA {
applicationId "com.countryA"
}
countryB {
applicationId "com.countryB"
}
}
现在是代码部分。我们Address
放在里面的一个普通类也是如此,它main
看起来或多或少像:
public abstract class AbstractAddress {
private String streetNumber;
private String streetName;
// ... your favorite getters and setters plus some common methods
public abstract String getFormattedAddress();
}
这里的关键是类是抽象的,子类需要实现getFormattedAddress()
。现在在countryA
您拥有的文件夹中:
package com.myapp.addresses;
public class Address extends AbstractAddress {
public String getFormattedAddress() {
return getStreetNumber() + " " + getStreetName();
}
}
现在在与 in 相同的包中,countryA
但在countryB
's 文件夹中,您将拥有相同的类,但具有不同的实现:
package com.myapp.addresses;
public class Address extends AbstractAddress {
public String getFormattedAddress() {
return getStreetName() + ", " + getStreetNumber();
}
}
Gradle 将负责为您生成任务。类似于 and 的东西assembleCountryA
(assembleCountryB
这也取决于您拥有的构建变体)。当然,您也可以仅使用一项任务生成所有 apk。