main
フォルダからランチャーアイコンを取得するタスクを追加したいタスクを追加する独自のGradleプラグインがあり、各ビルドタイプ/フレーバーフォルダには出力アイコンが付いていますユーザーの拡張構成によって色が異なります。res生成タスクでリソースを追加するときに "Duplicate resources"を表示
は、私は、アプリケーションのバリアントのためのタスクを追加しました:
variant.registerResGeneratingTask(tintTask, new File("${project.buildDir}/generated/res/${variant.name}"))
は次にタスクで、私は上記の操作を行います。これまではすべてが問題なく、ソースは生成され、フォルダはリソースフォルダとしてマークされています。
問題は、ビルドを作成しようとしたときに、フローがmergeXXXResources
タスク(この場合はxxx == debug)にヒットする場合です。
この時点では、main/res
のmipmap-[dpi]-v4/ic_launcher
とgenerated/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);
} ...
生成されたリソースのputputパスは何ですか? – Kelevandos
@Kelevandosプロジェクトのマージリソースの出力を意味しますか?それは標準のものなので、 'app/build/intermediates/incremental/mergeDebugResources'、 ' app/build/intermediates/res/merged/debug'と 'app/build/intermediate/blame/res/debug'です。ただし、これは、タスクがresGeneratingTaskとして登録された後にのみ実行されます。 – zilinx
ここで問題となるのは、ビルドディレクトリのタスクをターゲットにしていることです。 'variant.registerResGeneratingTask'の出力パスをメインディレクトリに設定して、gradleがビルドにマージするようにしてください。助けてくれたら教えてください:) – Kelevandos