zoukankan      html  css  js  c++  java
  • 说说开发 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"
          ]
      }
      
  • 相关阅读:
    nosql数据库:mongodb,redis,memcached,其优缺点和使用应用场景
    进程和线程的定义和区别
    PHP中的 抽象类(abstract class)和 接口(interface)
    简单理解php的socket编程
    session跨域共享解决方案
    MySQL 对于千万级的大表要怎么优化
    关于存session,cookie还是数据库或者memcache的优劣,部分网上抄录
    MYSQL 索引类型、什么情况下用不上索引、什么情况下不推荐使用索引
    MySQL把一个大表拆分多个表后,如何解决跨表查询效率问题
    PHP + NGINX 控制视频文件播放,并防止文件下载
  • 原文地址:https://www.cnblogs.com/wkmcyz/p/15695771.html
Copyright © 2011-2022 走看看