MultiDex - HAW-Hamburg Software Development Support

Transcription

MultiDex - HAW-Hamburg Software Development Support
Hamburg, 18. November 2k14
MultiDex
Was ist Dex(Dalvic Executable)/Multidex?
Multidex wird benötigt, wenn eine Android .apk mehr als 65536 referenzierte Methoden hat.
Als Beispiel wird die Akka lib eingebunden, dadurch wird das Maximum überschritten und die .apk
kann nicht erstellt werden.
Beispiel
HAW New Storytelling
1
Sefai Sari, Alexander Holland
Wie kann ich MultiDex aktivieren?
Offizielle Android Empfehlung
https://developer.android.com/tools/building/multidex.html
AndroidManifest anpassen
AndroidManifest.xml
<application
...
android:name="android.support.multidex.MultiDexApplication">
Gradle anpassen(build.gradle im app Verzeichnis)
android
{
...
dexOptions
{
preDexLibraries = false
}
...
}
...
afterEvaluate {
tasks.matching {
it.name.startsWith("dex")
}.each { dx ->
if (dx.additionalParameters == null) {
dx.additionalParameters = []
}
dx.additionalParameters += "--multi-dex"
dx.additionalParameters += "--main-dex-list=$projectDir/main-dex-list.txt".toString()
}
HAW New Storytelling
2
Sefai Sari, Alexander Holland
Workarounds(nur teilweise getestet => erfolglos)
Wer etwas mit der dx.bat spielen will, hier ist der Pfad
AndroidSDK\build-tools\"target-version"\dx.bat
Eine Idee war es die dx.bat durch eine eigene dx.bat auszutauschen sodass die echte dx.bat
mit angepassten multidex Parametern von der eigenen dx.bat ausgeführt wird.
Sobald die IDE einen compile durchführt, wird die angepasste dx.bat ausgeführt, die
Parameter angepasst und die echte dx.bat gestartet.
Bei dieser Methode müsste der multidex Parameter hinzugefügt werden und der Output
path angepasst werden siehe(Bild oben).
Testen mit Eclipse
Wir haben bei allen Android Versionen die installiert waren die dx.bat Dateien zu dxAny.bat
umbenannt und eclipse konnte trotzdem noch kompilieren... Vermutung ist das direkt die
dx.jar angesprochen wird die in dem lib Ordner des jeweiligen dx.bat Verzeichnisses liegt.
Testen mit IntelliJ
Bei IntelliJ wird ein Fehler geworfen, dies lag daran das die dx.bat nicht korrekt angepasst
wurde. Das IntelliJ die dx.bat ausführt kann an dem Plugin liegen das wir bei unserem
Projekt benutzten, da wir nicht genau wissen wie da die Abhängigkeiten sind und keine
eigene dx.bat hatten die so funktioniert wie oben beschrieben haben wir hier nichts weiteres
getestet.
Falls die angepasste dx.bat einen "pause" Befehl enthält wird das Kompilieren von IntelliJ
nicht abgebrochen und das cmd Fenster zur dx.bat ist auch nicht zu sehen => Prüfen welche
Parameter dran gehängt werden konnte zu Test Zwecken auch nicht eingesehen werden...
Das ganze wurde nur sehr kurz getestet, der Aufwand wäre zu groß und das Gradle Projekt
war bereits fast fertig.
Die Idee wird hier in einer besseren Variante vorgeschlagen, wurde von uns aber nicht
getestet.
http://stackoverflow.com/questions/19955297/how-can-i-use-the-multi-dex-option
.../sdk/build-tools/19.0.3/dx
replacing the last line: exec java $javaOpts -jar "$jarpath" --multi-dex "$@"
Es wär schön, wenn man dies mit dem Android-sbt-plugin kombinieren könnte.
Dann könnte man sich Gradle sparen und auf sbt umsteigen.
Was genau die Einstellung preDexLibraries = false
in Gradle ausmacht wissen wir nicht, diese sollte auch beachtet werden!
Bei den Versionsinfos zum Android-sdk-plugin stand das diese Funktion standardmäßig
deaktiviert ist. Dies könnte in anderen fällen zu Problemen führen....
HAW New Storytelling
3
Sefai Sari, Alexander Holland
Weitere Quellen zu möglichen workarounds
http://blog.osom.info/2014/10/multi-dex-to-rescue-from-infamous-65536.html
Möglicher workaround ohne multidex?
http://android-developers.blogspot.de/2011/07/custom-class-loading-in-dalvik.html
HAW New Storytelling
4
Sefai Sari, Alexander Holland

Similar documents