1、给项目添加Lambda
首先需要在项目project的build文件里面的dependencies 里面添加
dependencies {
classpath ‘me.tatarka:gradle-retrolambda:3.2.0’
}
然后在需要支持lambda的module的build里面添加如下代码:
但是光写这个是没用的,他依然会报错,所以我们就要声明,我们要用Lambda。怎么声明呢?如下,在对应的module的build里面
注意在build.gradle里面配置lambda的时候如下是无效的
org.gradle.api.tasks.compile.CompileOptions{//这里不能呢个使用导入的类
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
但可以是这样:
compileOptions {
sourceCompatibility org.gradle.api.JavaVersion.VERSION_1_8
targetCompatibility org.gradle.api.JavaVersion.VERSION_1_8
}
2、AndroidStudio中build文件配置的使用
AdroidStudio中使用的是Gradle自动构建工具
Gradle自动构建工具有一个重要属性,每当我们用AndroidStudio创建一个Android项目后,就会在项目的根目录中生成一个文件 gradle.properties,在Android项目中的任何一个build.gradle文件中都可以把gradle.properties中的常量读取出来
我们可以利用这一属性来实现组件化中Android项目application和library的切换,在gradle.properties里面定义一个常量来控制项目的module是否可以独立运行
3、AndroidStudio中build文件配置alibaba的路由系统ARouter
在所有需要使用到ARouter的moduel 下的build.gradle里添加:
这是为了让ARouter知道这个模块用来区别于其他模块的名字是什么
defaultConfig {
……
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : project.getName() ]
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
如果没有定义这一块会报如下错误:
错误: ARouter::Compiler An exception is encountered, [These no module name, at 'build.gradle', like :
apt {
arguments {
moduleName project.getName();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
// 跳转路由
compile 'com.alibaba:arouter-api:1.2.1'
- 1
这个整个项目只需要定义一个,定义在基础lib里面就可以
//跳转路由注释处理器
annotationProcessor 'com.alibaba:arouter-compiler:1.1.2.1'
- 1
这个每个使用了ARouter的module都需要在build里面定义
android组件化ARouter路由跨模块路由报错(There’s no route matched)
当在组件化工程下使用路由设置的时候容易出现一些问题,比如说在同module里面可以使用路由,但是从一个模块路由到另一个模块的页面的时候确报错说不存在这个页面
这可能是因为,之前我们在模块化开发的时候,只将页面定义在了一个Manifest里面也就是组件独立运行的manifest里面,但是当工程切换到集成模式的时候,加载的不是组件模式的manifest,而是集成模式下的manifest,因此就出现了这样的错误,所以以后对存在两种不同运行模式的module定义activity的时候要注意一定要在两个manifest里面进行定义
3、AndroidStudio中build文件配置ButterKnife,以及组件化项目和普通项目的配置的不同
普通项目:
compile 'com.jakewharton:butterknife:8.5.1'
//整个工程只需要定义一处
- 1
- 2
apply plugin: 'com.jakewharton.butterknife'
//使用butterknife的module都需要进行配置
......
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
//使用butterknife的module都需要进行配置
- 1
- 2
- 3
- 4
- 5
- 6
- 7
而在工程的根目录的build文件下面:需要定义butterKnife的插件
dependencies {
......
//ButterKnife使用
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
//组件化项目下的ButterKnife的使用(生成R2注释)
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
到这里为止一般项目的ButterKnife的配置已经完成
但是在组件化项目里面当我们将一个可以运行的module转成library类型的时候会出现一个问题:
当我们使用@bindView(R.id.iv_image)的时候会出现这样的报错:Attribute value must be constant
造成这个的原因就是在library里R.id.xxx不再是final类型了,也就不是常量了变成可变的,而注释的属性值需要传入的是常量。
解决方法:
1.在项目根目录的build.gradle下面添加
dependencies {
......
//组件化项目下的ButterKnife的使用(生成R2注释)
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
- 1
- 2
- 3
- 4
- 5
然后在module的build.gradle里面添加:
apply plugin: ‘com.neenbedankt.android-apt’ //有待检测
apply plugin: ‘com.jakewharton.butterknife’
- 1
- 2
- 3
library的build.gradle添加:
compile ‘com.jakewharton:butterknife:8.5.1’
- 1
然后在我们的activity中:
注意要使用R2
注意要使用R2 不要使用R 这样就可以使用啦。
另外还需要注意的有:
ButterKnife的R2是不可能做到你在布局文件里面添加一个组件之后,就立即可以在Activity里面使用R2来获取这个组件的,因为R2是在build工程的过程中生成的,因此想要使用的话就必须要build一次,当然如果你认为这个过程实在过于繁琐,那就尽量不再library里面使用butterKnife,老老实实使用findViewById就好了
针对那些一开始是可以运行的application,之后会修改成不能独立运行的library这样的业务组件来说,还可以在先使用ButterKnife,然后集成的时候将使用过ButterKnife的地方的R修改成R2就可以了
当对上面所说的业务组件的application或library进行修改的时候,可能会出现R2和R找不到的情况,这是因此R和R2此时都没有构建成功,所以报错找不到,此时可以build一下project,如果build也不成功的话,可以先清理clean一下project
4**组件化开发模式下ButterKnife和ARouter冲突以及解决办法**
上面我们解决了ButterKnife在组件化开发模式下的application和library状态切换导致的@BindView等注释无法使用的问题
之前的做法是在每个使用到ARouter的组件的build里面进行如下定义:
annotationProcessor"com.alibaba:arouter-compiler:1.0.3”
- 1
但是这样做只能实现模块内部的路由跳转无法实现模块之间的路由跳转,需要修改成下面这样:
apt "com.alibaba:arouter-compiler:1.0.3"
- 1
这样做的结果是:上面的没有找到路由的错误了,但是又出现了其他的问题:登录模块因为现在是处于继承开发模式,因此其使用butterKnife绑定的ID等都是使用的R2,但是现在跳转到登录模块的指定页面之后,butterKnife并不能绑定view成功,但是切换到一直设置为library模式的moduleLib发现却可以进行路由跳转,这是怎么回事?
这肯定是因为登录模块的配置有问题,应该参考moduleLib的配置
去掉登录模块作为library时设置的插件:
apply plugin: 'com.neenbedankt.android-apt'