Android Gradle:添加依赖项的利弊
在Android Gradle:添加依赖项的利弊,android,gradle,dependencies,android-gradle-plugin,android-library,Android,Gradle,Dependencies,Android Gradle Plugin,Android Library,在build.gradle中添加依赖项,而不是将它们作为依赖库添加,有哪些优点/缺点 dependencies { compile project(':library') ... compile 'com.stackoverflow.android:some-great-library:1.0' ... } 在从事Android项目时,我经常会遇到一些很棒的库,它们都是我一直在寻找的解决方案。然而,由于我所需要的只是那些特定库所能提供的功能的一小部分,我担心将它
build.gradle
中添加依赖项,而不是将它们作为依赖库添加,有哪些优点/缺点
dependencies {
compile project(':library')
...
compile 'com.stackoverflow.android:some-great-library:1.0'
...
}
在从事Android项目时,我经常会遇到一些很棒的库,它们都是我一直在寻找的解决方案。然而,由于我所需要的只是那些特定库所能提供的功能的一小部分,我担心将它们添加为Gradle依赖项
是一种过分的做法
根据@commonware的评论,我有更具体的问题。 添加依赖项是否会:
最让人担心的是你的android应用程序的大小。 许多方法或类可能会提高dex文件的64k限制,并且大多需要启用多dex或巨型模式。如果你有非常过时的客户,这可能会给你带来一些兼容性问题 有时,您可能希望通过提取所需的类来解决这个问题,但有时这不是一件容易的工作 如果启用了proguard,则可以系统地删除未使用的类 是否将第三方库添加为依赖项 当您的程序在编译时或运行时使用第三方库中的某些代码时,可以声明对该库的依赖关系。这意味着当程序运行时,第三方代码必须是可访问的,因此它与程序一起打包。因此,应用程序大小增加,这是不希望的,因为许多用户不喜欢大型应用程序。当你的程序很小而第三方库很大时,这也很荒谬 是否将第三方库添加为模块 我从未这样做过,但如果我理解正确,这与在项目中复制库是一样的,所以您可以修改它。如果使用发行版,则编译时间与远程依赖项编译时间没有差异。所有内容都与上一段相同,但除此之外,您可以自由修改代码(如果第三方库许可证允许) 是否只添加所需的代码 如果您只需要库中的几个方法,并且提取它们并不困难(同样,假设许可证允许这样做),那么这是最好的解决方案。另一方面,如果您使用一些可靠的第三方功能,并且希望在项目中提取和修改它,那么将来可能会面临维护问题(如果您决定迁移到新版本) 添加依赖项:是否会显著降低编译时间 使用正确的渐变调优(在后台作为守护进程工作,使用并行处理),您不会在典型项目中看到任何显著的变化 添加依赖项:增加发布apk和 调试apk,以及添加的依赖项的大小
依赖项jar被发送到dex进行字节码转换,以及项目代码。就大小而言,这不是1:1的转换,所以答案是否定的。ProGuard也有一些使jar大小最小化的技巧,Maven有一个将所有依赖jar打包在一个jar中的方法,因此它们都可能被混淆。将第三方库的代码复制到您的项目中会导致支持该项目时出现一些问题 如果您需要使用更新版本的库,该怎么办?
如果您将它添加为依赖项,那么您所需要的只是在构建系统配置中更改版本号我认为这个问题不是非常依赖于Gradle,而是更一般地通过使用“依赖项管理工具” 当然,在某些情况下,我们只需要库的一个子集。在这些情况下,必须导入整个依赖项可能不是最佳解决方案 “杀伤力过大”要多少钱?显然,这取决于项目的规模。这取决于您评估依赖项的“过度杀伤力”:例如,如果您只需要一个简单的函数,而您正在导入一个3MB的库,可能是的,这有点“过度杀伤力” 此外,您还必须考虑到,通常将“大”库划分为模块,因此只能导入所需的模块。对于Android,正如@phdfond所说,您可以使用ProGuard在构建时删除未使用的类,也可以使用Gradle手动排除它们:
//...
sourceSets {
main {
java {
exclude '**/IDontWantThisClass.java'
}
}
但是这种情况并不常见,通过使用Gradle或其他“依赖项管理工具”(注意,在Gradle、Maven、ecc中,依赖项管理只是它们的功能之一),您可以获得很多优势
例如,如果您使用Gradle一目了然,您就知道您的依赖项,您可以轻松地添加/删除它们,或者只是更改一个数字来更新它们的版本。
您是否曾经认为您的项目可以依赖于libs B和C,而B和C都可以依赖于lib D的两个不同版本?Gradle也可以在这种情况下帮助你。
我不能在这里继续,因为我会偏离主题,但是你可以找到很多关于这个工具的信息
最后,我认为“依赖项管理工具”最重要的“缺点”是初始学习和设置时间。如果你从未使用过像Gradle这样的工具,那么第一次使用Gradle肯定比拖放一个jar要花更多的时间,所以我强烈建议你在项目中使用Gradle,除非它是一个“玩具项目”。在Gradle构建项目中添加子项目的依赖项有什么优点/缺点?
dependencies {
compile project(':library')
}
dependencies {
compile 'com.stackoverflow.android:some-great-library:1.0'
}
专业人士
- 可以更改:库子项目中的代码
- 自行管理:库子项目的版本
在Gradle构建项目中从版本化的依赖库中添加依赖项的利弊是什么?
dependencies {
compile project(':library')
}
dependencies {
compile 'com.stackoverflow.android:some-great-library:1.0'
}
专业人士
- 清除包含版本的直接依赖项
1. slow down compilation time at a noticeable rate?
Too many references: 66539 error; max is 65536.
2. `increase the size of release-apk and debug-apk, as much as the size of the added dependency?`