写在20110906:编译系统、odex

编译源代码的时候会要执行下面的命令:

1.sourcebuild/envsetup.sh

envsetup.sh这个编译脚本就位于/build/envsetup.sh中

2.choosecombo根据这个脚本中会让用户选择user/eng模式。

要了解Android编译选项eng、user和userdebug的区别,需先了解下LOCAL_MODULE_TAGS这个配置项,在之前的博客中有提到过,该配置项处于Android.mk文件中,一般配置形式为LOCAL_MODULE_TAGS:=userengoptionaltest那么LOCAL_MODULE_TAGS设置为不同的值有什么作用呢?

user:只有在user版本时该模块才被编译进去;

eng:只有在eng版本时该模块才被编译进去;

test:只有在test版本时该模块才被编译进去;——用得很少

optional:在所有版本中该模块都被编译进去。

当然其中的值也可以设置多选,那么eng、user、userdebug它们的区别在哪里呢?

选择不同的模式,编译到系统中的内容会有所区别,一般user模式下,一个应用模块会被打包成apk和odex;在eng模式下,只会生成一个apk文件。那么odex文件很明显是被优化过的文件,但有时候优化之后也会产生一些异常,通常可以在配置文件envsetup.sh中set_stuff_for_environment()函数中添加exportDISABLE_DEXPREOPT=true来避免

functionset_stuff_for_environment()

{

settitle

setpaths

set_sequence_number

#Don'ttrytodopreoptimizationuntilitworksbetteronOSX.

exportDISABLE_DEXPREOPT=true

exportANDROID_BUILD_TOP=$(gettop)

}

odex是同名apk经系统优化后的dex文件,原生ROM中apk和odex文件是配对的,对应的apk文件中没有了dex(比正常可安装的apk小)。

这样的好处:

1.加快程序的装载与运行

2.防止系统程序的简单复制,针对不同的ROM,odex文件是变化的,不可混用的,否则程序就不能政策运行。与odex配对的apk文件又因为缺少dex无法单独安装和使用。

3.节省data分区资源(这个我的理解是原始apk解压需要占用data分区资源,odex可直接执行)

相关推荐