比如我们新建了一个项目,名曰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文件改动类似
可以理解为何单位项目很少添加新的第三方库依赖了,首先要对第三方库改动以适合单位自己的需求,其次由于单位项目模块间的依赖关系比较复杂,添加第三方库依赖容易出现问题,而且改起来成本不低。