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