禁用dexpreopt构建独立的Android模块

10

我的论文中,我正在修改Android框架并构建源代码(4.1.1 Jelly Bean)。我可以进行完整的构建,但由于这需要很长时间(我正在虚拟机上使用ubuntu 12.04 64位),所以我希望构建单独的模块。

例如: 当对位置模块进行更改时,应该只需构建已更改的模块,并创建新的系统映像:

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不匹配。

'make snod' 中的build/core/makefile也会给出警告:'警告:启用dexpreopt后,您可能需要进行完全重建。',这来自于makefile中的此行代码:

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

这让我认为$WITH_DEXPREOPT变量未正确设置或读取?到目前为止,我无法获得可启动的系统映像,而不进行完全重建。我遵循的禁用dexpreopt的程序是否正确,或者在对框架进行更改并获取新的系统映像后构建单独的模块是否有其他方法?

生成目标为“full-eng”。

1个回答

12

显然,WITH_DEXPREOPT环境变量被一个内部的WITH_DEXPREOPT变量覆盖。

build/target/board/generic/BoardConfig.mk

将其更改为false,或者根据Google Groups的人们所说,开始进行以下操作:
make showcommands WITH_DEXPREOPT=false

这个方法很管用。现在构建一个特定的模块并制作新的系统映像,就可以得到可启动的构建。

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


1
谢谢!由于某些原因,即使进行了干净的重建,源代码中的更改也没有在模拟器中反映出来。在make clean和install之后设置变量可以纠正它。然而,当我对代码进行另一个更改时,使用了mmm framework/base,然后进行make snod,模拟器无法启动(意味着它卡在“android”屏幕上)。在使用make showcommands WITH_DEXPREOPT=false进行干净构建后,您的确切命令是什么?您是否使用过make snod或每次进行更改时都持续使用WITH_DEXPREOPT=false? - user1832953
1
我没有使用make showcommands WITH_DEXPREOPT=false命令进行测试,我只是在BoardConfig.mk中进行了更改,然后进行了make clean和完整的重建。从这个点开始,在例如位置模块中进行更改后,在'mmm frameworks/base'和'make snod'之后构建中仍然保留。如果您的模拟器无法启动,请使用“adb logcat”来确定问题所在。 - b74ckb1rd
有没有任何可能将此更改限制在特定应用程序列表中?(我不寻找在每个应用程序的mk文件中单独完成的LOCAL_DEXPREOPT解决方案)。 - psykid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接