请参考以下修改。
先做第一步,如果第一步做完后没有改善,则继续做第二部。
1 可以先关闭我们的优化测试看看是否ok
MTK_ART_OPT_ENABLE := false (device.mk or Android.common_build.mk)
2 如果还有些影响,直接将art搞成interpret-only(Disable AOT)
命令测试的方法为:
adb shell stop
adb shell rm -rf /data/dalvik-cache/*
adb shell setprop dalvik.vm.dex2oat-filter interpret-only
adb shell setprop dalvik.vm.image-dex2oat-filter interpret-only
adb shell start
代码里面修改的的方法为:
in product’s device.mk:
PRODUCT_PROPERTY_OVERRIDES += \
dalvik.vm.dex2oat-filter=interpret-only \
dalvik.vm.image-dex2oat-filter=interpret-only
谢谢~
"在8Grom 1G ram 上MTK_ART_OPT_ENABLE开关打开是否合适?适合的Ram是多大?谢谢。"
-->这个宏在512RAM上可以关闭,其它情况下请打开,thanks
Dear Friends,
如电话沟通所述,请测试:
1、代码里面改的in product’s device.mk,将dalvik.vm.dex2oat-filter分别采用balanced以及time测试一下:
PRODUCT_PROPERTY_OVERRIDES += \
dalvik.vm.dex2oat-filter=balanced or time\
dalvik.vm.image-dex2oat-filter=speed
kBalanced// Try to get the best performance return on compilation investment.
Time // Compile methods, but minimize compilation time.
2、另外,考虑到贵司512RAM上有预置GMS包,建议DONT_DEXPREOPT_PREBUILTS := true
• DONT_DEXPREOPT_PREBUILTS 只是不做 prebuilt (就是只有 apk、但是沒有 source code) 的預編譯,其它的 framework / app 都還有做
JVM是java虚拟机
Dalvik 是google虚拟机
Java字节码: .class 文件,单个文件对应
Dalvik 字节码: .dex 文件,多个文件合并组成。.odex 是dex的优化
Dalvik 运行时将dex 字节码翻译成本地机器码,即JIT(运行时)
ART直接运行本地机器码,是在应用安装的时候通过dex2oat将dex翻译成本地机器码,为oat。Oat文件是一种特殊的ELF文件,包含本地机器码还包含原dex文件内容。Oat是将多个dex文件合并输入再由art运行时在安装的时翻译成本地机器码然后再打包转换输出就可以了。
Android Runtime(缩写为 ART),是一种在Android操作系统上的运行环境,由Google公司研发,并在2013年作为Android 4.4系统中的一项测试功能正式对外发布,在Android 5.0及后续Android版本中作为正式的运行时库取代了以往的Dalvik虚拟机。ART能够把应用程序的字节码转换为机器码,是Android所使用的一种新的虚拟机。它与Dalvik的主要不同在于:Dalvik采用的是JIT技术,而ART采用Ahead-of-time(AOT)技术。 ART同时也改善了性能、垃圾回收(Garbage Collection)、应用程序除错以及性能分析。
在应用程序启动时,JIT通过进行连续的性能分析来优化程序代码的执行,在程序运行的过程中,Dalvik虚拟机在不断的进行将字节码编译成机器码的工作。 与Dalvik虚拟机不同的是,ART引入了AOT这种预编译技术,在应用程序安装的过程中,ART就已经将所有的字节码重新编译成了机器码。应用程序运行过程中无需进行实时的编译工作,只需要进行直接调用。因此,ART极大的提高了应用程序的运行效率,同时也减少了手机的电量消耗,提高了移动设备的续航能力,在垃圾回收等机制上也有了较大的提升。 为了保证向下兼容,ART使用了相同的Dalvik字节码文件(dex),即在应用程序目录下保留了dex文件供旧程序调用然而.odex文件则替换成了可执行与可链接格式(ELF)可执行文件。一旦一个程序被ART的dex2oat命令编译,那么这个程序将会指通过ELF可执行文件来运行。因此,相对于Dalvik虚拟机模式,ART模式下Android应用程序的安装需要消耗更多的时间,同时也会占用更大的储存空间(指内部储存,用于储存编译后的代码),但节省了很多Dalvik虚拟机用于实时编译的时间。
andorid6.0代码打开了WITH_DEXPREOPT 的时候会按照帖子说的在/system/app/目录下面有一个oat文件里面有优化的.odex文件。但是/data/dalvik-cache/arm目录下面没有对应的.dex文件,意味着也许偏移量=0了?并且apk包里面也没有class.dex,可能是按照文章中说的优化的很彻底了。
但是当我关闭WITH_DEXPREOPT 的时候,在/data/dalvik-cache/arm下面会有对应的.dex文件产生,这无可厚非 ,但是当我用16进制将这个.dex文件和打开WITH_DEXPREOPT 时候在/system/app/目录下面优化的.odex文件进行对比的时候发现这两个文件差别很大。
什么是ART:
Android操作系统已经成熟,Google的Android团队开始将注意力转向一些底层组件,其中之一是负责应用程序运行的Dalvik运行时。Google开发者已经花了两年时间开发更快执行效率更高更省电的替代ART运行时。 ART代表Android Runtime,其处理应用程序执行的方式完全不同于Dalvik,Dalvik是依靠一个Just-In-Time (JIT)编译器去解释字节码。开发者编译后的应用代码需要通过一个解释器在用户的设备上运行,这一机制并不高效,但让应用能更容易在不同硬件和架构上运 行。ART则完全改变了这套做法,在应用安装时就预编译字节码到机器语言,这一机制叫Ahead-Of-Time (AOT)编译。在移除解释代码这一过程后,应用程序执行将更有效率,启动更快。
ART优点:
1、系统性能的显著提升。
2、应用启动更快、运行更快、体验更流畅、触感反馈更及时。
3、更长的电池续航能力。
4、支持更低的硬件。
ART缺点:
1、更大的存储空间占用,可能会增加10%-20%。
2、更长的应用安装时间。
总的来说ART的功效就是“空间换时间”。
从 arm 目录里拿到 boot.oat 和 services.odex
Java -jar oat2dex.jar boot boot.oat; 这会在 boot.oat 所在目录下生成 dex odex 两个子目录
java -jar oat2dex.jar services.odex dex/ ; 生成 services.dex
java -jar baksmali.jar -a 22 -b -s services.dex -o services
java -jar smali.jar -a 22 -j 1 -o classes.dex services
最后生成 services.jar:jar -cvf services.jar classes.dex
1:
java -jar oat2dex.jar odex system/priv-app/Settings/oat/arm/Settings.odex
从oat --> dex
2:
java -jar oat2dex.jar smali Settings.odex
从oat --> smali 生成反编译文件
3:
java -jar oat2dex.jar smali Settings.dex (1:中生产的dex)
从dex --> smali 生成反编译文件 (生成结果与2:一样)