ToyBricks用戶手冊
注:閱讀本文之前,建議先閱讀一下:
ToyBricks簡介以及原理分析
ToyBricks簡介
ToyBricks是一個Android項目模塊化的解決方案,主要包括四個部分,APT注解,APT注解處理器,ToyBricks插件(Gradle Plugin),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特性
- 同時支持Kotlin,Java
- 支持Android Build Variants
- 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有什麼問題或者建議,歡迎通過後麵的聯係方式聯係我。
參考資料:
聯係方式
- Email:yanghui1986527#gmail.com
- Github: https://github.com/snowdream
- Blog: https://snowdream.github.io/blog/
- 簡書:https://www.jianshu.com/u/748f0f7e6432
- 雲棲博客:https://yq.aliyun.com/u/snowdream86
- QQ群: 529327615
- 微信公眾號: sn0wdr1am
最後更新:2017-05-08 10:31:37