2017-08-07 47 views
0

的某些包因为我需要在我目前的项目bi-directional地图我看只有添加外部库

  • 谷歌番石榴的BIMAP和
  • Apache的集合的BidiMap。

的库两者都是相当big

那么,有没有什么办法可以只添加从guava library或只从Apache Collectionorg.apache.commons.collections4.bidimapBiMap class

欢呼声

+0

提取相关类并将它们添加到自己的项目。或者,将它们用作实施自己班级的灵感。 – CommonsWare

+0

我将如何去提取我需要的类? –

+0

https://docs.oracle.com/javase/tutorial/deployment/jar/unpack.html –

回答

0

您可以使用Pro Guard。

要使您的APK文件尽可能小,您应该启用收缩以删除发布版本中未使用的代码和资源。本页面描述了如何做到这一点,以及如何指定在构建期间保留或放弃哪些代码和资源。

参见: Android ProGuard Docs


参见: Stackowerflow Proguard Question

0

至于建议,使用ProGuard应该包含的库中删除未使用的方法和字段也:https://developer.android.com/studio/build/shrink-code.html

代码ProGuard可以缩小尺寸,它会检测并从您的打包的 应用程序,包括那些来自包含的代码库(使其成为用于解决64k参考极限的有价值工具)中的未使用的类,字段,方法和属性中删除 。

(重点煤矿)

如果你想这样做手工然后下面是我尝试在剥离番石榴,只留下由依赖关系需要HashBiMap。它看起来像依赖于很多类。还要记住,proguard在字节级别工作,所以剥离类将永远不会像使用proguard去除未使用的代码那样有效。

我用java 9 JDK中的jdeps找到HashBiMap实现BiMap接口所​​使用的所有依赖关系。这表明它递归地依赖于35%的整个番石榴jar(实际上存在于jar中的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");