ToyBricks用户手册
注:阅读本文之前,建议先阅读一下:
ToyBricks简介以及原理分析
ToyBricks简介
ToyBricks是一个Android项目模块化的解决方案,主要包括四个部分,APT注解,APT注解处理器,ToyBricks插件(Gradle Plugin),ToyBricks库。
其中:
- APT注解,主要定义了两个注解:Interface(接口,例如:IText),Implementation (实现,例如:TextImpl)
- APT注解处理器,在javac编译java源码之前。APT注解处理器会扫描Java源码中带有上面两个注解的接口和类,并且生成一个json文件, ToyBricks.json.
- ToyBricks插件(Gradle Plugin),负责ToyBricks.json的打包,合并,生成Java源文件等工作
- 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() ; } }
参数说明如下:
- value后面应该填写接口的class
- global代表这个实现拥有高优先级。如果没有设置,默认取值为false。
- singleton代表这个实现将会以单例形式存在。如果没有设置,默认取值为false。由于单例会一直存在于APP的整个生命周期,因此,不应该滥用单例。
使用ToyBricks应该遵守以下规则:
- 接口命令强烈建议以I开头,例如:IText
- 每一个接口都必须至少有一个相应实现,否则编译出错。
- 每个实现类必须是public的。
- 每个实现类必须实现注解中标明的接口。
- 每个实现类必须拥有一个默认无参数的构造函数。
- 每个实现类不可以是abstract抽象类。
- 实现一共分成三类,全局实现(global=true),普通实现(global=false),替补实现(按照默认的包名和类名进行加载)。它们的优先级从前往后一直降低。每一类只能同时存在一个实现,否则编译出错。
- 替补实现遵循以下规则:
假如接口为:com.github.snowdream.toybricks.app.IText,
则替补实现为:com.github.snowdream.toybricks.app.impl.TextImpl
实现的包名为接口的包名+".impl",实现的类名为接口名去掉第一个字母,第二个字母大写,然后加上"Impl"。
- 任何发布到Maven仓库的库,都应该将global设置为false。global设置为true,只适合Android Application测试新实现,或者替换默认实现。
ToyBricks使用方法
由于ToyBricks对Android的Gradle编译流程稍微进行了修改,因此,请注意按照下面的说明进行详细操作。
对于编译流程的修改如下:
- Android Application模块:首先按照上面的步骤生成ToyBricks.json,然后和依赖库中的ToyBricks.json进行合并,校验,最后按照预定规则,生成InterfaceLoaderImpl.java源代码,并参与编译。
- 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: http://snowdream.github.io/blog/
- 简书:http://www.jianshu.com/u/748f0f7e6432
- 云栖博客:https://yq.aliyun.com/u/snowdream86
- QQ群: 529327615
- 微信公众号: sn0wdr1am
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
单例模式(java&iOS)
O(∩_∩)O单例:意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类,单例模式是最简单的开发模式。 1.单例模式的要点: 显然单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。 2.单例模式的优点: 单例的的有点是可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问 从而方便地控制了实例个数,并节约系统资源 单例在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次),一般用于工具类。例如:登陆控制器,网络数据请求,音乐播放器等一个工程需要使用多次的控制器或方法。 一 , java中单例的创建 饿汉式 class Singleton{ //1.先创建静态私有实例 private static final Singleton instance = new Singleton(); //2.创建静态私有 getter方法 public static Singleton getInstance(){ return instance; } //3...
- 下一篇
iOS 调试时的错误:Couldn't register com.xxxx with the bootstrap server
今天发现在使用iPad进行真机调试时,前几次都没问题,后来就一直运行不起来了,xcode的输出窗口显示如下信息: Couldn't register com.autodesk.Material-Demo with the bootstrap server. Error: unknown error code. This generally means that another instance of this process was already running or is hung in the debugger. 意思是调试器中已经有一个进程正在运行了,我尝试过在iPad中把应用删除,但是不管用。 上网搜了一下:按照下面步骤就可以了: 断开数据线连接,重新启动iPad。 Xcode中,清理一下项目, product-->Clean: 重新连接数据线 重新启动在iPad上的调试。 成功! 作者: 峻祁连 邮箱:junqilian@163.com 出处: http://junqilian.cnblogs.com 转载请保留此信息。 本文转自峻祁连. Moving to Clou...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS6,CentOS7官方镜像安装Oracle11G
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装