安卓开发学习之为项目添加模块依赖

背景

比如我们新建了一个项目,名曰Client,因为需要,Client依赖于之前写的某个项目,这么做呢?步骤如下


步骤

1、在Client项目里,导入module



2、在弹出的对话框里,选择源目录,选中import,给模块起个名字(默认是:app,但这个已经被Client占了,就得换个名)



3、然后,在Client的项目结构里,选app模块的依赖标签,点击下面的加号,选择添加模块依赖,点击ok


点击myMoudle,再ok



4、然而并不顺利,报错如下



5、只需要在新建的myModyle的build.gradle中进行如下图的操作就可以了



额外的坑

一般情况下,上面五步就可以导入新的模块并建立依赖。但由于我导入的模块中用了butterKnife黄油刀,就出现了一些额外的错,解决方法记录如下

ButterKnife 错误: 元素值必须为常量表达式

这是由于建立依赖后R类的id少了final字段,解决方法如下:

1、在项目的build.gradle文件里,添加butterknife的依赖,版本要和使用到butterknife的模块(我这儿是myModule)gradle文件里的一致,同时添加mavenCentral()仓库(否则会下载超时),更改完的项目gradle文件如下

buildscript {
    
    repositories {
        google()
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
        classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        mavenCentral()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

注意butterknife的版本不要用8.8及以上的,会报错如下:

> Failed to notify project evaluation listener.    > com.android.build.gradle.api.BaseVariant.getOutputs()Ljava/util/List;


2、找到所有用butterknife绑定id的地方,把R.id.xx改成R2.id.xx

@BindView(R2.id.tv_item) TextView textView;
    @OnClick(R2.id.btn_share)
    public void share() {
        ...
    }

而后重新构建,完事儿


Error:com.android.builder.dexing.DexArchiveBuilderException:

据说用编译器d8就可以,在gradle.properties文件里加一行android.enableD8=true,文件内容如下
org.gradle.jvmargs=-Xmx1536m
android.enableD8=true

重新构建,完事儿


Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'. > More than one file was found with OS independent path 'META-INF/rxjava.properties'

这个好像是导入模块有RxJava引发的,我的解决方法是把所有模块的gradle文件的android结点下,加这么一段话:

    packagingOptions{
        exclude 'META-INF/rxjava.properties'
    }

其中一个模块的gradle文件完整内容如下:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "com.example.songzeceng.client"
        minSdkVersion 24
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    packagingOptions{
        exclude 'META-INF/rxjava.properties'
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support.constraint:constraint-layout:1.1.0'
    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(':server')
    implementation project(':myModule')
}

其他模块的gradle文件改动类似


结语

可以理解为何单位项目很少添加新的第三方库依赖了,首先要对第三方库改动以适合单位自己的需求,其次由于单位项目模块间的依赖关系比较复杂,添加第三方库依赖容易出现问题,而且改起来成本不低。


猜你喜欢

转载自blog.csdn.net/qq_37475168/article/details/80569010