问题描述
在Android 开发过程中butterknife是非常有名的第三方依赖库,应用其依赖注入功能可以极大的提高开发效率,但是butterknife在module中有一些坑需要注意。
在Android Studio 3.3 中使用butterknife 会出现编译产生不了R2.class情况。为解决这一情况,特此写下这篇文章小记一下。
解决方案
- 对于低于Android Studio 3.1,网络提供的解决方案是采用低版本的butterknife,一般是采用(butterknife8.4.0),通过实际测试发现生成不了R2.class
- 对于Android Studio 3.3。通过查询stackoverflow采用butterknife9.0.0以上版本。
- 项目的build.gradle配置
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.3.0'
// 引入butterknife 插件
classpath 'com.jakewharton:butterknife-gradle-plugin:9.0.0-rc2'
}
}
- APP build.gradle配置。注意:该项目中未采用API版本为28。原因是尚未熟悉AndroidX 未进行AndroidX适配
apply plugin: 'com.android.application'
android {
compileSdkVersion 27
defaultConfig {
applicationId "com.example.aa"
minSdkVersion 15
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
configurations.all {
resolutionStrategy {
force 'com.android.support:support-v4:27.1.0'
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support:support-v4:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
// 引入butterknife 且去除依赖兼容包
implementation('com.jakewharton:butterknife:9.0.0-rc1') {
exclude group: 'com.android.support'
}
annotationProcessor 'com.jakewharton:butterknife-compiler:9.0.0-rc1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation project(':bb')
}
- module配置
apply plugin: 'com.android.library'
// 必须引入,否则会生成不了R2.class
apply plugin: 'com.jakewharton.butterknife'
android {
compileSdkVersion 27
defaultConfig {
minSdkVersion 15
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:support-v4:27.1.1'
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
// 引入butterknife 且去除依赖兼容包
implementation ('com.jakewharton:butterknife:9.0.0-rc1'){
exclude group: 'com.android.support'
}
annotationProcessor 'com.jakewharton:butterknife-compiler:9.0.0-rc1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
遇到的问题
- 项目不采用AndroidX因此在编译的过程中发现问题,编译报错
error: resource android:attr/fontVariationSettings not found
通过stackoverflow描述确定是兼容库问题。经过确认项目中原先没有引入com.android.support:XX:28相关的版本,因此猜想是butterknife库引入导致,引入了com.android.support:XX:28兼容库,因此引入butterknife库是去除兼容库。代码如下
implementation ('com.jakewharton:butterknife:9.0.0-rc1'){
exclude group: 'com.android.support'
}
后续思考
原butterknife引入了兼容库,直接通过gradle进行去除,尚未在测试中发现会引起什么问题。后续测试中需要重点关注