2016-06-30 10 views
1

私のプロジェクトはNDKに依存しています。しかし私のNDKビルドは、私のprojectFlavorsとは異なります。依存NDKとグラデーションの条件付きビルド

私のアプリケーション用にflavor1が選択されている場合、従属NDKを-DFLAVOR1コンパイルオプションでビルドしてパックするのが好きです。 -DFLAVOR2flavor2はアプリがflavor1であると誤っ-DFLAVOR2上に構築されたNDKを使用するので、正しい選択が重要である場合は私の全体のアプリが正常に動作しません

を選択し、などです。

build.gradleこの特別な条件付きビルドを解決するにはどうすればいいですか?

答えて

0

私は最終的に私の問題のためのハッキーなアプローチを見つけました。それから、私は皆のためにここで共有して改善する方が良いです。

ステップ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 { 
    ... 
    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() 
    } 
} 

OK:私はndkセクションでそれをやりました。今あなたのアプリFlavorは-Dオプションで渡され、ライブラリをコンパイルします。 2〜3日後に私が見つけたアプローチがありました。私はこのアプローチのすべての改善のために開いています。

関連する問題