2017-08-07 1 views
0

Da ich eine bi-directional Karte in meinem aktuellen Projekt muss ich betrachteteZugabe nur bestimmte Pakete von externen Bibliothek

  • google Guave der bimap und
  • die BidiMap von Apache Collection.

Beide Bibliotheken sind ziemlich big

So ist es eine Möglichkeit, nur die BiMap class vom guava library hinzufügen oder nur das org.apache.commons.collections4.bidimap Paket aus dem Apache Collection?

Prost

+0

die entsprechenden Klassen extrahieren und sie zu Ihrem eigenen Projekt hinzufügen . Oder verwenden Sie sie als Inspiration für die Implementierung Ihrer eigenen Klasse. – CommonsWare

+0

Wie würde ich die benötigten Klassen extrahieren? –

+0

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

Antwort

0

Sie könnten Pro Guard verwenden.

Um Ihre APK-Datei so klein wie möglich zu machen, sollten Sie Schrumpfung aktivieren, um nicht verwendeten Code und Ressourcen in Ihrem Build zu entfernen. Auf dieser Seite wird beschrieben, wie dies durchgeführt wird und wie der Code und die Ressourcen angegeben werden, die während des Builds beibehalten oder gelöscht werden.

See: Android ProGuard Docs


Siehe auch: Stackowerflow Proguard Question

0

Wie vorgeschlagen, mit proguard sollte auch nicht verwendete Methoden und Felder entfernen eingebundenen Bibliotheken: https://developer.android.com/studio/build/shrink-code.html

-Code Schrumpfen ist mit ProGuard möglich , die unbenutzte Klassen, Felder, Methoden und Attribute aus Ihrer gepackten App erkennt und entfernt, einschließlich derer aus den enthaltenen Codebibliotheken (wodurch es ein wertvolles Tool zum Arbeiten an der 64K Referenzgrenze ist).

(Hervorhebung von mir)

Wenn Sie es möchten, manuell tun, dann unten ist mein Versuch Guave am Strippen nur zu verlassen, von HashBiMap benötigt Abhängigkeiten. Es sieht so aus, als ob es auf viele Klassen angewiesen ist. Denken Sie auch daran, dass Proguard auf der Byte-Ebene funktioniert, so dass das Entfernen von Klassen niemals so effizient funktioniert wie das Entfernen von nicht verwendetem Code mit Proguard.

Ich verwendete jdeps von Java 9 JDK, um alle von HashBiMap verwendeten Abhängigkeiten zu finden, die BiMap Schnittstelle implementiert. Dies zeigt, dass es rekursiv von 35% des gesamten Guava-Jar abhängt (eigentlich 666 Klassen von 1852 im Jar) - ganz zu schweigen von den java.base-Klassen. Die neu gepackte JAR-Datei hat 903 KB, während die ursprüngliche JAR-Datei 2,5 MB (guava-23.0-rc1-android.jar) hat.

Below Skript, das ich verwendet (Ich habe auch getestet resultierende Glas in Beispiel android app):

# 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 * 

und Beispieltestcode:

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