说说开发 ByteX 里的插件的第一步
byteX 里的插件可以单独运行,也可以注册到公用平台上被调用,那么具体是使用了什么样的 gradle 语法将自己注册到共用平台上的呢?
笔者会简单说几个像笔者一样的新人不知道的点,再详细一些的内容(比如抠具体的源码方法)就不赘述啦。这些知识点也是开发基于 byteX 的插件的基本知识。
(以 ReferCheckPlugin
为例进行分析)
gradle transform 都应该有一个 [x.properties](http://x.properties)
方法说明自己的 Plugin 类,插件源码里的这个文件在哪呢?
答 :
这是因为插件项目使用一个叫做 PluginConfigProcessor
的注解处理器,这个处理器会将 @PluginConfig
注解里的值,写入到对应项目的 META-INF/gradle-plugins/%s.properties
里, 其中 %s
是注解 @PluginConfig
的值。
所以相当于这个文件没有手写,是使用注解处理器生成的。
一个插件的属性应该如何进行声明? 使用项目应该如何进行配置?
答:
- 插件属性如何进行声明?
答: 每一个插件都是继承于 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"; } }
- 在使用插件的项目中,如何设置插件的属性?
答 : 在使用插件的项目里,在其模块的 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" ] }