2012-10-30 6 views
10

Für meine Diplomarbeit, modifiziere ich das Android-Framework und den Aufbau der Quelle (4.1.1 Jelly Bean). Ich kann einen vollständigen Build erstellen, aber weil das sehr zeitaufwändig ist (ich entwickle auf einer virtuellen Ubuntu 12.04 64bit Maschine), würde ich gerne separate Module bauen.Bauen separate Android-Module mit Dexpreopt deaktiviert

Zum Beispiel: Wenn Änderungen an den Standort Module zu tun, soll es möglich sein, nur das geänderte Modul zu bauen und ein neues System Bild machen:

mmm frameworks/base 
make snod 

Aber das funktioniert nicht. Jedes Mal, wenn ich zu booten versuchen, wird das neue System Bild wegen nicht booten:

I/dalvikvm(1696): DexOpt: mismatch dep signature for '/system/framework/framework.odex' 

Nach einigen Recherchen habe ich versucht, dexpreopt mit den Umgebungsvariablen

export $WITH_DEXPREOPT=false 

und

export $DISABLE_DEXPREOPT=true 
zu deaktivieren

und eine vollständige Neuerstellung mit 'make installclean' durchführen. Die vollständige Neuerstellung funktioniert und die Änderungen am Framework sind im Build vorhanden. Aber nach einer neuen Änderung führen 'mmm frameworks/base' und 'make snod' immer noch zu Dexpreopt-Mismatch.

Der Build/core/Make-Datei von ‚snod machen‘ gibt auch die Warnung: ‚Achtung: Nur mit dexpreopt aktiviert ist, müssen Sie eine vollständige wieder aufzubauen.‘, Die in der Make-Datei von dieser Linie kommt:

ifeq (true,$(WITH_DEXPREOPT)) 
$(warning Warning: with dexpreopt enabled, you may need a full rebuild.) 
endif 

Das führt zu der Annahme, dass die Variable $ WITH_DEXPREOPT nicht richtig gesetzt oder gelesen wird? Bisher konnte ich kein bootfähiges Systemabbild erstellen, ohne eine saubere vollständige Neuerstellung durchzuführen. Ist das Verfahren, das ich befolge, das richtige, um dexpreopt zu deaktivieren, oder gibt es andere Möglichkeiten, separate Module zu erstellen, nachdem ich Änderungen am Framework vorgenommen und ein neues Systemabbild erstellt habe?

Buildziel ist 'voll-eng'.

Antwort

11

Anscheinend ist der WITH_DEXPREOPT Umgebungsvariable in

durch eine interne WITH_DEXPREOPT variable überschrieben
build/target/board/generic/BoardConfig.mk 

Ändern dies falsch ist, oder nach den Menschen in Google Gruppen, beginnend ein Make mit:

make showcommands WITH_DEXPREOPT=false 

macht den Trick. Das Erstellen eines bestimmten Moduls und das Erstellen eines neuen Systemabbilds führt nun zu einem bootfähigen Build.

(source: https://groups.google.com/d/topic/android-building/vJCkg8Yq9Ic/discussion)

+1

Vielen Dank! Aus irgendeinem Grund wurden Änderungen im Quellcode auch nach einer sauberen Neuerstellung nicht im Emulator wiedergegeben. Das Setzen der Variablen nach einem make clean und der Installation hat es korrigiert. Als ich jedoch eine weitere Änderung an dem Code vorgenommen habe, mmmm framework/base verwendet habe und dann snod gemacht habe, würde der Emulator nicht booten (was bedeutet, dass er auf dem "android" -Bildschirm hängen geblieben ist). Was waren Ihre genauen Befehle nach einem clean Mit make make showcommands erstellen WITH_DEXPREOPT = false? Haben Sie make snod überhaupt benutzt oder verwenden Sie WITH_DEXPREOPT = false jedes Mal, wenn Sie Änderungen vorgenommen haben? –

+1

Ich habe es nicht mit make make showcommands WITH_DEXPREOPT = false getestet, ich habe es in BoardConfig geändert. mk und machte eine saubere und eine vollständige Neuerstellung.Von diesem Punkt an Änderungen in zum Beispiel das Standort-Modul in der Build nach einem 'mmm frameworks/base' und 'make snod' beibehalten. Wenn Ihr Emulator nicht startet, überprüfen Sie mithilfe von "adb logcat" das Problem. – b74ckb1rd