閱讀231 返回首頁    go 阿裏雲 go 技術社區[雲棲]


ToyBricks用戶手冊

注:閱讀本文之前,建議先閱讀一下:
ToyBricks簡介以及原理分析

ToyBricks簡介

ToyBricks是一個Android項目模塊化的解決方案,主要包括四個部分,APT注解,APT注解處理器,ToyBricks插件(Gradle Plugin),ToyBricks庫。

ToyBricks簡介

其中:
1. APT注解,主要定義了兩個注解:Interface(接口,例如:IText),Implementation (實現,例如:TextImpl)
1. APT注解處理器,在javac編譯java源碼之前。APT注解處理器會掃描Java源碼中帶有上麵兩個注解的接口和類,並且生成一個json文件, ToyBricks.json.
1. ToyBricks插件(Gradle Plugin),負責ToyBricks.json的打包,合並,生成Java源文件等工作
1. ToyBricks,提供對外調用方法。通過參數傳入接口,返回相應的實現。

ToyBricks特性

  1. 同時支持Kotlin,Java
  2. 支持Android Build Variants
  3. Proguard免配置

ToyBricks局限性

ToyBricks具有傳染性。
任何Android Application 或者 Android Library 使用包含ToyBricks.json的jar包或者aar包作為依賴,都必須繼續使用ToyBricks,否則無法保證代碼能正確運行。

ToyBricks規則

每個模塊分為接口和實現兩個部分。接口部分提供給模塊外部調用,而實現部分則禁止來自外部的調用。

模塊劃分

接口 以@Interface進行注解,示例如下:

@Interface
public interface IText {

    String getText();
}

實現 以@Implementation進行注解,示例如下:

@Implementation(IText.class)
public class NewTextImpl implements IText {
    @Override
    public String getText() {
        return "NewTextImpl Implementation from "+ getClass().getCanonicalName();
    }
}

@Implementation更詳細的使用方法如下:

@Implementation(value = IText.class,global = true,singleton = true)
public class NewTextGobalImpl implements IText {
    @Override
    public String getText() {
        return "NewTextImpl Implementation from "+ getClass().getCanonicalName() ;
    }
}

參數說明如下:
1. value後麵應該填寫接口的class
1. global代表這個實現擁有高優先級。如果沒有設置,默認取值為false。
1. singleton代表這個實現將會以單例形式存在。如果沒有設置,默認取值為false。由於單例會一直存在於APP的整個生命周期,因此,不應該濫用單例。

使用ToyBricks應該遵守以下規則:
1. 接口命令強烈建議以I開頭,例如:IText
1. 每一個接口都必須至少有一個相應實現,否則編譯出錯。
1. 每個實現類必須是public的。
1. 每個實現類必須實現注解中標明的接口。
1. 每個實現類必須擁有一個默認無參數的構造函數。
1. 每個實現類不可以是abstract抽象類。
1. 實現一共分成三類,全局實現(global=true),普通實現(global=false),替補實現(按照默認的包名和類名進行加載)。它們的優先級從前往後一直降低。**每一類隻能同時存在一個實現,否則編譯出錯。**
1. 替補實現遵循以下規則:
假如接口為:com.github.snowdream.toybricks.app.IText,
則替補實現為:com.github.snowdream.toybricks.app.impl.TextImpl
實現的包名為接口的包名+".impl",實現的類名為接口名去掉第一個字母,第二個字母大寫,然後加上"Impl"。
1. 任何發布到Maven倉庫的庫,都應該將global設置為false。global設置為true,隻適合Android Application測試新實現,或者替換默認實現。

ToyBricks使用方法

由於ToyBricks對Android的Gradle編譯流程稍微進行了修改,因此,請注意按照下麵的說明進行詳細操作。
對於編譯流程的修改如下:
1. Android Application模塊:首先按照上麵的步驟生成ToyBricks.json,然後和依賴庫中的ToyBricks.json進行合並,校驗,最後按照預定規則,生成InterfaceLoaderImpl.java源代碼,並參與編譯。
1. Android Library: 通過APT生成Json文件(ToyBricks.json,生成目錄在“build/generated/source/apt”或者“build/generated/source/kapt”),然後打包到aar。如果你需要打包成jar包,並發布到maven倉庫,請參考下麵代碼:

task androidReleaseJar(type: Jar,dependsOn: "assembleRelease") {
    from "$buildDir/intermediates/classes/release/"
    from "$buildDir/generated/source/kapt/release/ToyBricks.json"
    from "$buildDir/generated/source/apt/release/ToyBricks.json"
    exclude '**/BuildConfig.class'
    exclude '**/R.class'
    exclude '**/R$*.class'
    includeEmptyDirs false
}

task androidJavadocsJar(type: Jar) {
    classifier = 'javadoc'
    from "generateReleaseJavadoc.destinationDir"
    includeEmptyDirs false
}

task androidSourcesJar(type: Jar) {
    classifier = 'sources'
    from android.sourceSets.main.java.srcDirs
    from "$buildDir/generated/source/kapt/release/ToyBricks.json"
    from "$buildDir/generated/source/apt/release/ToyBricks.json"
    includeEmptyDirs false
}

Gradle主工程

在主工程的build.gradle文件中添加ToyBricks的gradle插件。

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.2'

        classpath 'com.github.snowdream.toybricks:android-toybricks-gradle-plugin:0.9.10'
    }
}

Android Library模塊

在Library模塊的build.gradle文件中添加ToyBricks的相關庫依賴。

kapt {
    generateStubs = true
}

dependencies {
    compile "com.github.snowdream:toybricks:0.9.10@aar"
    compile "com.github.snowdream.toybricks:annotation:0.9.10"

    kapt "com.github.snowdream.toybricks:processor:0.9.10"
    //annotationProcessor "com.github.snowdream.toybricks:processor:0.9.10"
}

apply plugin: 'com.github.snowdream.toybricks'

注: 有兩種引用方式,一種是kotlin的kapt方式,需要配置上麵的generateStubs。另外一種,是Android默認支持的annotationProcessor方式。

如果你的工程中包含任何Kotlin源文件,則必須選擇kapt的方式,否則,可以選擇annotationProcessor方式。

Android Application模塊

在Application模塊的build.gradle文件中添加ToyBricks的相關庫依賴。


kapt {
    generateStubs = true
}

dependencies {
    compile 'com.github.snowdream:annotation:0.7@aar'

    compile "com.github.snowdream:toybricks:0.9.10@aar"
    compile "com.github.snowdream.toybricks:annotation:0.9.10"

    kapt "com.github.snowdream.toybricks:processor:0.9.10"
    //annotationProcessor "com.github.snowdream.toybricks:processor:0.9.10"
}

apply plugin: 'com.github.snowdream.toybricks'

ToyBricks使用方法

通過上麵的方式,開發好接口和實現模塊後。隻需要引用接口,就可以通過下麵方式獲取接口的實現:

IText text = ToyBricks.getImplementation(IText.class);

其中,IText為接口。

ToyBricks最佳實踐

按照替補實現的命名規則,來開發接口的實現類。

如果您對ToyBricks有什麼問題或者建議,歡迎通過後麵的聯係方式聯係我。

參考資料:

  1. SnowdreamFramework/ToyBricks
  2. SnowdreamFramework/log

聯係方式

sn0wdr1am

最後更新:2017-05-08 10:31:37

  上一篇:go linux tomcat 8080訪問不了
  下一篇:go Redis開發運維實踐常見運維操作之啟動