Создание отдельных модулей Android с отключенным dexpreopt

Для своей диссертации я модифицирую инфраструктуру Android и создаю исходный код (4.1.1 Jelly Bean). Я могу сделать полную сборку, но поскольку это занимает очень много времени (я разрабатываю на 64-битной виртуальной машине Ubuntu 12.04), я хотел бы собрать отдельные модули.

Например: при внесении изменений в модули местоположения должна быть возможность просто собрать измененный модуль и создать новый образ системы:

mmm frameworks/base
make snod

Но это не работает. Каждый раз, когда я пытаюсь загрузиться, новый образ системы не загружается из-за:

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

После некоторых исследований я попытался отключить dexpreopt с переменными среды.

export $WITH_DEXPREOPT=false 

а также

export $DISABLE_DEXPREOPT=true 

и выполнить полную перестройку с помощью «make installclean». Полная пересборка работает, а изменения фреймворка присутствуют в сборке. Но после внесения нового изменения все еще «mmm frameworks/base» и «make snod» приводят к несоответствию dexpreopt.

Сборка/ядро/makefile из «make snod» также содержит предупреждение: «Внимание: при включенном dexpreopt вам может потребоваться полная пересборка», которое следует из этой строки в make-файле:

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

Это наводит меня на мысль, что переменная $WITH_DEXPREOPT неправильно установлена ​​или прочитана? До сих пор мне не удавалось получить загрузочный образ системы без полной полной перестройки. Правильна ли процедура, которой я следую, чтобы отключить dexpreopt, или есть другие способы сборки отдельных модулей после внесения изменений в структуру и получения нового образа системы?

Целью сборки является «полный английский».


person b74ckb1rd    schedule 30.10.2012    source источник


Ответы (1)


По-видимому, переменная среды WITH_DEXPREOPT перезаписывается внутренней переменной WITH_DEXPREOPT в

build/target/board/generic/BoardConfig.mk

Измените это на false или, по словам людей из групп Google, начните make с:

make showcommands WITH_DEXPREOPT=false

делает свое дело. Сборка определенного модуля и создание нового образа системы теперь приводит к загрузочной сборке.

(источник: https://groups.google.com/d/topic/android-building/vJCkg8Yq9Ic/discussion )

person b74ckb1rd    schedule 31.10.2012
comment
Спасибо! По какой-то причине изменения в исходном коде не отражались в эмуляторе даже после чистой сборки. Установка переменной после очистки и установки исправила ее. Однако, когда я внес еще одно изменение в код, использовал mmm framework/base, а затем сделал snod, эмулятор не загружался (это означало, что он застрял на экране Android). Каковы были ваши точные команды после чистой сборки с использованием make showcommands WITH_DEXPREOPT=false? Вы вообще использовали make snod или постоянно использовали WITH_DEXPREOPT=false каждый раз, когда вносили изменения? - person ; 18.11.2012
comment
Я не тестировал его с помощью команды make showcommands WITH_DEXPREOPT=false, я просто изменил его в BoardConfig.mk и сделал make clean и полный ребилд. С этого момента внесение изменений, например, в модуль Location, сохранялось в сборке после «mmm frameworks/base» и «make snod». Если ваш эмулятор не загружается, проверьте с помощью «adb logcat», чтобы точно определить проблему. - person b74ckb1rd; 19.11.2012
comment
возможно ли ограничить это изменение списком конкретных приложений? (Я не ищу решение LOCAL_DEXPREOPT, которое нужно делать в файле mk каждого приложения отдельно). - person psykid; 01.11.2018