Android Gradle的外部依赖性

Android Gradle的外部依赖性,android,gradle,makefile,Android,Gradle,Makefile,我熟悉使用make构建大型应用程序,但现在我已经开始使用Android Studio,我想了解如何在Makefile中完成我已经做过的事情 下面是一个可能有助于您确定答案的示例: 生成文件示例:(极简主义) 在Gradle如何做到这一点? 我想解决上面示例中提到的外部依赖关系。实际上,我是通过“make”完成的,但我想完全删除这个额外的步骤。可以从Grandle运行外部命令,并将它们集成到构建过程中。我的示例在Windows上运行inkscape.exe,并在构建脚本中定义其参数,您也可以通过这

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

下面是一个可能有助于您确定答案的示例:

生成文件示例:(极简主义)

在Gradle如何做到这一点?


我想解决上面示例中提到的外部依赖关系。实际上,我是通过“make”完成的,但我想完全删除这个额外的步骤。

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

以下代码进入
app\build.gradle
文件。Task
convertDrawable
是用Groovy语法编写的,它实现了以下功能(它是您的“简单示例”的一个实现):

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

以下是我使用的资源:


Gradle默认情况下从android项目中的“drawable”文件夹编译所有可绘制媒体。它还自动识别子文件夹,如drawable hdpi和drawable mdpi,并在适当和可用时使用这些子文件夹查找适当的图像以获得分辨率。build.gradle文件中有一个
dependencies
标记,但据我所知,它主要用于从项目中添加外部JAR,或者像Maven一样,向外部存储库提供地址,以便为您下载库。希望它能对您有所帮助。@G_V我知道,我想解决外部依赖关系,如我的示例中提到的。在修改图像时手动导出每个图像是徒劳的。事实上,目前我正在使用“make”来做这件事,但我想完全删除这个额外的步骤。我可以想象,我自己在后台线程的代码中预先调整了所有内容,然后缓存我需要的内容,只要我需要它。除非你有数百个大的可绘制文件,否则效果就足够好了。在这种情况下,扩展本身不会使应用程序慢很多,但垃圾收集器会。我真的帮不了你,但也许格拉德尔的更有用。
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 
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)
}