Android 组件化butterknife问题

问题描述

在Android 开发过程中butterknife是非常有名的第三方依赖库,应用其依赖注入功能可以极大的提高开发效率,但是butterknife在module中有一些坑需要注意。
在Android Studio 3.3 中使用butterknife 会出现编译产生不了R2.class情况。为解决这一情况,特此写下这篇文章小记一下。

解决方案

  1. 对于低于Android Studio 3.1,网络提供的解决方案是采用低版本的butterknife,一般是采用(butterknife8.4.0),通过实际测试发现生成不了R2.class
  2. 对于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进行去除,尚未在测试中发现会引起什么问题。后续测试中需要重点关注

你可能感兴趣的:(android)