Android 源码编译相关知识
如何去编译APK
在源码环境下,使用mm命令编译module. APK会输出到out/target/product/product_name 目录下.
mm -B : 强制重新编译.相当于clean后再编译。
Dalvik与ART的区别
Dalvik:
JIT (Just-in-time)实时编译,运行的时候将字节码翻译成机器码,所运行的目标文 件(dex)与硬件平台无关,APP运行效率较低.
ART:
AOT(Ahead-Of-Tlme-预先编译),运行前将字节码翻译成机器码,所运行的目标文 件(oat)与硬件平台相关.APP运行效率高,但会占用空间.APK安装所需时间增加.
odex是干什么的
dalvik时代:APK运行的时候,会把APK中的classes.dex解压出来并通过dexopt优化为 成.odex文件,缓存在/data/dalvick-cache目录下,提高后续执行的效率.
ART时代:APK安装的时候,会把APK中的classes.dex解压后,通过dexioat工具转化 为.odex文件(ELF格式),存储在apk所在目录的oat目录下
为么在编译环境下就产出了odex文件
ROM:apk、jar、bin、so文件组成
优点:
1、 降低系统更新后启动的时间·
未odex的Rom.首次开机的过程中会执行“odex操作。编译时做,廾机时候就不用做了·
2,减少在设备上进行“odex”操作所造成的空间浪费·
编译时dexopt/dex2oat,会直接将APK的资源和代码拆开,如果在设备上安装时进行,apk大小不会减少,但又会多一个odex文件占据磁盘空间
缺点:
1、 增加编译时间
2、 不能在shell环境中直接执行install操作,需要将APK和odex都sync到设备上
如何在编译的时候关闭dex2oat
在当前的module中的Android.mk文件中配置
LOCAL_DEX_PREOPT = false
关闭所有的module的dex优化
在build/core/main.mk文件中配置 ## eng ## Ifeq($(TARGET_BUILD_VERIANT),eng) Tags_to_install :=debug eng #关闭odex优化 WITH_DEXPREOPT := false