在摇篮
问题描述:
外部依赖我所熟悉的建筑使用make
大型应用程序,但现在我已经使用过Android Studio开始,我想知道如何做的事情我已经在做Makefile
。在摇篮
这里有一个例子,可以帮助你编一个答案:
的Makefile例子:(简约)
INK=inkscape
INKFLAGS=--export-area-page
# Resolve *.png dependencies
drawable-mdpi/%.png: %.svg
$(INK) $< [email protected] -w 48 -h 48 $(INKFLAGS)
drawable-hdpi/%.png: %.svg
$(INK) $< [email protected] -w 72 -h 72 $(INKFLAGS)
drawable-xdpi/%.png: %.svg
$(INK) $< [email protected] -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中做到这一点?
我想解决外部依赖性,如上面的例子中提到的。其实,我通过“让”做它,但我想彻底删除这个额外的步骤。
答
它可以从Grandle运行外部命令和整合这些到您的构建过程。我的例子在Windows上运行inkscape.exe
,并在构建脚本定义了它的参数,你也可以只运行一个shell脚本这样。
下面的代码进入app\build.gradle
文件。任务convertDrawable
是写在Groovy的语法和完成以下(文艺青年最爱的是你“简单的例子”的实现):
- 它看起来在所有的
*.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)
}
下面是我使用的资源:
摇篮默认编译所有的绘制媒体在你的Android项目中的 “绘制” 文件夹中。它还自动识别子文件夹,例如drawable-hdpi和drawable-mdpi,并在适当的情况下使用这些子文件夹来查找适当的图像以获得解决方案。 build.gradle文件中有一个'dependencies'标签,但是据我所知它主要用于从项目或Maven中添加外部JARS,以向外部存储库提供地址以便为您下载库。希望它有助于你在路上的一点点。 – 2014-12-18 13:09:52
@G_V我知道,我想解决外部依赖关系,如我的示例中提到的。修改时手动导出每个图像都是非生产性的。实际上,目前我正在使用'make'来做这件事,但我想彻底删除这个额外的步骤。 – 2014-12-19 01:15:40
我可以想象,我在后台线程上将所有代码都预先标记为自己,然后根据需要缓存我需要的内容。除非你有数百个大型绘图工具,否则工作效果不够好,在这种情况下,缩放本身仍然不会减慢应用程序的速度,但垃圾收集器的确如此。我无法真正帮助你,但也许Gradle的[推荐书籍](https://www.gradle.org/books)更有用。 – 2014-12-19 11:17:06