我熟悉使用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”来实现的,但我想完全删除这个额外的步骤。
可以从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外部依赖项而不编译源代码吗?