当前位置: 首页 > 知识库问答 >
问题:

Gradle的外部依赖性

能向晨
2023-03-14

我熟悉使用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”来实现的,但我想完全删除这个额外的步骤。

共有1个答案

姜晨
2023-03-14

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

以下代码进入应用程序的内部版本。gradle文件。TaskconvertDrawable是用Groovy语法编写的,它实现了以下功能(太长了,读不下去了这是您的“简单示例”的实现):

  • 它浏览了所有的代码。svg文件位于自定义文件夹中
  • 在这些代码中的每一个。svg文件,查看资源文件夹中的所有可绘制文件
  • 根据文件夹名称,确定目标分辨率
  • 然后调用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)
}

以下是我使用的资源:

  • Gradle Doc第15章:有关任务的更多信息
  • Gradle Doc第58章。编写自定义任务类
  • Gradle Doc Exec函数
  • Groovy执行()
  • Stackoverflow使用Android Gradle插件编译前运行任务
  • Groovy Doc for File

 类似资料:
  • 我已经浏览了许多关于类似问题的问题,但我找不到有效的解决方案。这可能是我对Android开发缺乏经验,但我不认为错误消息是那么清楚。我已经尝试过: 重建/清洁项目, 使缓存失效/重新启动、同步 带有 gradle 文件的项目, 我在设置中使用默认的 gradle 包装器, 有什么办法解决这个问题吗? 使用Android Studio版本:3.4.1 应用: 构建.gradle 项目:Build.g

  • 我需要在我的maven项目中添加大约15个罐子,它在远程和中央存储库中都不可用。 然而,我实现了以下目标:, > 在我的项目路径中添加了jars(\src\lib) 将pom更改如下, 我的问题是: 我是否需要像上面那样分别对所有15个JAR重复它,或者我们有任何其他方法来绑定这些JAR并将其作为一个依赖路径? Maven在这里讨论了同样的事情:指向多个JAR的系统依赖性。但我想知道我是否能得到更

  • 如您所知,Maven使用存储库的概念进行依赖关系管理。 但是,如果在任何远程存储库和中央存储库中都没有依赖项,会发生什么? Maven使用External Dependency概念为这种情况提供答案。 例如,让我们对“创建Java项目”一章中创建的项目进行以下更改。 将lib文件夹添加到src文件夹。 将任何jar复制到lib文件夹中。 我们使用了ldapjdk.jar ,它是LDAP操作的帮助库

  • 你可以声明许多种依赖. 其中一种是external dependency(外部依赖). 这是一种在当前构建之外的一种依赖, 它被存放在远程或本地的仓库里, 比如 Maven 的库, 或者 Ivy 库, 甚至是一个本地的目录. 下面的例子讲展示如何加入外部依赖 例子 8.2. 定义一个外部依赖 build.gradle dependencies { compile group: 'org.h

  • 在我的模块构建脚本(build.gradle)中,我可以设置依赖项: Gradle示例8.2 我还可以在构建脚本中使用方法并设置依赖项: 如果构建脚本需要使用外部库,可以将它们添加到构建脚本本身的脚本类路径中。您可以使用buildscript()方法来实现这一点,并传入一个声明构建脚本类路径的闭包。 Gradle示例59.6 我的问题,这些是一样的吗?这两种为构建脚本设置依赖关系的方式有什么区别吗

  • 我可以使用Gradle下载Java外部依赖项而不编译源代码吗?