在源码环境下,使用mm命令编译module,APK会输出到out/target/product/product_name目录下。java
mm -B:强制从新编译,至关于clean后再编译。android
Dalvik缓存
JIT(Just-in-time)实时编译,运行的时候将字节码翻译成机器码,所运行的目标(dex)与硬件平台无关,APP运行效率低。
bash
ARTapp
AOT(Ahead-Of-Time,预先编译),运行前将字节码翻译成机器码,所运行的目标文件(oat)与硬件平台相关。APP运行效率高,可是会占用空间,APK安装所需时间增长。
工具
odex是干什么的优化
dalvik时代:apk运行的时候,会把Apk中的classes.dex解压出来并经过dexopt优化为.odex文件。缓存在/data/dalvick-cache目录下,提升后续执行的效率。ui
ART时代:APK安装的时候,会把APK中的classes.dex解压后,经过dex2oat工具转换为.odex文件(ELF格式),存储在apk所在的目录的oat目录下。this
一、进入AOSP系统App目录,下面以Calculator为例spa
cd android6.0/packages/apps/Calculator复制代码
二、在sublime中打开该项目
subl .复制代码
三、查找须要修改的文件,这里以Calculator.java为例
Ctrl+P复制代码
而后输入Calculator.java
四、查找须要修改的方法,这里以onCreate方法为例
Ctrl+P复制代码
而后在输入@onCreate
五、进行代码的修改而且保存该文件,在onCreate方法中加一个log
Log.wtf("hpp", "this is my first log");复制代码
六、进行命令执行下面命令编译该项目
mm复制代码
七、编译完成以后,经过Install:关键字定位编译输出的文件
咱们能够看到生成了一个Calculator.apk 和 一个Calculator.odex
进入这两个文件所在的目录
nautilus $(gettop)/out/target/product/generic/system/app/Calculator/Calculator.apk复制代码
咱们会发现Calculator.apk文件中只有资源文件没有代码,代码其实就是这个单独的Calculator.odex。
优势:
一、下降系统更新后启动的时间
为odex的Rom。首次开机的过程会执行odex操做,编译时作,开机的时候就不用作了。
二、减小在设备上进行odex操做所形成的空间浪费
编译时,dexopt/dex2oat,会直接将APK的资源与代码拆开,若是在设备上安装时dexopt/dex2oat,apk的大小不会减小,但又会多一个odex文件占据磁盘空间。
缺点:
一、增长开发时编译的时间
二、不能直接执行APK的install操做,须要将APK和odex都sync到设备上。
LOCAL_DEX_PREOPT = false复制代码
## eng ##
ifeq ($(TARGET_BUILD_VARIANT), eng)
tags_to_install := debug eng
# 关闭odex优化
WITH_DEXPREOPT := false复制代码
adb install -r $(gettop)/out/target/product/generic/system/app/Calculator/Calculator.apk复制代码
运行Calculator应用,过滤log
adb logcat -s 'hpp'复制代码
参考视频:
https://www.365yg.com/i6436850885292196353#mid=1565254704995330
https://www.365yg.com/i6436851843262841346/#mid=1565254704995330
https://www.365yg.com/i6436852898566504962/#mid=1565254704995330
https://www.365yg.com/i6436853799767245314/#mid=1565254704995330