2016-04-28 9 views
2

mainフォルダからランチャーアイコンを取得するタスクを追加したいタスクを追加する独自のGradleプラグインがあり、各ビルドタイプ/フレーバーフォルダには出力アイコンが付いていますユーザーの拡張構成によって色が異なります。res生成タスクでリソースを追加するときに "Duplicate resources"を表示

は、私は、アプリケーションのバリアントのためのタスクを追加しました:

variant.registerResGeneratingTask(tintTask, new File("${project.buildDir}/generated/res/${variant.name}")) 

は次にタスクで、私は上記の操作を行います。これまではすべてが問題なく、ソースは生成され、フォルダはリソースフォルダとしてマークされています。

問題は、ビルドを作成しようとしたときに、フローがmergeXXXResourcesタスク(この場合はxxx == debug)にヒットする場合です。

この時点では、main/resmipmap-[dpi]-v4/ic_launchergenerated/res/debugのものを比較する例外があります。例えば

Execution failed for task ':app:mergeDebugResources'. 
[mipmap-hdpi-v4/ic_launcher] /{proj_location}/android_example/app/src/main/res/mipmap-hdpi/ic_launcher.png 
[mipmap-hdpi-v4/ic_launcher] /{proj_location}/android_example/app/build/generated/res/debug/mipmap-hdpi/ic_launcher.png: 
Error: Duplicate resources 

私は出力ファイルの別の場所を試してみましたが、私はそれがすべての違いを信じていません。私は、リソースの合併が生成されたリソースを特定して最終的な出力で解析することができると期待していましたが、明らかに間違ったことをしています。

代わりにTransform APIを使用しようとしましたが、ドキュメントが不十分で、私の試行があまり成功していないことがわかっていないことが原因です(私はリソースファイルを私のやり方変換操作中にJavaファイルがあります)。

私は現在の問題を解決する方法のアドバイス、または私が達成するために最初に設定したタスクを実行する別の方法を探しています。

EDIT:リクエストに応じて、私のタスク・アクションのためのコード:

@TaskAction 
def convertLauncherIcons() { 
    def android = project.extensions.getByType(AppExtension) 
    File outputDir = new File("${project.buildDir}/generated/tintLaunchIcons/res/${taskVariant.name}") 

    android.sourceSets.each { 
     if ("main".equals(it.name)) { 
      it.res.srcDirs.each { dirIt -> 
       dirIt.absoluteFile.list().each { resDir -> 
        if (resDir.startsWith("mipmap-")) { 
         def relIconPath = "${resDir}/ic_launcher.png" 
         File launcherFile = new File(dirIt.absolutePath, relIconPath); 
         if (launcherFile.exists()) { 
          BufferedImage img = ImageIO.read(launcherFile); 
          /* IMAGE MANIPULATION HERE */ 
          File outputFile = new File(outputDir, relIconPath); 
          if (!outputFile.exists()) { 
           File parent = outputFile.getParentFile(); 
           if (!parent.exists() && !parent.mkdirs()) { 
            throw new IllegalStateException("Couldn't create dir: " + parent); 
           } 
           outputFile.createNewFile(); 
          } 
          println "writing file ${outputFile.canonicalPath}" 
          ImageIO.write(img, "png", outputFile); 
     } ... 
+0

生成されたリソースのputputパスは何ですか? – Kelevandos

+0

@Kelevandosプロジェクトのマージリソースの出力を意味しますか?それは標準のものなので、 'app/build/intermediates/incremental/mergeDebugResources'、 ' app/build/intermediates/res/merged/debug'と 'app/build/intermediate/blame/res/debug'です。ただし、これは、タスクがresGeneratingTaskとして登録された後にのみ実行されます。 – zilinx

+0

ここで問題となるのは、ビルドディレクトリのタスクをターゲットにしていることです。 'variant.registerResGeneratingTask'の出力パスをメインディレクトリに設定して、gradleがビルドにマージするようにしてください。助けてくれたら教えてください:) – Kelevandos

答えて

2

[OK]を、私たちは、上記のコメントの議論で思い付いた合計:ここでの問題がある


ほとんどの場合、gradleスクリプトがmainディレクトリを現在のフレーバにマージする前にファイルを修正しようとしていることでしょう。

variant.mergeResources.doLast { //fire your task here } 

これは少し単純であるべきとAndroidのGradleプラグインは、実際にこのようなものをどのように処理するかにあなたに多くの研究が保存されます:私の提案は、あなたがマージが行われた後、このように、あなたのタスクを発射しようとしなければならないことです:-)

+0

これは間違いありませんが、ビルドごとにmergeResourcesの出力が変化するため、ビルドごとにmergeResourcesがトリガーされるため、ソースファイルを変更しなくても増分ビルドが中断されます – Auras

関連する問題