Gradle插件相关、属性配置
一、应用插件
1.1、插件的类型
a)二进制插件 - 实现了org.gradle.api.Plugins接口,二进制插件一般都是被打包到一个jar里单独发布的,比如我们的自定义插件。
b)脚本插件(xxx.gradle)
1.2、应用插件的方式
使用的是Project.apply方法。
/**
* Applies zero or more plugins or scripts.
* <p>
* The given closure is used to configure an {@link ObjectConfigurationAction}, which “builds” the plugin application.
* <p>
* This method differs from {@link #apply(java.util.Map)} in that it allows methods of the configuration action to be invoked more than once.
*
* @param closure the closure to configure an {@link ObjectConfigurationAction} with before “executing” it
* @see #apply(java.util.Map)
*/
void apply(Closure closure);
/**
* Applies zero or more plugins or scripts.
* <p>
* The given closure is used to configure an {@link ObjectConfigurationAction}, which “builds” the plugin application.
* <p>
* This method differs from {@link #apply(java.util.Map)} in that it allows methods of the configuration action to be invoked more than once.
*
* @param action the action to configure an {@link ObjectConfigurationAction} with before “executing” it
* @see #apply(java.util.Map)
*/
void apply(Action<? super ObjectConfigurationAction> action);
/**
* Applies a plugin or script, using the given options provided as a map. Does nothing if the plugin has already been applied.
* <p>
* The given map is applied as a series of method calls to a newly created {@link ObjectConfigurationAction}.
* That is, each key in the map is expected to be the name of a method {@link ObjectConfigurationAction} and the value to be compatible arguments to that method.
*
* <p>The following options are available:</p>
*
* <ul><li>{@code from}: A script to apply. Accepts any path supported by {@link org.gradle.api.Project#uri(Object)}.</li>
*
* <li>{@code plugin}: The id or implementation class of the plugin to apply.</li>
*
* <li>{@code to}: The target delegate object or objects. The default is this plugin aware object. Use this to configure objects other than this object.</li></ul>
*
* @param options the options to use to configure and {@link ObjectConfigurationAction} before “executing” it
*/
void apply(Map<String, ?> options);
使用方式如下:
1、方式1
apply plugin:'java'
appy from:'utils.gradle'
2、方式2
apply {
plugin 'java'
}
该闭包被用来配置ObjectConfigurationAction
3、方式三
apply(new Action<ObjectConfigurationAction>() {
@Override
void execute(ObjectConfigurationAction objectConfigurationAction) {
objectConfigurationAction.plugin('java')
}
})
1.3、应用第三方发布的插件
第三方发布的作为jar的二进制插件,我们应用的时候必须在buildscript{}里配置其classpath才能使用。buildscript{}块是一个在构建项目之前,为项目进行前期准备和初始化相关配置依赖的地方,配置好所需的依赖,就可以应用插件了。比如Android Gradle插件就是一个属于Android发布的第三方插件,使用的时候需如下配置:
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
如何自定义插件:官方示例
二、Android Gradle插件
Android Gradle工程的配置,都是在android{}中,这是唯一的一个入口。通过它,可以对Android Gradle工程进行自定义配置,其具体实现是com.android.build.gradle.AppExtension(注意Library项目是LibraryExtension),是Project的一个扩展,创建原型是:
Project.java -
ExtensionContainer getExtensions();
ExtensionContainer.java -
<T> T create(Class<T> publicType, String name, Class<? extends T> instanceType, Object... constructionArguments);
在com.android.application件中,getExtension()返回的就是com.android.build.gradle.AppExtension。所以,关于Android的很多配置可以在这个类里面去找。
---------------------脚本配置相关--------像写Java一样写配置脚本,这就是Groovy-----
compileSdkVersion - BaseExtension中的方法
/** @see #getCompileSdkVersion() */
public void compileSdkVersion(int apiLevel) {
compileSdkVersion("android-" + apiLevel);
}
buildToolsVersion - BaseExtension中的方法
public void setBuildToolsVersion(String version) {
buildToolsVersion(version);
}
defaultConfig - 如果一个productFlavor没有被特殊定义配置的话,默认就会使用defaultConfig{}
public void defaultConfig(Action<DefaultConfig> action) {
this.checkWritability();
action.execute(this.defaultConfig);
}
@SuppressWarnings({"WeakerAccess", "unused"}) // Exposed in the DSL.
public class DefaultConfig extends BaseFlavor {
@Inject
public DefaultConfig(
@NonNull String name,
@NonNull Project project,
@NonNull ObjectFactory objectFactory,
@NonNull DeprecationReporter deprecationReporter,
@NonNull Logger logger) {
super(name, project, objectFactory, deprecationReporter, logger);
}
}
可以看出,defaultConfig是默认的配置,它是一个ProductFlavor,以上所有配置对应都是ProductFlavor类里面的方法或者属性。
buildTypes -
public void buildTypes(Action<? super NamedDomainObjectContainer<BuildType>> action) {
this.checkWritability();
action.execute(this.buildTypes);
}
buildTypes是一个NamedDomainObjectContainer类型,是一个域对象。和sourceSet一样,buildTypes里面有release、debug等。我们可以在buildTypes{}里面新增任意多我们需要构建的类型。比如debug。gradle会帮我们自动构建一个对应的BuildType,名字就是我们定义的名字。
getDefaultProguardFile('proguard-android.txt')
是Android扩展的一个方法,可以获取你的Android SDK目录下默认的proguard配置文件。
signConfigs - NamedDomainObjectContainer类型
signConfigs{}配置块方便我们生成多个签名配置信息,和buildTypes一样。
启用zipAlign优化
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
zipAlignEnabled true
}
debug {
}
}
zipAlign是Android为我们提供的一个整理优化APK文件的工具,它能提高系统和应用的运行效率,更快的读写apk中的资源,降低内存占用。所以对于要发布的App,在发布之前一定要使用zipAlign进行优化。