写在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可直接执行)