2013-06-24 17 views
14

Android Studioでgradleを使用して新しいアプリケーションを作成しました。これで、リソース内に異なるパッケージ名と値で約10バージョンを作成する必要があります。私は例のようにカスタムフレーバーを作って、このカスタムフレーバーのいくつかの文字列をカスタム値に置き換えたいと思っています。私はこのような例を見つけました:文字列リソースをAndroid Gradleに置き換える方法

filter(org.apache.tools.ant.filters.ReplaceTokens, tokens: ['version': '2.2']) 

しかし、私はそれをどこに置くべきかわかりません。私はそれを別のタスクに入れる必要があると理解していますが、このタスクをIDEで呼び出す方法を教えてください。

また、Javaクラスとコンテンツプロバイダの認証内のいくつかの変数を置き換える必要があります。おそらく私はflavor1フォルダにファイルをコピーし、gradleにマージするようにする必要がありますが、ファイルの多くのコピー1行に違いがあります...多分私はこのすべてのためのいくつかの他のソリューションをユーザーにする必要がありますか?あなたの「SRC」フォルダに

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:0.4.2' 
    } 
} 
apply plugin: 'android' 

dependencies { 
    compile fileTree(dir: 'libs', include: '*.jar') 
    compile project(':JazzyListView') 
    compile project(':ABS') 
    compile project(':Volley') 
} 

android { 
    compileSdkVersion 17 
    buildToolsVersion "17.0.0" 

    defaultConfig { 
     versionCode 5 
     versionName "3.0" 
     minSdkVersion 8 
     targetSdkVersion 17 
    } 

    sourceSets { 
     main { 
      manifest.srcFile 'src/main/AndroidManifest.xml' 
      java.srcDirs = ['src/main/java'] 
      res.srcDirs = ['src/main/res'] 
     } 
    } 

    productFlavors { 
     flavor1 { 
      packageName "com.example.flavor1"    
     } 

     flavor2 { 
      packageName "com.example.flavor2" 
     } 

    } 

} 

答えて

2

、あなたの「メイン」フォルダと同じ階層に「flavor1」と「flavor2」フォルダを作成します。ここでは

はbuild.gradleです。あなたのmain/res/valuesにstrings.xmlがある場合、flavor1/res/valuesでそれを行い、そこに置換値を設定することができます。 IDEにエラーが表示されることがありますが、それでもビルドと実行が必要です。

1

これらのリンクは役に立つかもしれ:

何かを交換するために正規表現を使用して

そして、私のフィルタ定義:

from('res/') { 
    include '**/*.xml' 
    filter { 
     line -> line.replaceAll(/YOUR_REGEX_TO_REPLACE_SOMETHING/, 'REPLACED_RESULT_EXPRESSION') 
    } 
} 
into 'build/path/to/your/filtered/resources/' 
+2

おかげで、どのようにこのタスクを定義し、どのようにビルドの種類や味でそれを使用しますか? – itspers

+0

@itspers特定のビルドバリアントを変更する方法の詳細は、私の答えを参照してください – goldierox

+0

問題は '' build/path/to/your/filtered/resources/''パス ' – aelam

18

私は同様の問題がありました。私はstrings.xmlからマージされる文字列にJenkinsのビルド番号を追加したかったのです。ここで私の解決策は、Android Gradleプラグイン0.12。+です。

// Insert the build number into strings.xml 
android.applicationVariants.all{ variant -> 
    variant.mergeResources.doLast{ 
     ext.env = System.getenv() 
     def buildNumber = env.BUILD_NUMBER 
     if (buildNumber != null) { 
      File valuesFile = file("${buildDir}/intermediates/res/${variant.dirName}/values/values.xml") 
      println("Replacing revision number in " + valuesFile) 
      println("Build number = " + buildNumber) 
      String content = valuesFile.getText('UTF-8') 
      content = content.replaceAll(/devBuild/, buildNumber) 
      valuesFile.write(content, 'UTF-8') 
     } 
    } 
} 

