避免在项目中嵌入外部库

您经常会听到这样的短语:“为什么要写自行车?取一个现成的库并使用它!一切都已经为您编写。” 特别是新手开发人员会听到这样的表达。解决任何问题时,他们开始研究现成的库,然后漫不经心地将它们放入项目中。在本文中,您将学习漫无目的地引入第三方库可能导致的后果。



潜在问题



我强烈建议您避免向项目中添加外部库。但是,这并不意味着使用库是有害的,并且应该完全清除Gradle文件中的所有外部依赖项!我想传达的想法是,在添加新库之前需要进行非常认真的分析。为了了解如何解析库,让我们看一下在向项目中添加新库时可能遇到的潜在问题。



申请规模



大多数库不会大大增加应用程序的大小。但是有这样的库,添加后,您的应用程序将大大增加!例如,Realm可以将APK大小从4MB增加到12MB。平均而言,该应用程序的重量为100MB-200MB,额外的8MB可能不会引起注意。但是请记住,Realm不是唯一会对APK大小产生负面影响的库。是否可以使用此依赖项来减少APK的大小?是的,可以按处理器体系结构拆分apk。但这会导致下一个问题(第2点)。



代码可维护性



项目在不断发展,涉及越来越多的逻辑,有时很难理解它们。因此,经过几年的项目开发,任何新开发人员都可以轻松地习惯该项目,因此需要一个清晰的项目架构。但是,某些库可以使项目的可维护性无效。例如,对EventBus的不正确使用会极大地混淆应用程序的逻辑。清楚地区分您在何处以及在什么情况下使用此库非常重要。并且要确保没有人会偏离这些规则。但是实际上会发生什么?几乎每个以EventBus开头的开发人员都在各处使用它。结果,该项目变得完全不可读。



是时候去图书馆了



添加新库时,您需要学习如何与之交互。有些库可能会对将来的开发速度产生非常不利的影响。

例如,Google的PagingLibrary花费很多精力来弄清楚如何与之交互。每个新开发人员都需要12到20个小时才能弄清楚该库。您损失了将近3天!在这三天内,您可以写下您的分页并独立于第三方解决方案。



建立速度



现代应用程序的构建速度很差。但是,如果您想增加构建时间,请使用Dagger我不知道为什么Kotlin出现后仍在积极使用该库。在大多数情况下,Dagger包含上述所有4个问题。



错误,错误,错误...



以我的经验,在一个项目中,由于其中存在bug,我发现了5个库。请记住,库中几乎总是存在错误。例如:



  • AndroidPdfViewer会导致内存泄漏,错误地处理某些情况为null的情况,这将引发NullPointerException
  • 在某些情况下,Android导航组件无法与Shared Elemant动画一起正常使用
  • 由于以下原因,Cicerone有时会使应用程序崩溃executePendingTransactions()


这是否意味着不值得使用库?不,可以并且应该使用库,但是至少要确保问题列表中没有针对您的项目的严重错误,这一点很重要。



库中的漏洞



您知道只检查一个源代码即可一次破解多个应用程序的最简单方法吗?我们需要在许多开发人员使用的大型库中找到一个错误。并通过此漏洞来访问您的应用程序的数据。如果您不打算开发需要高度关注用户安全性的应用程序,那么您可以对此视而不见。如果不是,则寻找可解决潜在漏洞的问题。



图书馆支持



如果该库一年没有更新,请询问是否值得使用。事实是,库中定期存在错误。如果未修正这些错误,那么值得使用此库吗?在不久的将来,您可能会偶然发现一个库错误,并且您将不得不寻找实现该功能的替代方法。有一些库需要适应当前的Android API的功能。例如,如果一个新元素出现在Android中,那么您需要为其添加支持。这些库包括不再支持的Anko现在,在大型项目中使用此库没有任何意义。



该库存在于项目的所有层中



RxJavaPagingLibrary之类的迫使开发人员在应用程序的每一层上使用其API。如果您确定该库将始终存在于项目中,则没有问题。但是,如果由于某种原因您不得不删除该库,那么您将付出巨大的努力!您将不得不重写项目的一半。



图书馆限制



每个库都提供一个受公用方法和内部实现的限制API确保该库的功能足以满足您的需求。例如,流行的Android导航组件非常适合开发人员。它不提供show,hide,add方法(FragmentTransaction具有)。此外,当需要存储选项卡的历史记录时,该库会使BottomNavigationView的工作复杂化。



具有依赖关系的巨大Gradle文件



当我进入一个新项目时,我要做的第一件事是查看Gradle文件中的依赖项。它使应用程序可以做什么以及如何解决某些任务变得很清楚。但是当我看到OkHttp,Retrofit和Volley(fork)都用于网络时,我感到很惊讶。那仅仅是网络。Gradle文件本身包含大量的库,对该库的支持已在很久以前终止了。当一个开发者独自一人时,他可以将整个项目放在脑子里,但是当新的开发者来时,理解这样的项目变得极其困难。



实施库之前的问题清单



  1. 这个图书馆有什么问题?它们对我的项目至关重要吗?
  2. 开发人员社区如何测试此库/技术?她在GitHub上有几颗星?
  3. 开发人员多久响应一次问题?
  4. 开发人员多久更新一次库?
  5. 新开发人员将花费多少时间来学习所使用的技术?
  6. 该库将如何影响应用程序的大小?
  7. 该库将如何影响应用程序的速度?
  8. 库将如何影响构建速度?它可以帮助您节省开发时间吗?
  9. 图书馆是否有漏洞?
  10. 该库会出现在项目的每一层吗?这有多重要?
  11. 库如何限制开发人员的选择(几乎总是限制)。是好还是坏?
  12. 我是否可以自己编写一个解决方案,以便在合理的时间内针对我的项目进行改进?


听到您在选择图书馆时还会寻找什么,这很有趣。我期待评论,反馈和问题!



All Articles