一.首先描述下使用场景和出现的问题:
AS2.3.1 Gradle2.2.3 ButterKnite 7.0.1 升级了As到3.1.3 Gradle2.3.2 ButterKnite8.8.1
因为新项目采用的是组件化开发,而且当中有一个Common的Module作为公共的BaseModule大部分公共库放在里面,当然butterKnite也放在里面。另外有个Module1的业务模块依赖了Common模块当中也使用了ButterKnite ,app的Module也依赖了Common模块当中也使用了ButterKnite sync之后报了错。找不到id.
下面我们先不管上面的问题先来认识一下apt和annotationProcessor
android-apt是由一位开发者自己开发的apt框架,源代码托管在这里,随着Android Gradle 插件 2.2 版本的发布,Android Gradle 插件提供了名为 annotationProcessor 的功能来完全代替 android-apt ,自此android-apt 作者在官网发表声明最新的Android Gradle插件现在已经支持annotationProcessor,并警告和或阻止android-apt ,并推荐大家使用 Android 官方插件annotationProcessor。
2、annotationProcessor
annotationProcessor是APT工具中的一种,他是google开发的内置框架,不需要引入,可以直接在build.gradle文件中使用,如下
dependencies{
xxx
annotationProcessor'com.jakewharton:butterknife-compiler:8.8.1'
}
回到上面的问题,我们先来解决掉它。
@1.在公共BaseModule:Common的library的build.gradle的
dependencies {
...
compile'com.jakewharton:butterknife:8.8.1'//最新版本
}
@2.在每个想使用butterknife的library的build.gradle头部加入apply
applyplugin:'com.jakewharton.butterknife'
//gradle2.2以前用apt
//apply plugin: 'android-apt' //新添加
dependencies {
...
annotationProcessor'com.jakewharton:butterknife-compiler:8.8.1'//最新版本
//gradle2.2以前用apt 如果2.2以后用apt会报警告编译会通过
// apt'com.jakewharton:butterknife-compiler:8.8.1'
}
3.在项目build.gradle中
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath'com.jakewharton:butterknife-gradle-plugin:8.8.1'
//classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' //gradle2.2以前用apt
}
}
二、使用注意
1)8.4.0之前的butterknife注解是不支持在library中使用的,library中定义的R文件中id都不是final的,8.4.0之后的butterknife版本加入了对library project支持,所以在library中使用时,和之前有所差异,自动生成的
@BindView(R.id.xxx)EditTextusername;
需要替换成
@BindView(R2.id.xxx)EditTextusername;
appModule还是用R.id.xxx.
over到此结束!mark一下
写的不好请指正!
网友评论