目的に応じて別のGradleタスクにフックしたい場合があります。それを理解するために、Androidビルドの一部であるタスクを見てください。

http://tools.android.com/tech-docs/new-build-system/user-guide

UPDATE:いくつかの時点で、アンドロイドのGradleプラグインはアプリケーションを反復処理する方法を変更するには、から各すべてにキーワードをバリアント。私の答えは変更を反映するように更新されましたが、に切り替えると、このコードがコンソールに何も表示されません。

+1

私は '$ {buildDir}'に 'source'フォルダに' rs'フォルダがあり、 'res'フォルダにフォルダ構造がありますが、それらは似ているとは思えませんが、' source ( "$ {buildDir}/res/all/$ {variant.dirName} /values/values.xml") 'は問題を解決できますが、値14.xmlを変更する方法はありますか? – aelam

+0

@aelam、私は 'rs'ディレクトリはRenderScript用で、' res'フォルダはあなたのリソース用だと考えています。 "値 - [APIレベル] .xml"ファイルを変更する場合は、おそらくそのディレクトリ内のファイルを使って正規表現または反復を使用できます。私は頭の上をどのようにオフにするのか分からない。 Gradleのドキュメントをチェックすることをおすすめします。 http://www.gradle.org/docs/current/userguide/working_with_files.html – goldierox

+1

私は0.8でこれを動作させることができました:ファイルvaluesFile = new File( "$ {buildDir}/intermediate/res/$ {variant。 dirName} /values/values.xml ") ただし、より良い解決策を探して、先にきれいにする必要があります。 – eski

4

Mavenリソースフィルタリングと同様の機能を実現しようとしていました。 これは私が思いついたものです。私の解決策は、いくつかの変更を使用してより堅牢にすることができます(つまり、プロパティファイルから取得するなど)。

私の例は、私が必要としていたすべての値を置き換える方法を示しています。変数は${some.property}の規則に従います。このソリューションは、独自のリソースファイルを持つ製品のフレーバーでも機能します。strings.xmlで

import org.apache.tools.ant.filters.* 
... 
android.applicationVariants.all{ variant -> 
    // Perform resource filtering 
    variant.mergeResources.doLast { 
     filterResources(variant) 
    } 
} 

def filterResources(buildVariant) { 

    //Setup temp directory to filter the resources 
    File resFiltered = file("${buildDir}/res/all/filtered/${buildVariant.dirName}") 
    if(resFiltered.exists()){ 
     resFiltered.delete() 
    } 

    //Copy and filter the resources. 
    copy { 
     from(buildVariant.processResources.resDir) { 
      include '**/*.xml' 

      //Could be improved upon to pull from a properties file, etc. 
      ant.properties['app.version'] = project.version 

      filter(ExpandProperties, project: ant.project) 

     } 
     from(buildVariant.processResources.resDir) { 
      exclude '**/*.xml' 
     } 

     into resFiltered 

    } 

    //Delete all the original resource files 
    file(buildVariant.processResources.resDir).deleteDir() 
    //Replace with the filtered ones. 
    resFiltered.renameTo(file(buildVariant.processResources.resDir)) 
    //Delete the original 'filtered' directory 
    file("${buildDir}/res/all/filtered").deleteDir() 
} 

... 
<string name="app_version">${app.version}</string> 
... 
+0

こんにちは私はこれを実装する上でいくつか問題がありますが、私は例外が発生します:タスク ':app:mergeDebugResources'の実行に失敗しました。 >このようなプロパティはありません:クラスorg.gradle.api.internal.file.copy.CopySpecWrapper_DecoratedのExpandProperties。あなたはそれをどうするべきか知っていますか? – Billda

+0

どのバージョンのgradleを使用していますか? –

+0

.xmlファイルがディスクに書き込まれる前にフラット化されているため、これはAAPT2では機能しません。参照:https://issuetracker.google.com/issues/65220623 –

関連する問題