欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Gradle插件相关、属性配置

程序员文章站 2022-04-29 15:12:11
...

一、应用插件

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进行优化。

相关标签: gradle