Mój zespół i ja niedawno osiągnęliśmy referencje do metody 64K w naszej aplikacji, która jest maksymalną liczbą obsługiwanych w pliku dex. Aby obejść to ograniczenie, musimy podzielić część programu na wiele dodatkowych plików dex i załadować je w czasie wykonywania.
Obserwowaliśmy wpis na blogu wymieniony w pytaniu o stary, oparty na Antach system kompilacji i wszystko działało dobrze. Ale ostatnio poczuliśmy potrzebę przejścia do nowego systemu kompilacji opartego na systemie Gradle.
Ta odpowiedź nie ma na celu zastąpienia całego postu na blogu pełnym przykładem. Zamiast tego po prostu wyjaśni, jak używać Gradle do ulepszenia procesu budowania i osiągnięcia tego samego. Należy pamiętać, że jest to prawdopodobnie tylko jeden sposób, aby to zrobić i jak obecnie robimy to w naszym zespole. Nie musi to oznaczać, że jest to tylko metoda.
Nasz projekt jest trochę inny i ten przykład działa jako indywidualny projekt Java, który skompiluje cały kod źródłowy do plików .class, zmontuje je do pojedynczego pliku .dex i na koniec zapakuje ten plik .dex do pliku .jar.
Zacznijmy ...
w korzeniu build.gradle mamy następujący fragment kodu, aby zdefiniować kilka domyślnych:
ext.androidSdkDir = System.env.ANDROID_HOME
if(androidSdkDir == null) {
Properties localProps = new Properties()
localProps.load(new FileInputStream(file('local.properties')))
ext.androidSdkDir = localProps['sdk.dir']
}
ext.buildToolsVersion = '18.0.1'
ext.compileSdkVersion = 18
Musimy powyższy kod bo chociaż przykładem jest indywidualny projekt Java, nadal musimy używać komponentów z zestawu SDK systemu Android. I będziemy także potrzebować niektórych innych właściwościach później ... Tak, na build.gradle głównego projektu, mamy tę zależność:
dependencies {
compile files("${androidSdkDir}/platforms/android-${compileSdkVersion}/android.jar")
}
Jesteśmy również uproszczenie zestawy źródłowe ten projekt, który może nie być konieczne dla danego projektu:
sourceSets {
main {
java.srcDirs = ['src']
}
}
Dalej, możemy zmienić domyślną konfigurację Wbudowany jar
zadanie, aby dołączyć plik zamiast wszystkich plików .class classes.dex:
configure(jar) {
include 'classes.dex'
}
Teraz musimy mieć nowe zadanie, które faktycznie zgromadzi wszystkie pliki .class do jednego pliku .dex. W naszym przypadku musimy również dołączyć plik JAR biblioteki Protobuf do pliku .dex.Więc jestem w tym, że w tym przykładzie:
task dexClasses << {
String protobufJarPath = ''
String cmdExt = Os.isFamily(Os.FAMILY_WINDOWS) ? '.bat' : ''
configurations.compile.files.find {
if(it.name.startsWith('protobuf-java')) {
protobufJarPath = it.path
}
}
exec {
commandLine "${androidSdkDir}/build-tools/${buildToolsVersion}/dx${cmdExt}", '--dex',
"--output=${buildDir}/classes/main/classes.dex",
"${buildDir}/classes/main", "${protobufJarPath}"
}
}
Ponadto, upewnij się, że masz następujące import gdzieś (zazwyczaj na górze, oczywiście) na build.gradle plik:
import org.apache.tools.ant.taskdefs.condition.Os
Teraz musimy wykonać zadanie jar
zależne od naszego zadania dexClasses
, aby się upewnić, że nasze zadanie zostanie wykonane przed złożeniem ostatecznego pliku .jar. Robimy to za pomocą prostego wiersza kodu:
jar.dependsOn(dexClasses)
I skończymy ... Wystarczy powołać Gradle ze zwykłymi assemble
zadania i ostatecznego pliku .jar, ${buildDir}/libs/${archivesBaseName}.jar
będzie zawierać pojedynczy classes.dex plik (oprócz pliku MANIFEST.MF). Po prostu skopiuj go do folderu aktywów swojej aplikacji (możesz zawsze zautomatyzować to za pomocą programu Gradle, ale to już jest poza zakresem tego pytania) i śledzić resztę posta na blogu.
Jeśli masz jakieś pytania, po prostu krzycz w komentarzach. Spróbuję pomóc jak najlepiej moim umiejętnościom.
Czy chcesz mieć jakiś wkład w http://stackoverflow.com/questions/18629021/safe-way-to-migrate-fegr- existing-eclipse-built-android-project-to-ant-build? Dzięki. –
Kompleksowe i bardzo przydatne. Oczywiście, jesteś zajęty, ale byłby to znaczący wkład jako publiczne repozytorium github :) Dzięki za szczegółowe informacje. –
configure (jar) { zawiera "classes.dex" } nie działa dla mnie - pojawia się błąd: "Wystąpił problem przy ocenie projektu> Nie można znaleźć właściwości 'jar' w projekcie." – goRGon