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特性

  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

联系方式

时间: 2024-11-03 00:12:20

ToyBricks用户手册的相关文章

Android开发技术周报 Issue#17

Android开发技术周报 Issue#17 声明:所有内容收集整理自网络.如有侵权,请联系删除.微信公众号上请点击"阅读原文"阅读完整版本. 业界新闻 1. Google 正秘密开发第三款操作系统 Fuchsia 这是一款开源的.实时操作系统,被其称作Fuchsia.与Android和Chrome OS不同,Fuchsia不是基于Linux,它使用一个全新的.由谷歌开发的微内核,称作"Magenta". 2. 媲美 Google,腾讯推出自研图片编码格式 TPG

Velocity用户手册---中文版

中文 Velocity是什么? Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象. 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只关注页面的显示效果,而由java程序开发人员关注业务逻辑编码.Velocity将java代码从web页面中分离出来,这样为web站点的长期

Nice用户手册(一)

Nice用户手册 Daniel Bonniot Bryn Keller Francis Barber Fido Dido目录 目录 序 1.基本原理(philosophy) 2.包      main方法 3.类与接口      类声明      数据成员      构造器      参数类(parametric classes)      接口声明      枚举类 4.方法      方法声明      方法实现      值分派(value dispatch)      有名参数(name

一种带社会化帮助的用户手册交互设计

需求分析 公司一款较为复杂的软件需要产品升级,新版本相对旧版有较多改进,同时也增加了较多的新功能.为了让用户方便地进入使用状态,需要新的用户手册,对其进行重新设计. 那么,在交互设计过程中,需要如何进行用户手册设计呢? 对于一个新手来说,了解基本功能,是必须的. 用户看到创建一个具体实例,比简单地了解基本功能.用户在使用软件过程中,需要快速进入比较熟练的状态,他们不愿意将过多的时间浪费在入门阶段. 用户在使用过程中,需要将一些功能的使用方法以便签方式存储,同时也不排除所有人都一直处于一种熟练的状

ToyBricks简介以及原理分析

ToyBricks背景 我始终认为,在高内聚,低耦合的原则下,进行组件化,模块化,插件化都是移动应用开发的趋势. 为什么这么说呢?下面我们举个栗子:大家都知道,以前Android应用开发中,可以使用HttpClient或者HttpUrlConnection来进行http访问.这里假设有一个耦合严重,但代码量巨大的项目,使用了基于HttpClient封装的loopj/android-async-http来进行http访问.但是,后来,Google明确支持使用HttpUrlConnection.此时

Rafy 框架-发布网页版用户手册

前段时间把 Rafy 的用户手册由 CHM 格式转换为了网页格式,而且发布到了 github.io 上,即方便文档的实时更新,也方便大家查看. Rafy 用户手册网页版地址: http://zgynhqf.github.io/Rafy.       --------------------------------------------------------------------------- 附: 如何使用 github.io 来发布网页版帮助文档: https://help.github

【原创】rabbitmq-service用户手册(翻译)

      为了方便工作中使用,周末抽空对 rabbitmq-service 用户手册进行了翻译,鉴于自己水平有限,翻译中难免有纰漏产生,如果疑问,欢迎指出探讨. 官方原文:http://www.rabbitmq.com/man/rabbitmq-service.man.html ================ 我是分割线 ================== 通过 http://www.rabbitmq.com/manpages.html 可知 RabbitMQ 有5个 General Co

吐槽一下Activiti的用户手册和一本书

业余没事的时候,看了点Java的资料,无意之中发现了Activiti,就打算自己跑几个例子看看到底是怎么回事.一直搞底层,也得偶尔关心下上层到底发展到什么程度了不是. 悲惨的过程就是这么开始的,首先是Activiti的用户手册,第一次见到这么混乱的用户手册,完全打破了"Hello World"的过程.一上来你还没看到Activiti到底是什么东西的时候,就各种配置各种代码往上贴,好像生怕吓不走你一样.整个用户手册没有任何条理可研,如果按顺序看,是根本看不下去的,到最后也没琢磨明白这个用

VIM用户手册学习1

Remember  that  you  should  be  learning  by  doing, not  memorization. 1.零散的一些东西!a. CTRL-o 回到前一个位置(Notice:Type CTRL-T or CTRL-O <repeat to go further back>)b. 移动光标,按"k"上移,按"j"下移,按"h"左移,按"l"右移.图示如下: