我的项目取决于NDK。但是我的NDK构建与我的projectFlavors不同。
如果为我的应用选择了应用的-DFLAVOR1
,我想用flavor1
编译选项来构建和打包我的依赖NDK。选择了-DFLAVOR2
等时的flavor2
。
如果应用程序位于flavor1
上并且错误地使用了基于-DFLAVOR2
构建的NDK,则整个应用程序将无法正常工作,因此正确选择非常重要。
现在,我们如何编写build.gradle
来解决这种特殊的条件构建?
最佳答案
我终于找到了解决问题的办法,尽管我最好在这里与大家分享并加以改进。
步骤1:
您需要从应用程序提供标志,并将其依赖于preBuild
。这是执行此操作的示例代码。感谢How to get current flavor in gradle提供的功能。我只是修改了一下。
import java.util.regex.Matcher
import java.util.regex.Pattern
def getCurrentFlavor() {
Gradle gradle = getGradle()
String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()
Pattern pattern;
if( tskReqStr.contains( ":app:assemble" ) )
pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
else if( tskReqStr.contains( ":app:generate" ) )
pattern = Pattern.compile("generate(\\w+)(Release|Debug)")
else
pattern = Pattern.compile("incremental(\\w+)(Release|Debug)")
Matcher matcher = pattern.matcher( tskReqStr )
if( matcher.find() )
return matcher.group(1).toLowerCase()
else
{
println "NO MATCH FOUND"
return "";
}
}
task setFlavorFlag() {
def flavorName = getCurrentFlavor();
if (!flavorName.equals("")) {
printf("Setting flag from app...\n")
def f = file("../build/conf.tmp")
if (!f.exists()) f.createNewFile()
f.write("-D${flavorName.toUpperCase()}")
}
}
preBuild.dependsOn setFlavorFlag
dependencies {
compile project(path: ':mylibrary')
}
步骤2:
从库访问标志。我在
ndk
部分做到了:ndk {
...
def f = file("../build/conf.tmp")
if (f.exists()) {
printf("Building library for Flavor:%s\n", f.text)
ndk.CFlags.add(f.text);
f.delete()
}
}
好。现在,您的应用程序Flavor使用
-D
选项传递,以编译库。这是我2-3天后发现的方法。我愿意接受这种方法的所有改进。
关于android - 有条件的依赖NDK的条件构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38115425/