【问题标题】:External dependencies on GradleGradle 的外部依赖
【发布时间】:2015-01-31 12:15:24
【问题描述】:

我熟悉使用 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 中做到这一点?

我想解决上面例子中提到的外部依赖。实际上我是通过'make'来做的,但我想完全删除这个额外的步骤。

【问题讨论】:

  • Gradle 默认编译你的android项目中“drawable”文件夹中的所有可绘制媒体。它还会自动识别子文件夹,例如 drawable-hdpi 和 drawable-mdpi,并在适当且可用的情况下使用这些子文件夹来查找合适的图像以获得分辨率。 build.gradle 文件中有一个dependencies 标签,但据我所知,它主要用于从项目中添加外部 JARS 或像 Maven 一样,为外部存储库提供地址以便为您下载库。希望对您有所帮助。
  • @G_V 我知道,我想解决我的示例中提到的外部依赖项。修改时手动导出每个图像是无效的。事实上,目前我正在使用'make'来做,但我想完全删除这个额外的步骤。
  • 我可以想象,我自己在后台线程的代码中预缩放所有内容,然后在需要时缓存我需要的内容。除非您有数百个大型可绘制对象,否则效果很好,在这种情况下,缩放本身仍然不会减慢应用程序的速度,但垃圾收集器会。我真的帮不了你,但也许 Gradle 的 recommended books 更有用。

标签: android gradle makefile


【解决方案1】:

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

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

  • 它会查看自定义文件夹art/drawable 中的所有*.svg 文件
  • 在每个 *.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)
}

以下是我使用的资源:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 2023-01-13
    相关资源
    最近更新 更多