android 64K/65K问题 简单记录
2016-08-03 本文已影响0人
小面包屑
到底是65k还是64k?
都没错,同一个问题,不同的说法而已。
65536按1000算的话,是65k ~ 651000;
65536按1024算的话,是64k = 641024。
方法数不能超过65536 , 2的16次方。因为在Dalvik指令集里面,执行方法的invoke-kind index 大小只给了16bit 。
使用了Google提供的解决方案, MultiDex 。 (另一个方法: compiling with Jack toolchain )
一般apk解压之后只有一个class.dex文件,使用了MultiDex之后有两个、三个 或者 N个。
编译过程:
sourceCode ---Java Complier ---> .class Files ---Dex--> .dex files (class.dex)
Application.attachBaseContext 执行MultiDex.install() 。
首次启动会对 class.dex/class2.dex文件执行 dexopt操作,生成ODEX文件。
非首次启动则直接从cache中读取已经执行过dexopt的ODEX文件。
问题:
安装时间长。
执行时间过长会出现ANR。
兼容性为android 4.0 以上。
5.0以后的机器,ART会把多个dex合并成oat文件。
android 2.2 或 2.3 的缓存只有5M,4.x提高到了8m或者16m
异步动态加载方案:
增加一个process(进程)来异步加载dex,在attachBaseContext里面轮询,看是否进程存在,是否已经加载完成。
加载完成后,进入Application的onCreated() 方法。