写在20110906:编译系统、odex

编译源代码的时候会要执行下面的命令:
1.source build/envsetup.sh
envsetup.sh这个编译脚本就位于/build/envsetup.sh中
2.choosecombo根据这个脚本中会让用户选择user/eng模式。
    要了解Android编译选项eng、user和userdebug的区别,需先了解下LOCAL_MODULE_TAGS这个配置项,在之前的博客中有提到过,该配置项处于Android.mk文件中,一般配置形式为LOCAL_MODULE_TAGS := user eng optional test那么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()函数中添加export DISABLE_DEXPREOPT=true来避免

function set_stuff_for_environment()
{
    settitle
    setpaths
    set_sequence_number

   # Don't try to do preoptimization until it works better on OSX.
    export DISABLE_DEXPREOPT=true
 
    export ANDROID_BUILD_TOP=$(gettop)
}

  odex是同名apk经系统优化后的dex文件,原生ROM中apk和odex文件是配对的,对应的apk文件中没有了dex(比正常可安装的apk小)。
这样的好处:
    1.加快程序的装载与运行
    2.防止系统程序的简单复制,针对不同的ROM,odex文件是变化的,不可混用的,否则程序就不能政策运行。与odex配对的apk文件又因为缺少dex无法单独安装和使用。
    3.节省data分区资源(这个我的理解是原始apk解压需要占用data分区资源,odex可直接执行)

猜你喜欢

转载自meohao.iteye.com/blog/1906339