簡體   English   中英

使用gradle有條件地構建依賴NDK

[英]Conditional build of dependant NDK with gradle

我的項目取決於NDK。 但我的NDK版本對於我的projectFlavors來說是不同的。

如果為我的應用程序選擇了應用程序的flavor1我喜歡使用-DFLAVOR1編譯選項構建和打包我的依賴NDK。 選擇-DFLAVOR2時的flavor2

如果應用程序在flavor1並且錯誤地使用在-DFLAVOR2-DFLAVOR2的NDK,我的整個應用程序將無法正常工作,因此正確的選擇很重要。

現在我們如何編寫build.gradle來解決這個特殊的條件構建?

我終於找到了一個針對我的問題的hacky方法,然后我雖然最好在這里為每個人分享並改進。

第1步:

您需要從應用程序提供標志並將其依賴於preBuild 這是一個用於執行此操作的示例代碼。感謝如何在gradle中獲取函數的當前flavor 我剛修改了一下。

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()
    }
}

好。 現在你的app Flavor傳遞了一個-D選項來編譯庫。 這是我在2-3天后發現的方法。 我對這種方法的所有改進持開放態度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM