模块

时间:2016-09-29 15:27:51

标签: android gradle android-gradle build.gradle project-structure

背景:

我有一个Android项目,我希望将特定函数重构为一个module。我的app结构如下所示:

MyApp
|--app
|----build.gradle
|--myNewModule
|----build.gradle
|build.gradle (MyApp Project)
|settings.gradle

任务:

在项目中,我有一些只在myNewModule中需要的依赖项,以及整个项目所需的一些依赖项,例如: okHttpClient

建议:

目前,我的gradle文件如下所示:

build.gradle(Project MyApp)

定义用于在整个项目中设置相同库版本的变量。

...
ext {

    butterknifeVersion = "7.0.1"
    daggerVersion = "2.6"
    moshiVersion = "1.1.0"
    okhttpVersion = "3.4.1"
    ...
}
...

build.gradle(MyNewModule) 定义此模块所需的依赖关系

...
dependencies {

    compile ("com.squareup.retrofit2:converter-simplexml:$retrofitVersion") {
        exclude group: 'stax', module: 'stax-api'
        exclude group: 'stax', module: 'stax'
        exclude group: 'xpp3', module: 'xpp3'
    }
    compile "com.squareup.okhttp3:okhttp-urlconnection:$project.okHttpVersion"
    compile "com.squareup.okhttp3:okhttp:$project.okHttpVersion"
    compile "com.squareup.okhttp3:logging-interceptor:$project.okHttpVersion"
    ....
} 
...

build.gradle(app) 定义其他依赖项,可以与MyNewModule中的依赖项重叠吗?

...
dependencies {
    compile "com.jakewharton:butterknife:$project.butterknifeVersion"
    compile "com.jakewharton.timber:timber:$project.timberVersion"
    compile "com.jakewharton.threetenabp:threetenabp:$project.threetenabpVersion"

    compile "com.squareup.okhttp3:okhttp-urlconnection:$project.okHttpVersion"
    compile "com.squareup.okhttp3:okhttp:$project.okHttpVersion"
    compile "com.squareup.okhttp3:logging-interceptor:$project.okHttpVersion"
    ...
}
...

问题:

  • 如果我对不同模块中的同一个库有依赖关系,那么Android会将其识别为一个依赖关系,还是会将apk的dexcount加倍?
  • 这是定义依赖关系的好方法吗?在我的例子中,myNewModule将包含仅在其中需要的依赖项,但两个模块可能包含相同的依赖项,因为它们都需要它们(例如,将okHttp客户端添加到两个模块,因为两个模块都需要它们)
  • 或者,我是否可以将公共依赖项直接放入Project中的build.gradle文件中,就像使用模块build.gradle文件一样?

build.gradle(Project MyApp)

在这里添加整个项目的所有依赖项?

...
dependencies {
    compile "com.jakewharton:butterknife:$project.butterknifeVersion"
    compile "com.jakewharton.timber:timber:$project.timberVersion"
    compile "com.jakewharton.threetenabp:threetenabp:$project.threetenabpVersion"

    compile "com.squareup.okhttp3:okhttp-urlconnection:$project.okHttpVersion"
    compile "com.squareup.okhttp3:okhttp:$project.okHttpVersion"
    compile "com.squareup.okhttp3:logging-interceptor:$project.okHttpVersion"
    ...
}
...

我只是想遵循良好的设计模式,并且不会增加项目的dexcount,因为它使用了很多库,并且接近多dex,我想避免使用。

编辑:我改变了第二个问题的措辞,因为它有误导性。 我只是想在两个模块中添加一些相同的依赖项,因为我可能会从myNewModule中创建一个单独的库,然后它仍然需要例如一个okHttpClient,不能再依赖主项目中的依赖。

1 个答案:

答案 0 :(得分:1)

  

如果我在不同的模块中对同一个库有依赖关系,那么Android会将其识别为一个依赖关系,还是会将apk的dexcount加倍?

Gradle自动处理它 如果要在库中以及使用库的模块中添加相同的依赖项,gradle将仅添加一次

  

这是定义依赖关系的好方法吗?在我的例子中,myNewModule将包含仅在其中需要的依赖项,以及应用程序模块中所需的依赖项。

不在我看来。
您的图书馆应包含仅包含所需的依赖项 没有理由包含将使用它的模块将使用的依赖项。

  

否则,我是否可以将公共依赖项直接放入项目的build.gradle文件中?

问题不是那么清楚 每个模块都应该具有依赖关系,但您可以按照问题中描述的方式集中它们。