1. 程式人生 > 其它 >說說開發 ByteX 裡的外掛的第一步

說說開發 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"
        ]
    }