【问题标题】:Reducing Android library size if it is depended on other library's specific parts如果依赖于其他库的特定部分,则减少 Android 库的大小
【发布时间】:2017-05-26 13:48:15
【问题描述】:

我正在开发一个 Android 库模块

我的图书馆:https://github.com/sangeethnandakumar/TestTube

我没有重新发明轮子,而是依靠其他一些库来完成我的工作。 在我的库命名空间中包含 6 个库后,我的库达到了大约 1.8 MB

我的库仅依赖于其他库的特定功能,但整个库正在导入和集结。

有没有一种方法可以减少我的库大小,即使在包含所有 6 个库之后也是如此?我的库已经优化。

【问题讨论】:

  • 如果您使用的库被打包(不是源代码) - 您不能。如果有源代码并且该库受某些公共许可(MIT 左右)并且您可以自己重用此库许可 - 您可以删除和编译您感兴趣的部分代码。
  • “在我的库命名空间中包含 6 个库之后”——这到底是什么意思?您是指testtube/build.gradle 文件中的七个compile 依赖项吗?
  • 是的。我指的是 Gradle 编译依赖于 testtube/build.gradle

标签: android performance android-studio


【解决方案1】:

在我的库命名空间中包含 6 个库后,我的库达到了大约 1.8 MB。

您的库不是 1.8 MB。您的库 及其 8 个依赖项 组合(带有传递依赖项)可能为 1.8 MB。毕竟,这 8 个依赖项之一是 appcompat-v7,我上次查看时,它本身就超过 1 MB。

我的库已经优化。

不,不是。您同时依赖 Volley 和 OkHttp。这些做同样的事情。摆脱一个。由于您也在使用 Picasso,因此我建议您摆脱 Volley。

有没有办法减少我的库大小,即使包括了全部 6 个?

摆脱不需要的依赖项(例如 Volley)。

如果您的图书馆的消费者可能不需要您图书馆的所有功能,请将您的图书馆分成几部分。例如,如果您的库的某些使用者可能想要您的网络代码而不是您的 UI 代码,您可能会创建 testtube-coretesttube-ui 或其他东西。 testtube-core 会抛弃纯 UI 的东西(例如,appcompat-v7),因此对于只需要 testtube-core 功能的消费者来说,他们会得到一个更小的库。 testtube-ui 将依赖于testtube-core,因此使用testtube-ui 的消费者将获得所有依赖项,而您的testtube-ui 代码可以调用testtube-core 代码来完成需要完成的工作。

除此之外,您将不得不依靠应用级别的缩小(例如 ProGuard)来摆脱不必要的东西。请记住,应用程序开发人员可能会使用您的库并且需要您自己的依赖项中的东西。 appcompat-v7 就是一个很好的例子:仅仅因为 you 可能只需要appcompat-v7 的一部分并不意味着 app 只需要相同的一部分。 p>

这就是为什么the comment advising you to clone the code and get rid of pieces 不是很聪明的原因。充其量,这可能适用于使用您的库的应用程序开发人员可能不需要的晦涩库(例如,无论 gun0912.ted:tedpermission 是什么)。但是,如果应用程序还将这些库用于其他目的,则创建自己的 appcompat-v7gson 或其他内容的黑客副本会使大小问题变得更糟。

【讨论】:

  • 很好的答案 CommonsWare。你一目了然地解释了一切。由于我打算在旧版 Android 上使用我的库,所以不能忽略 appcompat v7。来到 Volley 和 OkHttp,你是对的,我会检查一下。 Picasso 和 Volley 也不同,我不能用 Picasso 进行服务器调用,但 Volley 可以。现在我计划将我的库拆分为一组中间库。无论如何#你解决了我#Upvoted
  • @Kannan:“我无法使用 Picasso 进行服务器调用”——当然可以。这是来自my booka sample app,它显示使用毕加索下载与在堆栈溢出中android 标签上提出最近问题的人相关的头像图像。
  • 查看了您的示例应用程序。我知道它可以从提供给毕加索的 URL 下载图像,但是 Http GET/POST 呢?这就是我集成 Volley 的原因。我觉得 Volley 比 okHttp 好得多,甚至其他人都反对这一点。
  • 我不希望我的库尽可能简化 Android 任务。我需要运行我的库以进行图像下载、http get/post 调用、ftp 上传/下载/获取以及几乎所有内容。这就是为什么一切都聚集在一起的原因。因此,我怎样才能终止 Volley & Picasso?我很困惑
  • @Kannan:“但是 Http GET/POST 呢?这就是我集成 Volley 的原因。我觉得 Volley 比 okHttp 好得多,甚至其他人都反对这一点。” - 我不同意。但是,无论如何,您不需要 both Volley OkHttp。如果你想使用 Volley,那是你的决定,然后摆脱 OkHttp。 “这就是为什么一切都聚集在一起”——然后停止抱怨大小。如果你想做所有事情,你必须有可以做所有事情的代码,这将是很大的。就个人而言,我更喜欢许多小型、重点突出的库,而不是像您正在创建的那种大型库。
猜你喜欢
  • 1970-01-01
  • 2011-07-16
  • 2011-08-15
  • 2018-04-09
  • 2012-06-21
  • 2020-12-08
  • 1970-01-01
  • 2014-03-22
相关资源
最近更新 更多