美文网首页
Gradle Transform

Gradle Transform

作者: Drew_MyINTYRE | 来源:发表于2020-12-15 10:11 被阅读0次

什么是 Plugin Transform?

Transform 是 Android Gradle plugin团队提供给开发者使用的一个抽象类, 从1.5.0-beta1 版本开始提供了 Transform API

com.android.build.api.transform.Transform

它能干啥?

提供接口让开发者可以在源文件编译成为 class 文件之后,dex 之前进行字节码层面的修改。借助 javaassist,ASM 这样的字节码处理工具,可以通过自定义 Gradle 插件来注册自定义的 Transform,在自定义的 Transform 中进行代码的插入,修改,替换,甚至是新建类与方法,注册后 Transform 会包装成一个 Gradle Task 任务,这个 Task 在 compile task 执行完毕后运行。

记住两个核心的API: TransformInputTransformOutputProvider;

  • TransformInput

TransformInput 代表的是输入文件抽象接口,获取 DirectoryInput 集合和获取 JarInput 集合,DirectoryInput 是以 源码 方式参与项目编译所有目录结构及其目录下的源文件;而 JarInput 是以 jar 包方式参与项目编译的所有 jar 包和远程包。

package com.android.build.api.transform;

import com.android.annotations.NonNull;
import java.util.Collection;

public interface TransformInput {

    /**
     * Returns a collection of {@link JarInput}.
     */
    @NonNull
    Collection<JarInput> getJarInputs();

    /**
     * Returns a collection of {@link DirectoryInput}.
     */
    @NonNull
    Collection<DirectoryInput> getDirectoryInputs();
}
  • TransformOutputProvider

代表的是输出文件抽象接口,重点关注 getContentLocation(...) 方法
1,name 代表该 Transform 对应的 Task 的名称
2, QualifiedContent.ContentType 需要处理的数据类型,CLASSES 代表 需要处理编译后的字节码,可能是 jar 也可能是 目录。RESOURCES 代表处理标准的 java 资源
3,scopes 也是一个比较有意思的枚举类, PROJECT 只处理当前项目,SUB_PROJECTS 只处理子项目,PROJECT_LOCALDEPS 只处理当前项目的本地依赖,例如: jar , arrSUB_PROJECTS_LOCAL_OEPS 只处理子项目的本地依赖。例如: jar , arrEXTERNAL_LIBRARIES 只处理外包的依赖库,PROVIDED_ONLY 只处理本地或远程以 provided 形式引入的依赖库。而TESTED_CODE 指的是测试代码。

package com.android.build.api.transform;

import com.android.annotations.NonNull;
import java.io.File;
import java.io.IOException;
import java.util.Set;

public interface TransformOutputProvider {
    void deleteAll() throws IOException;

    @NonNull
    File getContentLocation(
            @NonNull String name,
            @NonNull Set<QualifiedContent.ContentType> types,
            @NonNull Set<? super QualifiedContent.Scope> scopes,
            @NonNull Format format);
}

public interface QualifiedContent {

    enum DefaultContentType implements ContentType {
        /**
         * The content is compiled Java code. This can be in a Jar file or in a folder. If
         * in a folder, it is expected to in sub-folders matching package names.
         */
        CLASSES(0x01),

        /** The content is standard Java resources. */
        RESOURCES(0x02);

        private final int value;

        DefaultContentType(int value) {
            this.value = value;
        }

        @Override
        public int getValue() {
            return value;
        }
    }

  enum Scope implements ScopeType {
        /** Only the project (module) content */
        PROJECT(0x01),
        /** Only the sub-projects (other modules) */
        SUB_PROJECTS(0x04),
        /** Only the external libraries */
        EXTERNAL_LIBRARIES(0x10),
        /** Code that is being tested by the current variant, including dependencies */
        TESTED_CODE(0x20),
        /** Local or remote dependencies that are provided-only */
        PROVIDED_ONLY(0x40),

        /**
         * Only the project's local dependencies (local jars)
         *
         * @deprecated local dependencies are now processed as {@link #EXTERNAL_LIBRARIES}
         */
        @Deprecated
        PROJECT_LOCAL_DEPS(0x02),
        /**
         * Only the sub-projects's local dependencies (local jars).
         *
         * @deprecated local dependencies are now processed as {@link #EXTERNAL_LIBRARIES}
         */
        @Deprecated
        SUB_PROJECTS_LOCAL_DEPS(0x08);

        private final int value;

        Scope(int value) {
            this.value = value;
        }

        @Override
        public int getValue() {
            return value;
        }
    }
}

相关文章

网友评论

      本文标题:Gradle Transform

      本文链接:https://www.haomeiwen.com/subject/txxvgktx.html