说说开发 ByteX 里的插件的第一步

说说开发 ByteX 里的插件的第一步

byteX 里的插件可以单独运行,也可以注册到公用平台上被调用,那么具体是使用了什么样的 gradle 语法将自己注册到共用平台上的呢?

笔者会简单说几个像笔者一样的新人不知道的点,再详细一些的内容(比如抠具体的源码方法)就不赘述啦。这些知识点也是开发基于 byteX 的插件的基本知识。

(以 ReferCheckPlugin 为例进行分析)

gradle transform 都应该有一个 [x.properties](http://x.properties) 方法说明自己的 Plugin 类,插件源码里的这个文件在哪呢?

答 :

这是因为插件项目使用一个叫做 PluginConfigProcessor 的注解处理器,这个处理器会将 @PluginConfig 注解里的值,写入到对应项目的 META-INF/gradle-plugins/%s.properties 里, 其中 %s 是注解 @PluginConfig 的值。

所以相当于这个文件没有手写,是使用注解处理器生成的。

一个插件的属性应该如何进行声明? 使用项目应该如何进行配置?

答:

  1. 插件属性如何进行声明?

答: 每一个插件都是继承于 CommonPlugin<E extends BaseExtension, X extends BaseContext>

的。其中第一个泛型参数 E extends BaseExtension 就是该 plugin 的参数类型。其中需要声明各个属性的 getter 和 setter 方法。

  • 下面给出声明示例:

    public class ReferCheckExtension extends BaseExtension {
        private List<String> whiteList;
        private boolean strictMode;
        private boolean moreErrorInfo;
        private String owner;
        private List<String> logMethods;
    
        public void setWhiteList(List<String> list) {
            whiteList = list;
        }
    
        public List<String> getWhiteList() {
            return whiteList;
        }
    
        public void strictMode(boolean strictMode) {
            this.strictMode = strictMode;
        }
    
        public boolean isStrictMode() {
            return strictMode;
        }
    
        public boolean moreErrorInfo() {
            return moreErrorInfo;
        }
    
        public void setMoreErrorInfo(boolean moreErrorInfo) {
            this.moreErrorInfo = moreErrorInfo;
        }
    
        public String getOwner() {
            return owner;
        }
    
        public void owner(String owner) {
            this.owner = owner;
        }
    
        public List<String> getLogMethods() {
            return logMethods;
        }
    
        public void setLogMethods(List<String> logMethods) {
            this.logMethods = logMethods;
        }
    
        @Override
        public String getName() {
            return "refer_check";
        }
    }
    
  1. 在使用插件的项目中,如何设置插件的属性?

答 : 在使用插件的项目里,在其模块的 build.gradle 中,先应用插件,然后进行属性设置。

  • 下面给出语法配置示例:

    apply plugin: 'bytex.refer_check'
    // refer_check 指向一个 Plugin 对象
    refer_check {
    		// 这些值都是这个 Extension 对象的 getter/setter
        enable pluginEnable
        enableInDebug pluginEnableInDebug
        logLevel pluginLogLevel
        strictMode true
        whiteList = [
                "com/google/+",
                "junit/+",
                "me/ele/lancet/+",
                "javassist/+",
                "sun/+",
                "com/appsee/Appsee",
                "com/alipay/+",
                "com/alibaba/+",
                "com/taobao/+",
                "org/android/agoo/+",
                "com/ut/mini/+",
                "org/mozilla/+",
                "com/amap/api/+",
                "com/zhihu/matisse/+", // 知乎开源的图片选择库
                "org/greenrobot/greendao/+",
                // checker-compat-qual库,guava依赖的
                "afu/org/checkerframework/checker/formatter/qual/ConversionCategory",
                "org/checkerframework/checker/formatter/qual/ConversionCategory",
                // -------------------------------
                // Okhttp3的非必须依赖。 Platform using Conscrypt (conscrypt.org) if installed as the first Security Provider.
                // Requires org.conscrypt:conscrypt-openjdk-uber on the classpath.
                "org/conscrypt/+",
        ]
        logMethods = [
                "com/ss/android/ugc/bytex/example/accessinline/OuterClass#run"
        ]
    }
    
原文地址:https://www.cnblogs.com/wkmcyz/p/15695771.html