Gradle的外部依赖

时间:2014-12-03 03:32:02

标签: android gradle makefile

我熟悉使用make构建大型应用程序,但现在我已经开始使用Android Studio了,我想了解如何在Makefile中完成我已经做过的事情。

以下是一个可以帮助您确定答案的示例:

Makefile示例:(极简主义)

INK=inkscape
INKFLAGS=--export-area-page

# Resolve *.png dependencies
drawable-mdpi/%.png: %.svg
         $(INK) $< --export-png=$@ -w 48 -h 48 $(INKFLAGS) 

drawable-hdpi/%.png: %.svg
         $(INK) $< --export-png=$@ -w 72 -h 72 $(INKFLAGS) 

drawable-xdpi/%.png: %.svg
         $(INK) $< --export-png=$@ -w 96 -h 96 $(INKFLAGS) 

更简单的例子:

drawable-mdpi/ic_launcher.png: ic_launcher.svg
         inkscape ic_launcher.svg --export-png=ic_launcher.png -w 48 -h 48 --export-area-page 

drawable-hdpi/ic_launcher.png: ic_launcher.svg
         inkscape ic_launcher.svg --export-png=ic_launcher.png -w 72 -h 72 --export-area-page 

如何在Gradle中执行此操作?

我想解决上面示例中提到的外部依赖关系。实际上我是通过&#39; make&#39;来做的,但我想彻底删除这个额外的步骤。

1 个答案:

答案 0 :(得分:3)

可以从Grandle运行外部命令并将它们集成到您的构建过程中。我的示例在Windows上运行inkscape.exe并在构建脚本中定义其参数,您也可以通过这种方式运行shell脚本。

以下代码进入app\build.gradle文件。任务convertDrawable是用Groovy语法编写的,并完成以下任务( tl; dr它是您的&#34;简单示例&#34; 的实现):

  • 查看自定义文件夹*.svg
  • 中的所有art/drawable个文件
  • 在每个*.svg个文件中,查看资源文件夹中的所有drawable-*个文件夹
  • 根据drawable-*文件夹名称确定目标分辨率。
  • 然后调用inkscape.exe将每个*.svg转换为*.png所需的大小。

代码:

task convertDrawables() {
    def ink =  'C:\\Program Files (x86)\\Inkscape\\inkscape.exe'

    // look for *.svg files in app/src/art/drawable folder
    new File('app\\src\\art\\drawable').eachFileMatch(~/.*\.svg/) { file ->
        // look for destination folders
        new File('app\\src\\main\\res').eachFileMatch(~/drawable-.*/) { outputDir ->

            // define size based on folder name
            def size = ''
            switch (outputDir.getAbsolutePath()) {
                case ~/.*-ldpi/:
                    size = '36'
                    break
                case ~/.*-mdpi/:
                    size = '48'
                    break
                case ~/.*-hdpi/:
                    size = '72'
                    break
                case ~/.*-xhdpi/:
                    size = '96'
                    break
                case ~/.*-xxhdpi/:
                    size = '144'
                    break
                case ~/.*-xxxhdpi/:
                    size = '192'
                    break
            }
            def cmd = ink + ' ' + file.getCanonicalPath() + ' --export-png=' + outputDir.getAbsolutePath() + '\\ic_launcher2.png -w ' + size + ' -h ' + size + ' --export-area-page'
            def process = cmd.execute();
            process.waitFor();
        }
    }
}


// make sure the convertDrawable task is executed somewhere in the make process
gradle.projectsEvaluated {
    preBuild.dependsOn(convertDrawable)
}

以下是我使用的资源:

相关问题