【问题标题】:Only adding certain packages of external library只添加外部库的某些包
【发布时间】:2018-01-14 18:13:48
【问题描述】:

因为我在当前项目中需要bi-directional 地图,所以我正在查看

  • google guava 的 BiMap 和
  • Apache Collection 中的 BidiMap。

两个库都很漂亮big

那么,有什么方法可以只添加来自guava libraryBiMap class 或只添加来自Apache Collectionorg.apache.commons.collections4.bidimap 包?

干杯

【问题讨论】:

  • 提取相关类并添加到您自己的项目中。或者,将它们用作实现您自己的类的灵感。
  • 我将如何提取我需要的类?
  • 我相信你也可以使用 Gradle 来排除某些包
  • @cricket_007:这里的问题不是包,而是包中的各个类。 Guava 是一个巨大的,除了厨房水槽之外的一切图书馆。我还没有查看 Apache Collection 的大小。 OP 仍然可以使用该库并依靠 ProGuard 来摆脱多余的东西。

标签: java android


【解决方案1】:

您可以使用 Pro Guard。

为了使您的 APK 文件尽可能小,您应该启用压缩功能以删除发布版本中未使用的代码和资源。本页介绍了如何执行此操作以及如何指定在构建期间保留或丢弃哪些代码和资源。

见: Android ProGuard Docs


另请参阅: Stackowerflow Proguard Question

【讨论】:

    【解决方案2】:

    按照建议,使用 proguard 还应该从包含的库中删除未使用的方法和字段:https://developer.android.com/studio/build/shrink-code.html

    ProGuard 提供代码收缩功能,可检测并删除 打包中未使用的类、字段、方法和属性 应用程序,包括来自包含代码库的应用程序(使其成为 解决 64k 参考限制的宝贵工具)。

    (强调我的)

    如果您想手动执行此操作,那么下面是我尝试剥离番石榴以仅保留 HashBiMap 所需的依赖项。看起来它依赖于很多类。还要记住,proguard 在字节级别工作,因此剥离类永远不会像使用 proguard 删除未使用的代码那样有效。

    我使用来自 java 9 JDK 的jdeps 来查找实现BiMap 接口的HashBiMap 使用的所有依赖项。这表明它递归地依赖于整个 guava jar 的 35%(实际上 jar 中存在 1852 个类中的 666 个类)——更不用说 java.base 类了。重新打包后的jar文件有903KB,而原始jar文件为2.5MB(guava-23.0-rc1-android.jar)。

    以下是我使用的脚本(我还在示例 android 应用程序中测试了生成的 jar):

    # cleanup
    rm -rf guava_jar
    rm -rf guava_jar_stripped
    
    # unzip jar file
    unzip -qq guava-23.0-rc1-android.jar -d guava_jar
    
    # first lets see how many classes are in guava
    find guava_jar -type  f | wc -l
    
    # now use jdeps to find recursively dependencies for HashBiMap class. Each
    # dependency is a class name which after some string manipulations is used
    # to copy to guava_jar_stripped folder
    jdeps -R -verbose -cp ./guava-23.0-rc1-android.jar ./guava_jar/com/google/common/collect/HashBiMap.class \
        | sed -En 's/(.*)->.*/\1/p' \
        | sed -e 's/[[:space:]]*$//' \
        | sed -En 's/\./\//pg' \
        | uniq \
        | xargs -n 1 -I file rsync -qavR ./guava_jar/file".class" ./guava_jar_stripped
    
    # now lets see how many classes were copied
    find guava_jar_stripped -type  f | wc -l
    
    # now copy back manifest files
    rsync -qavR ./guava_jar/META-INF/* ./guava_jar_stripped
    
    # and finally create new jar from stripped classes
    cd ./guava_jar_stripped/guava_jar
    jar cf ../guava_jar.jar *
    

    和示例测试代码:

    BiMap<String, String> myBimap = HashBiMap.create();
    myBimap.put("Key", "value");
    myBimap.get("key");
    myBimap.inverse().get("value");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-16
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 2010-09-23
      • 2014-01-02
      • 1970-01-01
      相关资源
      最近更新 更多