手机生成ODEX提升开机速度的原因

手机生成ODEX提升开机速度的原因:


一:什么是odex
                 odex是安卓上的应用程序apk中提取出来的可运行文件,是通过apk安装包的中的dex优化过的,再把apk包里的dex文件删除。这样做可以加快软件的启动速度, 预先提取,减少对RAM的占用,因为没有odex的话,系统要从apk包中提取dex再运行。

什么是dalvik-cache.
     当Android启动时,DalvikVM监视所有的程序(APK文件)和框架,并且为他们创建一个依存关系树。DalvikVM通过这个依存关系树来为每个程序优化代码并存储在Dalvik缓存中。这样,所有程序在运行时都会使用优化过的代码。这就是当你刷一个新ROM时,有时候第一次启动时间非常非常长的原因。当一个程序(或者框架库)发生变更,DalvikVM将会重新优化代码并且再次将其存在缓存中。在cache/dalvik-cache是存放system上的程序生成的dex文件,而data/dalvik-cache则是存放data/app生成的dex文件。而做Deodex的会在cache/dalvik-cache是产生存放system上的程序生成的dex文件


         所谓Odex,是由android软件中的classes.dex生成的,Odex化即是把那个文件预先提取出来作用是能加快软件加载速度和开机速度。不过Odex也有缺点,那就是有时候加刷东西会出现问题。看懂了吗?

         我的理解,简单说,原本系统每次执行APK都需要先提取一部分出来,而Odex化就是现在你提前把它提取出来了。系统启动或者程序运行加快的原因也就在此。而由于提取了Odex出来,会占用一部分存储空间,所以做Odex化的时候需要考虑空间方面的问题。


Odex的优点:
1.刷完机首次进入系统的时间会缩短一些。文件的运行速度应该也有所提升。
2.APK文件不能单独安装,并且如果反编译APK文件,一般也只能得到资源文件。可以说是起到一定的保护作用,
避免被肆意修改和使用。这样做可以使其厂商保证一定的反盗版,因为没有没有dex文件的apk是无法正常安装的。

3.会增加一些可安装应用的空间,虽然不是很多。(这个我没发现)


Odex的缺点:
1.不方便修改ROM以及文件本身。
2.增加ROM包的体积,虽然不是很多。
3.当你升级某个被Odex的应用后,这个应用将会出现故障,最常见的就是FC。


而现在的定制rom之所以基本上都是deodex化(无odex文件)的是因为:
1. 可以适当减小文件的体积,起到节省rom空间的作用;
2.主要方便rom定制者对rom的个性化定制和移植;apk相对容易反编译和修改,而odex先要解包成smali然后才能生成classes.dex,
如果要再生成odex,还要用dexopt-wrapper,比较麻烦。


二:手机某个APK需要生成ODEX和不需要生成的方法为

LOCAL_DEX_PREOPT := ture 

LOCAL_DEX_PREOPT := false


三:手机提升按照APK速度的修改,但是会引发一些第三方APK应用过程出问题现在,值得关注

device/mediatek/common/device.mk

+#PRODUCT_PROPERTY_OVERRIDES += \

+#  dalvik.vm.dex2oat-filter=interpret-only \

+#  dalvik.vm.image-dex2oat-filter=speed


四:手机如何编译的时候提取ODEX文件


1 预编译提取apk的odex文件,请在BoardConfig.mk中定义:
WITH_DEXPREOPT := true

打开这个宏之后,无论是有源码还是无源码的预置apk预编译时都会提取odex文件。
(如有发现user版本未提取odex,请检查device.mk文件配置:
   ifeq ($(TARGET_BUILD_VARIANT),user)
       WITH_DEXPREOPT := true
       DONT_DEXPREOPT_PREBUILTS := true  //此句注释掉
   endif 



对于64bit的芯片,若apk只有32bit的lib或者只能作为32bit运行,请在预置apk时在android.mk中添加下边的TAG标记此apk为32bit:
LOCAL_MULTILIB :=32

 


2 若需要在预编译时跳过一些apk的odex提取,可以使用下边的方法:
\build\core\dex_preopt_odex_install.mk中添加:
ifeq ($(LOCAL_MODULE),helloworld)
LOCAL_DEX_PREOPT:=
endif
build_odex:=
installed_odex:=

....

Ifeq包起来的部分为需要添加的,helloworld可替换为需要跳过提取odex的apk的LOCAL_MODULE名字
注意:
打开WITH_DEXPREOPT 的后,预置太多apk,会导致system.img 过大,而编译不过。遇到这种情况请调大system.img的大小限制。
 

 
-------------------  more in   Android N   ----------------------
 
N版本当中如果预置了GMS包,则对无源码的APK不做预编译处理。如果需要都做,需要在如下代码做修改:
 
路径:/device/mediatek/common/BoardConfig.mk
......
ifeq ($(BUILD_GMS),yes)
DONT_DEXPREOPT_PREBUILTS := true   ------------------>请把此处关掉,即赋值false。
else
ifeq ($(TARGET_BUILD_VARIANT),userdebug)
DEX_PREOPT_DEFAULT := nostripping
endif
endif
......
 
修改完后,dex2oat操作即在编译时完成,不会影响开机时间。
 
补充说明:Android N中平台添加该特性,是因为WITH_DEXPREOPT := true打开这个之后,就会将有源码以及无源码的所有预置APK在host上做预编译并且塞到system partition中。


但由于內部project storage size的限制,这些预置APK做完dexpreopt之后会超过system partition的size. 因此选择一个折中方案,即加上限制,

对于无源码的APK(ex: GMS)不做dexpreopt的行为。如果客户的system partition足够大塞的下这些预编译完的内容,可以把这段代码拿掉也不会有什么影响。



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值