根据构建参数更改源

时间:2018-10-09 15:46:56

标签: android gradle preprocessor

TL; DR:根据传递给gradle的参数,更改源的干净方法是什么?


我正在构建一个依赖于库_filterList(code){ let originalList = this.props.choiceOfOpioidsList; let newList = originalList.filter(function (item,code) { if(return item.short_name2.toLowerCase() === code){ return item; } return false; }); console.log(newList); }, 的Android应用程序。我希望能够支持多个版本的A(假设我想同时支持Av1)。我的意思是说我希望能够同时构建v2myapp-withAv1.apk

我已经看到,在编译时选择所需的myapp-withAv2.apk的版本很容易(例如,我可以在我的A文件中的变量中引用该版本,然后启动构建build.gradle)。

但是另一个困难是./gradlew -PversionOfA=v1 build可以更改其公共API,因此我需要根据要构建的版本来更改代码。如果我使用C ++或C#(由于A)会很容易,但是如果没有过多的代码重复,我一直无法找到一种方法来完成这项工作,如果您能指出我的意思,那我会很困惑。一种实现方法。

(请注意,尝试用#ifdef之类的代码来分隔代码分支是行不通的,因为这将导致代码分支调用if(version == v1)的方法,该方法不可用,因此构建会失败)

2 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,答案是Android中的productFlavors或通用jar的sourceSets。基本上,您需要为每个源集中的接口指定一个实现。

# define the interface in the main
/src/main/java/com/me/IMyInterface.java
# create a v1 and v2 sourceset with the implementation, note paths are the same
/src/v1/java/com/me/MyImplementation.java
/src/v2/java/com/me/MyImplementation.java

现在在您的gradle中定义productFlavors

android {
    productFlavors {
        v1 {
            buildConfigField 'string', 'FLAVOR', 'v1'
        }
        v2 {
            buildConfigField 'string', 'FLAVOR', 'v2'
        }
    }
    //...
}

现在,当您引用实现时,您将获得定义为产品风味名称的版本的sourceSet

// since the package is the same we are unaware of which we are calling
// now we can treat them as the same regardless of the underlying
// implementation differences between v1/v2

import com.me.MyImplementation;

public String doSomethingWithImplementation() {

    MyImplementation impl = new MyImplementation();

    // here if we are executing in the productFlavor v1
    // apk we get the code from the v1 folder, same for v2 apk
    return impl.doSomething()
}

答案 1 :(得分:0)

在2002年为J2ME开发时,我有类似的需求,因此开发了a preprocessor,今天它已经支持maven,gradle和ant,您可以在android上试用它,它是一个测试android项目,可以用作示例can be found in the project repository 对于预处理器,Java sources look like that